WHERE
WHERE 子句本身不是一个独立的子句——它是一个与 MATCH、OPTIONAL MATCH 和 WITH 子句一起使用的子子句。
当与 MATCH 和 OPTIONAL MATCH 一起使用时,WHERE 会对所描述的模式添加约束。不应将其视为在匹配完成后进行的过滤。
在存在多个 MATCH / OPTIONAL MATCH 子句的情况下,WHERE 中的谓词始终是紧邻其前的 MATCH / OPTIONAL MATCH 中模式的一部分。如果 WHERE 被放在错误的 MATCH 子句中,结果和性能都可能受到影响。
当在 WITH 之后使用时,WHERE 只是简单地过滤结果。
有关 WHERE 的更多用法,请参阅谓词。 |
示例图
以下示例使用以下图
要在空 Neo4j 数据库中重新创建该图,请运行以下查询
CREATE (andy:Swedish:Person {name: 'Andy', age: 36}),
(timothy:Person {name: 'Timothy', age: 38}),
(peter:Person {name: 'Peter', age: 35}),
(lisa:Person {name: 'Lisa', age: 48}),
(john:Person {name: 'John', age: 40}),
(susan:Person {name: 'Susan', age: 32}),
(andy)-[:KNOWS {since: 2012}]->(timothy),
(andy)-[:KNOWS {since: 1999}]->(peter),
(peter)-[:KNOWS {since: 2005}]->(lisa),
(lisa)-[:KNOWS {since: 2010}]->(john),
(john)-[:KNOWS {since: 2021}]->(susan)
基本过滤
MATCH (n)
WHERE n:Swedish
RETURN n.name AS name
| name |
|---|
|
|
MATCH (n:Person)
WHERE n.age < 35
RETURN n.name AS name, n.age AS age
| name | age |
|---|---|
|
|
行数: 1 |
|
MATCH (:Person {name:'Andy'})-[k:KNOWS]->(f)
WHERE k.since < 2000
RETURN f.name AS oldFriend
| oldFriend |
|---|
|
|
根据动态属性过滤
要使用动态计算的名称过滤属性,请使用方括号 []
{
"propname": "age"
}
MATCH (n:Person)
WHERE n[$propname] > 40
RETURN n.name AS name, n.age AS age
| name | age |
|---|---|
|
|
行数: 1 |
|
在 WITH 后使用 WHERE
WITH 可用于在子句的输出传递给后续查询部分之前对其进行操作。一旦发生这种操作,原始子句的输出将无法供后续子句访问。例如,在下面的查询中,WITH 对其前面的 MATCH 的输出进行了操作,以至于随后的 RETURN 无法再访问在 MATCH 中声明的变量 n。
WITH 只保留显式列出的变量;其他变量将变得不可访问MATCH (n:Person)
WITH n.name as name
RETURN n
如果 RETURN 子句引用 WITH 生成的 name 变量,则上述查询会起作用。然而,由于 WHERE 是一个子子句而非子句,其作用域不受紧邻其前的 WITH 子句限制。
WHERE 不受紧邻其前的 WITH 限制MATCH (n:Person)
WITH n.name as name
WHERE n.age = 38
RETURN name
| name |
|---|
|
行数: 1 |
返回 Timothy 的名称是因为 WHERE 子句仍然充当 MATCH 的过滤器。然而,WITH 仍然会缩小查询其余部分的范围。在此情况下,name 是 RETURN 子句作用域内唯一的变量。
过滤模式
固定长度模式
WHERE 在节点模式内WITH 35 AS minAge
MATCH (a:Person WHERE a.name = 'Andy')-[:KNOWS]->(b:Person WHERE b.age > minAge)
RETURN b.name AS name
| name |
|---|
|
行数: 1 |
以这种方式使用时,WHERE 中的谓词可以引用 WHERE 子句所属的节点变量,但不能引用 MATCH 模式的其他元素。
同样的规则也适用于模式推导
WHERE 在模式推导内MATCH (a:Person {name: 'Andy'})
RETURN [(a)-->(b WHERE b:Person) | b.name] AS friends
| friends |
|---|
|
|
WHERE 也可以出现在 MATCH 子句的关系模式中
WHERE 在关系模式内WITH 2000 AS minYear
MATCH (a:Person)-[r:KNOWS WHERE r.since < minYear]->(b:Person)
RETURN a.name AS person, b.name AS friend, r.since AS knowsSince
| name | friend | knowsSince |
|---|---|---|
|
|
|
行数: 1 |
||
关系模式谓词也可以在模式推导中使用,其中也适用相同的注意事项
WITH 2000 AS minYear
MATCH (a:Person {name: 'Andy'})
RETURN [(a)-[r:KNOWS WHERE r.since < minYear]->(b:Person) | r.since] AS years
| years |
|---|
|
行数: 1 |
可变长度模式
WHERE 谓词在量化关系内MATCH p = (a:Person {name: "Andy"})-[r:KNOWS WHERE r.since < 2011]->{1,4}(:Person)
RETURN [n IN nodes(p) | n.name] AS paths
请注意,任何包含 Timothy 和 Susan 的路径都被 WHERE 谓词排除,因为它们传入的 KNOWS 关系的 since 值都高于 2011。
| paths |
|---|
|
|
|
行数: 3 |
有关在量化路径模式中使用 WHERE 谓词的更多信息,请参阅量化路径模式中的谓词。
使用不符合 GQL 规范的可变长度关系语法时,不允许在可变长度模式中使用 WHERE。
WHERE 在可变长度关系内MATCH p = (a:Person {name: 'Andy'})-[r:KNOWS*1..4 WHERE r.since < 2011]->(b:Person)
RETURN [n IN nodes(p) | n.name] AS path