WHERE

WHERE 子句本身不是一个独立的子句——它是一个与 MATCHOPTIONAL MATCHWITH 子句一起使用的子子句。

当与 MATCHOPTIONAL MATCH 一起使用时,WHERE 会对所描述的模式添加约束。不应将其视为在匹配完成后进行的过滤。

在存在多个 MATCH / OPTIONAL MATCH 子句的情况下,WHERE 中的谓词始终是紧邻其前的 MATCH / OPTIONAL MATCH 中模式的一部分。如果 WHERE 被放在错误的 MATCH 子句中,结果和性能都可能受到影响。

当在 WITH 之后使用时,WHERE 只是简单地过滤结果。

有关 WHERE 的更多用法,请参阅谓词

示例图

以下示例使用以下图

graph where clause

要在空 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

"Andy"

行数: 1

根据节点属性过滤
MATCH (n:Person)
WHERE n.age < 35
RETURN n.name AS name, n.age AS age
结果
name age

"Susan"

32

行数: 1

根据关系属性过滤
MATCH (:Person {name:'Andy'})-[k:KNOWS]->(f)
WHERE k.since < 2000
RETURN f.name AS oldFriend
结果
oldFriend

"Peter"

行数: 1

根据动态属性过滤

要使用动态计算的名称过滤属性,请使用方括号 []

参数
{
  "propname": "age"
}
根据动态计算的节点属性过滤
MATCH (n:Person)
WHERE n[$propname] > 40
RETURN n.name AS name, n.age AS age
结果
name age

"Lisa"

48

行数: 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

"Timothy"

行数: 1

返回 Timothy 的名称是因为 WHERE 子句仍然充当 MATCH 的过滤器。然而,WITH 仍然会缩小查询其余部分的范围。在此情况下,nameRETURN 子句作用域内唯一的变量。

过滤模式

WHERE 子句可以添加到固定长度模式可变长度模式中,以指定额外的约束。

固定长度模式

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

"Timothy"

行数: 1

以这种方式使用时,WHERE 中的谓词可以引用 WHERE 子句所属的节点变量,但不能引用 MATCH 模式的其他元素。

同样的规则也适用于模式推导

WHERE 在模式推导内
MATCH (a:Person {name: 'Andy'})
RETURN [(a)-->(b WHERE b:Person) | b.name] AS friends
结果
friends

["Peter","Timothy"]

行数: 1

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

"Andy"

"Peter"

1999

行数: 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

[1999]

行数: 1

可变长度模式

如果匹配可变长度模式,WHERE 只能与量化路径模式量化关系语法一起使用。

允许 - 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

请注意,任何包含 TimothySusan 的路径都被 WHERE 谓词排除,因为它们传入的 KNOWS 关系的 since 值都高于 2011

结果
paths

["Andy", "Peter"]

["Andy", "Peter", "Lisa"]

["Andy", "Peter", "Lisa", "John"]

行数: 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