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