路径模式表达式

EXISTS 子查询类似,路径模式表达式可用于断言图中是否存在至少一条指定的路径。虽然存在性子查询功能更强大,能够实现路径模式表达式所能实现的一切,但路径模式表达式更为简洁。

有关 Cypher® 中图模式匹配的更多信息,请参阅模式

规则

路径模式表达式有以下限制(需要扩展功能的用例应考虑使用存在性子查询

  • 路径模式表达式只能使用图模式语义的子集。

  • 路径模式表达式必须是长度大于零的路径模式。换句话说,它必须包含至少一个关系可变长度关系

  • 路径模式表达式不能声明新变量。它们只能引用现有变量。

  • 路径模式表达式只能用于需要布尔表达式的位置。以下部分将演示如何在 WHERE 子句中使用路径模式表达式。

示例图

以下图用于以下示例

path pattern expressions

要重新创建该图,请在空的 Neo4j 数据库中运行以下查询

CREATE (alice:Person {name:'Alice', age: 65, role: 'Project manager'}),
       (cecil:Person {name: 'Cecil', age: 25, role: 'Software developer'}),
       (cecilia:Person {name: 'Cecilia', age: 31, role: 'Software developer'}),
       (cecil)-[:WORKS_FOR {since: 2023}]->(alice),
       (cecilia)-[:WORKS_FOR {since: 2015}]->(alice)

示例

简单路径模式表达式
MATCH (employee:Person)
WHERE (employee)-[:WORKS_FOR]->(:Person {name: 'Alice'})
RETURN employee.name AS employee
结果
员工

"Cecil"

"Cecilia"

行数: 2

包含布尔运算符 NOTAND 的路径模式表达式
MATCH (employee:Person)
WHERE NOT employee.name = 'Cecil' AND (employee)-[:WORKS_FOR]->(:Person {name: 'Alice'})
RETURN employee.name AS employee
结果
员工

"Cecilia"

行数: 1

有关 Cypher 布尔运算符的更多信息,请参阅谓词表达式 → 布尔运算符

模式可以放在表达式内部。

表达式内部的模式
RETURN NOT (:Person {name: "Alice"})<-[:WORKS_FOR {since: 2023}]-(:Person) AS patternCheck
结果
patternCheck

false

行数: 1

上述示例中需要 NOT 来使查询成为有效的谓词表达式。如果没有它,查询将无效,因为表达式不会返回 BOOLEAN 值。

可以使用 exists() 函数来检查模式是否存在。请注意,此函数不如EXISTS 子查询那样通用。

使用 exists() 函数检查模式是否存在
RETURN exists((:Person)-[:WORKS_FOR {since: 2023}]->(:Person {name: "Alice"})) AS patternCheck
结果
patternCheck

TRUE

行数: 1