概述
FILTER语句从中间结果表中丢弃不符合指定条件的记录。
<filter statement> ::= "FILTER" [ "WHERE" ] <search condition>
FILTER和FILTER WHERE作用一致,使用WHERE通常是出于提高可读性。例如,
MATCH (n:User)
FILTER n.age > 25
RETURN n
在功能上与以下查询一致:
MATCH (n:User)
FILTER WHERE n.age > 25
RETURN n
在这两个例子里,FILTER语句返回用户age大于25的点。
FILTER与MATCH WHERE
FILTER语句和WHERE从句都用来指定查询的过滤条件,二者的差异主要体现在执行的时间和方式。
WHERE是一个从句,只能跟随MATCH语句一起使用。它可以出现在点模式或边模式内部,或是在路径模式列表后马上使用,是图模式匹配的一部分。
MATCH (n:User)
WHERE n.age > 25
RETURN n
FILTER则是一个独立语句,可灵活地在查询中需要的位置使用。
MATCH (n:User)
FILTER n.age > 25
RETURN n
示例图

CREATE GRAPH myGraph {
NODE User ({name string}),
NODE Club ({since uint32}),
EDGE Follows ()-[{createdOn date}]->(),
EDGE Joins ()-[{memberNo uint32}]->()
} PARTITION BY HASH(Crc32) SHARDS [1]
INSERT (rowlock:User {_id: 'U01', name: 'rowlock'}),
(brainy:User {_id: 'U02', name: 'Brainy'}),
(purplechalk:User {_id: 'U03', name: 'purplechalk'}),
(mochaeach:User {_id: 'U04', name: 'mochaeach'}),
(lionbower:User {_id: 'U05', name: 'lionbower'}),
(c01:Club {_id: 'C01', since: 2005}),
(c02:Club {_id: 'C02', since: 2005}),
(rowlock)-[:Follows {createdOn: '2024-01-05'}]->(brainy),
(mochaeach)-[:Follows {createdOn: '2024-02-10'}]->(brainy),
(brainy)-[:Follows {createdOn: '2024-02-01'}]->(purplechalk),
(lionbower)-[:Follows {createdOn: '2024-05-03'}]->(purplechalk),
(brainy)-[:Joins {memberNo: 1}]->(c01),
(lionbower)-[:Joins {memberNo: 2}]->(c01),
(mochaeach)-[:Joins {memberNo: 9}]->(c02)
简单过滤
MATCH (c:Club)
FILTER c._id = "C01"
RETURN c
结果:c
| _id | _uuid | schema | values |
|---|---|---|---|
| C01 | Sys-gen | Club | {since: 2005} |
FOR item IN [1,2,3]
FILTER item > 1
RETURN item
结果:item
| item |
|---|
| 2 |
| 3 |
使用笛卡尔积过滤
本查询返回关注Brainy且是C02成员的用户:
MATCH (u1:User)-[:Follows]->(:User {name: "Brainy"})
MATCH (u2:User)-({_id: "C02"})
FILTER u1 = u2
RETURN u1
结果:u1
| _id | _uuid | schema | values |
|---|---|---|---|
| U04 | Sys-gen | User | {name: "mochaeach"} |
请注意,在FILTER语句过滤结果前,u1和u2会先进行笛卡尔积,因为它们是不同的MATCH产生的。