WHERE
WHERE 子句本身不是一个独立的子句,而是与 MATCH、OPTIONAL MATCH 和 WITH 子句配合使用的从句。
当与 MATCH 和 OPTIONAL MATCH 一起使用时,WHERE 会为所描述的模式添加约束。它不应被视为匹配完成后的过滤器。
在存在多个 MATCH / OPTIONAL MATCH 子句的情况下,WHERE 中的谓词始终是紧邻其前的 MATCH / OPTIONAL MATCH 模式的一部分。如果将 WHERE 放置在错误的 MATCH 子句中,可能会影响结果和性能。
当在 WITH 之后使用时,WHERE 仅用于过滤结果。
有关 WHERE 的更多用法,请参阅谓词 (Predicates)。 |
示例图
以下图表用于下方的示例
要重建该图,请在空的 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 |
|---|
|
|
对动态标签和类型进行过滤
若要使用动态计算的值来过滤标签或关系类型,请使用 $(<expr>),其中 <expr> 为任何 Cypher® 表达式
{
"label": "Swedish"
}
MATCH (n)
WHERE n:$($label)
RETURN labels(n) AS labels
| 标签 |
|---|
|
行:1 |
对动态属性进行过滤
若要使用动态计算的名称来过滤属性,请使用方括号 []
{
"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 子句作用域内唯一的变量。
过滤模式
定长模式
WHEREWITH 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 模式中的其他元素。
同样的规则适用于模式推导 (pattern comprehensions)
WHEREMATCH (a:Person {name: 'Andy'})
RETURN [(a)-->(b WHERE b:Person) | b.name] AS friends
| friends |
|---|
|
|
WHERE 也可以出现在 MATCH 子句的关系模式中
WHEREWITH 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。
WHEREMATCH p = (a:Person {name: 'Andy'})-[r:KNOWS*1..4 WHERE r.since < 2011]->(b:Person)
RETURN [n IN nodes(p) | n.name] AS path