语法与语义
本节包含用于查找图模式匹配特定元素的语法和语义的参考资料。
节点模式 (Node patterns)
节点模式是匹配单个节点的模式。它可以单独用于 MATCH 或 EXIST 等子句中,也可以构成路径模式的一部分。
另请参阅 节点模式概念。
语法
nodePattern ::= "(" [ nodeVariable ] [ labelExpression ]
[ propertyKeyValueExpression ] [ elementPatternWhereClause] ")"
elementPatternWhereClause ::= "WHERE" booleanExpression
有关有效节点变量命名的规则,请参阅 Cypher® 命名规则。
规则
谓词
节点模式内部可以指定三种类型的谓词:
WHERE 子句的布尔表达式可以引用节点模式作用域内的任何变量。为了在布尔表达式中引用节点变量,必须在节点模式中声明该变量。
如果未指定任何谓词,则该节点模式匹配任何节点。
变量绑定
如果变量未在查询的其他位置声明,则在执行其所属的路径模式匹配时,它将被绑定到节点。如果该变量已在之前的子句中绑定,则不会有新节点绑定到该变量;任何在当前路径模式中不匹配的先前已绑定节点,都将导致该匹配项从结果中剔除。有关在子句之间传递结果的更多详细信息,请参阅子句组合一节。
关系模式 (Relationship patterns)
关系模式是匹配单个关系的模式。它只能与其两侧的节点模式一起使用。
另请参阅 关系模式概念。
语法
relationshipPattern ::= fullPattern | abbreviatedRelationship
fullPattern ::=
"<-[" patternFiller "]-"
| "-[" patternFiller "]->"
| "-[" patternFiller "]-"
abbreviatedRelationship ::= "<--" | "--" | "-->"
patternFiller ::= [ relationshipVariable ] [ typeExpression ]
[ propertyKeyValueExpression ] [ elementPatternWhereClause ]
elementPatternWhereClause ::= "WHERE" booleanExpression
请注意,关系模式中的类型表达式语法与节点模式中的标签表达式语法相同(尽管与节点标签不同,关系必须且只能有一个类型)。
有关有效关系变量命名的规则,请参阅 Cypher 命名规则。
规则
谓词
在完整关系模式(即带有方括号的模式)的模式填充中,可以指定以下三种类型的谓词:
第四种谓词使用小于号或大于号(< 和 >)形成箭头,来指定关系相对于整个路径模式的方向性。如果关系模式没有箭头,它将匹配任何方向的关系。
WHERE 子句的布尔表达式可以引用关系模式作用域内的任何变量。为了在布尔表达式中引用关系变量,必须在模式中声明该变量。
如果未指定谓词,则该模式匹配所有关系。
变量绑定
如果变量未在查询的其他位置声明,则在执行其所属的路径模式匹配时,它将被绑定到关系。如果该变量已在之前的子句中绑定,则不会有新关系绑定到该变量;如果任何先前已绑定的关系在当前路径模式中不匹配,则这些匹配项将从结果中剔除。
有关在子句之间传递结果的更多详细信息,请参阅子句组合章节。
标签表达式
以下内容适用于节点模式的标签表达式和关系模式的类型表达式。
标签表达式是一个布尔谓词,由标签名称和通配符组成,使用析取(或)、合取(与)、否定(非)和分组。当标签表达式匹配节点的标签集时,它返回 true。
尽管关系具有类型而不是标签,但匹配关系类型的表达式语法与标签表达式相同。
语法
labelExpression ::= ":" labelTerm
labelTerm ::=
labelIdentifier
| labelTerm "&" labelTerm
| labelTerm "|" labelTerm
| "!" labelTerm
| "%"
| "(" labelTerm ")"
有关有效的标签标识符,请参阅 Cypher 命名规则。
规则
下表列出了标签表达式中使用的符号
| 符号 | 描述 | 优先级 |
|---|---|---|
|
通配符。如果标签集非空,则求值为 |
|
|
括号内的表达式在评估包含该组的外部表达式之前进行评估。 |
1(最高) |
|
否定 |
2 |
|
合取 |
3 |
|
析取 |
4(最低) |
结合性为从左到右。
示例
在下表中,打钩处表示标签表达式与显示了相应标签的节点匹配
节点 |
||||||||
节点模式 |
|
|
|
|
|
|
|
|
|
||||||||
|
||||||||
|
||||||||
|
||||||||
|
||||||||
|
||||||||
|
||||||||
|
||||||||
|
||||||||
|
||||||||
|
||||||||
|
||||||||
|
||||||||
|
||||||||
|
||||||||
|
||||||||
由于每个关系恰好只有一个类型,此表达式永远不会匹配关系
-[:A&B]->
类似地,以下表达式将始终匹配关系
-[:%]->
否定词的使用可以使合取在关系模式中非常有用。以下表达式匹配类型既不是 A 也不是 B 的关系
-[:!A&!B]->
属性键值表达式
语法
propertyKeyValueExpression ::=
"{" propertyKeyValuePairList "}"
propertyKeyValuePairList ::=
propertyKeyValuePair [ "," propertyKeyValuePair ]
propertyKeyValuePair ::= propertyName ":" valueExpression
规则
属性键值表达式被视为包含该模式的元素属性上的等式合取。
例如,以下节点模式
({ p: valueExp1, q: valueExp2 })
等同于带有 WHERE 子句的以下节点模式
(n WHERE n.p = valueExp1 AND n.q = valueExp2)
值表达式可以是 表达式 一节中列出的任何表达式,路径模式除外(这会抛出语法错误),正则表达式除外(会被视为字符串字面量)。空的属性键值表达式匹配所有元素。属性键值表达式可以与 WHERE 子句结合使用。
路径模式 (Path patterns)
路径模式是与图中路径匹配的顶级模式。
语法
pathPattern ::= [ pathVariableDeclaration ] [ pathPatternPrefix ] pathPatternExpression
pathVariableDeclaration ::= pathVariable "="
pathPatternPrefix ::= pathModePrefix | shortestPathSelector
pathPatternExpression ::= { parenthesizedPathPatternExpression | pathPatternPhrase }
parenthesizedPathPatternExpression ::=
"("
[ subpathVariableDeclaration ]
pathPatternExpression
[ parenthesizedPathPatternWhereClause ]
")"
subpathVariableDeclaration ::= pathVariable "="
pathPatternPhrase ::= [{ simplePathPattern | quantifiedPathPattern }]+
simplePathPattern ::= nodePattern
[ { relationshipPattern | quantifiedRelationship } nodePattern ]*
parenthesizedPathPatternWhereClause ::= "WHERE" booleanExpression
请参阅每个语法规则的相关章节
|
|
|
|
|
|
|
|
|
规则
路径模式中的元素最小数量必须大于零。例如,不允许使用下限为零的量化路径模式
((n)-[r]->(m)){0,10}
路径模式必须始终以节点模式开头和结尾。
(n)-[r]->(m)-[s]-
路径模式可以由简单路径模式和量化路径模式的连接组成。但是,两个简单路径模式不能放置在一起。
(a)<-[s]-(b) (c)-[t]->(d)
当路径模式与图中的路径匹配时,可以重新访问节点,但不能重新访问关系。
子路径变量(在括号内的路径模式表达式中声明的路径变量)仅在指定了最短路径模式时才能使用。
MATCH SHORTEST 1 (p = (a)-[r]->+(b) WHERE length(p) > 3)
MATCH (:A)-[:S]->(:B) (p = ((a)-[r]->(b))+)
有关多次声明变量的规则,请参阅图模式。
示例
允许使用单个节点模式,因为它至少有一个元素
(n)
包含一个以上元素的简单路径模式
(a:A)<-[{p: 30}]-(b)-[t WHERE t.q > 0]->(c:C)
量化路径模式的量词可以有零下限,只要它连接到其他至少有一个元素的模式即可
(:A) ((:X)-[:R]-()){0,10} (:B)
只要整个路径模式至少有一个元素,量化关系也可以有零下限
(:A)-[:R]->{0,10}(:B)
简单路径模式和量化路径模式的连接
(a)<-[s]-(b)-[t]->(c) ((n)-[r]->(m)){0,10} (:X)
在简单路径模式中引用非局部节点变量
(a)<-[s:X WHERE a.p = s.p]-(b)
在量化路径模式中引用非局部关系变量
(:A) ((a)<-[s:X WHERE a.p = s.p]-(b)){,5}
如果变量是在量化路径模式之外定义的,则可以在后续子句中引用它
MATCH (n)
MATCH ()-[r WHERE r.q = n.q]-() (()<-[s:X WHERE n.p = s.p]-()){2,3}
由路径模式匹配的路径可以分配给一个变量
MATCH p = ()-[r WHERE r.q = n.q]-()
量化路径模式
有关匹配可变长度路径的另一种模式版本的信息,请参阅可变长度关系。
语法
quantifiedPathPattern ::=
parenthesizedPathPatternExpression quantifier
fixedPath ::= nodePattern [ relationshipPattern nodePattern ]+
规则
量化路径模式的嵌套
不允许嵌套量化路径模式。例如,不允许在量化路径模式中嵌套量化关系
(:A) (()-[:R]->+()){2,3} (:B)
作为量化路径模式内布尔表达式一部分的量化路径模式不计为嵌套,是允许的。
MATCH ((n:A)-[:R]->({p: 30}) WHERE EXISTS { (n)-->+(:X) }){2,3}
组变量
在量化路径模式内部引入的变量被称为在模式定义之外作为“组变量”公开。作为组变量,它们将被绑定到节点列表或关系列表。相比之下,变量可以在声明它们的量化路径模式内被视为单例。这种区别可以从以下查询中看出
MATCH ((x)-[r]->(z WHERE z.p > x.p)){2,3}
RETURN [n in x | n.p] AS x_p
在布尔表达式 z.p > x.p 中,z 和 x 都是单例;在 RETURN 子句中,x 是一个可以像列表一样迭代的组变量。请注意,这意味着上述 WHERE 子句 z.p > x.p 需要在量化路径模式内部。以下查询会抛出语法错误,因为它将 z 和 p 视为单例
MATCH ((x)-[r]->(z)){2,3} WHERE z.p > x.p
但是,可以将 WHERE 子句放在节点模式之外
MATCH ((x)-[r]->(z) WHERE z.p > x.p){2,3}
匹配
将量化路径模式与路径匹配的机制最好通过一个例子来解释。对于该示例,将使用以下简单图
首先,考虑以下简单路径模式
(x:A)-[:R]->(z:B WHERE z.h > 2)
这与上图中的三条不同路径相匹配。每个匹配的 x 和 z 的绑定结果如下(标题 n1 等表示上图中节点的身份)
| x | z |
|---|---|
|
|
|
|
|
|
如果量词 {2} 被附加到简单路径模式,结果就是以下量化路径模式
((x:A)-[:R]->(z:B WHERE z.h > 2)){2}
这等同于将模式的两次迭代链接在一起,其中第一次迭代的最右侧节点与第二次迭代的最左侧节点合并。(有关详细信息,请参阅节点模式对。)
(x:A)-[:R]->(z:B WHERE z.h > 2) (x:A)-[:R]->(z:B WHERE z.h > 2)
为了避免在 x 的两个实例之间以及 z 的两个实例之间引入等连接 (equijoins),变量在每次迭代内部被替换为一组新变量
(x1:A)-[:R]->(z1:B WHERE z1.h > 2) (x2:A)-[:R]->(z2:B WHERE z2.h > 2)
然后合并相邻节点模式中的节点变量
(x1:A)-[:R]->({z1,x2}:A&B WHERE z1.h > 2)-[:R]->(z2:B WHERE z2.h > 2)
变量 x2 和 z1 绑定到相同节点模式的匹配项这一事实由符号 {z1,x2} 表示。在模式之外,变量 x 和 z 将是包含节点列表的组变量。
考虑以下查询中的量化路径模式
MATCH ((x:A)-[:R]->(z:B WHERE z.h > 2)){2}
RETURN [n in x | n.h] AS x_h, [n in z | n.h] AS z_h
这产生以下结果
| x_h | z_h |
|---|---|
|
|
|
|
现在更改量词以匹配长度从一到五的路径
MATCH ((x:A)-[:R]->(z:B WHERE z.h > 2)){1,5}
RETURN [n in x | n.h] AS x_h, [n in z | n.h] AS z_h
与定长量词 {2} 相比,这也匹配长度为一和三的路径,但不存在长度大于三的匹配项
| x_h | z_h |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
量化关系
规则
量化关系是量化路径模式的一种缩写形式,仅指定单个关系模式。
例如,以下量化关系
(:A)-[r:R]->{m,n}(:B)
它匹配路径,这些路径具有 m 到 n 个类型为 R 的关系,从左到右指向,始于类型为 A 的节点,终于类型为 B 的节点,并匹配中间的任何节点。它等同于以下量化路径模式
(:A) (()-[r:R]->()){m,n} (:B)
使用量化路径模式的扩展形式,可以在内部添加谓词。相反,如果唯一的谓词是关系类型表达式,使用量化关系可以使查询语法更简洁。
请注意,与量化路径模式不同,量化关系必须始终在每一侧都有一个节点模式。
量词
语法
quantifier ::=
"*" | "+" | fixedQuantifier | generalQuantifier
fixedQuantifier ::= "{" unsignedDecimalInteger "}"
generalQuantifier ::= "{" lowerBound "," upperBound "}"
lowerBound ::= unsignedDecimalInteger
upperBound ::= unsignedDecimalInteger
unsignedDecimalInteger ::= [0-9]+
|
|
规则
通用量词语法中没有上限意味着没有上限。下表显示了量词语法的变体及其规范形式
| 变体 | 规范形式 | 描述 |
|---|---|---|
|
|
介于 m 和 n 次迭代之间。 |
|
|
1 次或多次迭代。 |
|
|
0 次或多次迭代。 |
|
|
恰好 n 次迭代。 |
|
|
m 次或更多次迭代。 |
|
|
介于 0 和 n 次迭代之间。 |
|
|
0 次或多次迭代。 |
请注意,具有量词 {1} 的量化路径模式不等同于定长路径模式。虽然生成的量化路径模式会与其中包含的定长路径模式匹配相同的路径(不带量词),但量词的存在意味着路径模式内的所有变量都将作为组变量公开。
可变长度关系
在引入量化路径模式和量化关系语法之前,在 Cypher 中匹配可变长度路径的唯一方法是使用可变长度关系。此语法仍然可用,但它不符合 GQL 标准。它等同于量化关系的语法,但有以下区别
语法
varLengthRelationship ::=
"<-[" varLengthFiller "]-"
| "-[" varLengthFiller "]->"
| "-[" varLengthFiller "]-"
varLengthFiller ::= [ relationshipVariable ] [ varLengthTypeExpression ]
[ varLengthQuantifier ] [ propertyKeyValueExpression ]
varLengthTypeExpression ::= ":" varLengthTypeTerm
varLengthTypeTerm ::=
typeIdentifier
| varLengthTypeTerm "|" varLengthTypeTerm
varLengthQuantifier ::= varLengthVariable | varLengthFixed
varLengthVariable ::= "*" [ [ lowerBound ] ".." [ upperBound ] ]
varLengthFixed ::= "*" fixedBound
fixedBound ::= unsignedDecimalInteger
lowerBound ::= unsignedDecimalInteger
upperBound ::= unsignedDecimalInteger
unsignedDecimalInteger ::= [0-9]+
|
|
有关有效关系变量命名的规则,请参阅 Cypher 命名规则。
规则
| 变体 | 描述 | 等效的量化关系 | 等效的量化路径模式 |
|---|---|---|---|
|
1 次或多次迭代。 |
|
|
|
恰好 n 次迭代。 |
|
|
|
介于 m 和 n 次迭代之间。 |
|
|
|
m 次或更多次迭代。 |
|
|
|
0 次或多次迭代。 |
|
|
|
介于 1 和 n 次迭代之间。 |
|
|
|
介于 0 和 n 次迭代之间。 |
|
|
请注意,此处单独使用的 * 与 Kleene 星号(代表零次或多次重复的运算符)不同,因为 Kleene 星号的下限为零。上表可用于转换可变长度关系中使用的量词。为量化路径模式给出的规则适用于此转换。
此表显示了一些示例
| 可变长度关系 | 等效的量化路径模式 |
|---|---|
|
|
|
|
|
|
等连接 (Equijoins)
可变长度关系的变量可以在后续模式中使用,以引用该变量绑定的关系列表。这与绑定到单个节点或关系的变量的等连接相同。
本节使用以下图
要重建该图,请针对空的 Neo4j 数据库运行以下查询
CREATE ({name: 'Filipa'})-[:KNOWS]->({name:'Anders'})-[:KNOWS]->
({name:'Dilshad'})
在以下查询中,节点变量将绑定到相同的节点
MATCH (a {name: 'Dilshad'})<-[r*1..2]-(b)
MATCH (c)<-[r*1..2]-(d)
RETURN a = c, b = d, size(r)
| a = c | b = d | size(r) |
|---|---|---|
|
|
|
|
|
|
行:2 |
||
关系列表保持其顺序。这意味着在以下查询中,如果第二个 MATCH 中可变长度关系的方向发生切换,等连接将仅匹配一次(当存在单个关系时)
MATCH (a {name: 'Dilshad'})<-[r*1..2]-(b)
MATCH (c)-[r*1..2]->(d)
RETURN a = c, b = d, size(r)
| a = c | b = d | size(r) |
|---|---|---|
|
|
|
行:1 |
||
变量 r 可以像任何列表一样反转顺序,并使其与关系模式方向的切换相匹配
MATCH (a {name: 'Dilshad'})<-[r*1..2]-(b)
WITH a, b, reverse(r) AS s
MATCH (c)-[s*1..2]->(d)
RETURN a = d, b = c, size(s)
| a = d | b = c | size() |
|---|---|---|
|
|
|
|
|
|
行:2 |
||
更改后续 MATCH 语句上的界限意味着只有量词界限的重叠长度才会产生结果
MATCH (a {name: 'Dilshad'})<-[r*1..2]-(b)
MATCH (c)<-[r*2..3]-(d)
RETURN a = c, b = d, size(r)
| a = c | b = d | size(r) |
|---|---|---|
|
|
|
行:1 |
||
因为 Cypher 的默认匹配模式 DIFFERENT RELATIONSHIPS 仅允许路径遍历关系一次,所以在同一图模式中重复可变长度关系将不会产生任何结果。(对于 REPEATABLE ELEMENTS 匹配模式则并非如此。有关更多信息,请参阅匹配模式)。例如,此 MATCH 子句永远不会将任何中间结果传递给后续子句
MATCH (x)-[r*1..2]->(y)-[r*1..2]->(z)
试图在单个关系模式中重复可变长度关系会引发错误。例如,以下模式会引发错误,因为变量 r 同时出现在可变长度关系和定长关系中
MATCH (x)-[r*1..2]->(y)-[r]->(z)
示例
以下模式匹配以标签为 A 的节点开始并以标签为 B 的节点结束的路径,且遍历两个到三个类型为 R 的关系
(:A)-[r:R*2..3]->(:B)
以下模式恰好遍历类型为 R 或 S 或 T 的关系五次
()-[r:R|S|T*5]->()
以下模式遍历任何关系零到五次,路径以标签为 A 的节点开始并以标签为 B 的节点结束。请注意,对于遍历零个关系的情况,这也将返回所有同时具有 A 和 B 标签的节点
(:A)-[*0..5]->(:B)
如果移除了下限,它将默认为一,并且将不再返回长度为零的路径,即单个节点
(:A)-[*..5]->(:B)
以下模式遍历一个或多个具有属性 p = $param 的任何方向的关系
()-[* {p: $param}]-()
最短路径
路径选择器是在路径模式级别指定的模式。路径选择器有五种类型
-
SHORTEST k -
ALL SHORTEST -
SHORTEST k GROUPS -
ANY k -
ALL
前三种是最短路径选择器,它们指定应返回哪些最短路径,具体的选择方法取决于路径选择器类型和 k 的值。
有关在路径模式中包含路径选择器的位置,请参阅路径模式。
语法
shortestPathSelector ::=
{ allPathSearch | anyPathSearch | shortestPathSearch }
shortestPathSearch ::=
{ allShortest | anyShortest | countedShortestPaths |
countedShortestGroups }
allShortest ::= "ALL SHORTEST" [ pathOrPaths ]
anyShortest ::= "ANY SHORTEST" [ pathOrPaths ]
countedShortestPaths ::=
"SHORTEST" numberOfPaths [ pathOrPaths ]
countedShortestGroups ::=
"SHORTEST" [ numberOfGroups ] [ pathOrPaths ] { "GROUP" | "GROUPS" }
allPathSearch ::= "ALL" [ pathOrPaths ]
anyPathSearch ::= "ANY" [ numberOfPaths ] [ pathOrPaths ]
pathOrPaths ::= { "PATH" | "PATHS" }
numberOfPaths ::= unsignedDecimalInteger | parameter
numberOfGroups ::= unsignedDecimalInteger | parameter
|
|
规则
选择性路径选择器
以下路径选择器类型是“选择性”路径选择器
-
SHORTEST k -
SHORTEST k GROUPS -
ALL SHORTEST -
ANY k
这意味着它们减少了路径模式产生的匹配项数量。ALL 返回产生的所有匹配项,因此不具有选择性。
路径选择顺序
当指定了路径选择器时,将遵循以下步骤来查找路径模式的解
-
找到所有与路径模式匹配的路径。
-
删除任何不满足路径模式中包含的谓词的路径。这是一个“预”过滤器。
-
根据指定的路径选择器选择路径。
-
删除任何不满足图模式
WHERE子句中谓词的路径。这是一个“后”过滤器。
// node pattern WHERE clause
MATCH p = SHORTEST 2 (a WHERE a.p < 42)--+()
// relationship pattern property key-value expression
MATCH p = SHORTEST 2 (a)-[{p: 42}]-+()
// label and type expressions
MATCH p = SHORTEST 2 (:A)-[:R]-+(:B)
// quantified path pattern
MATCH SHORTEST 2 ((a)--(b) WHERE a.p < b.p)+
// parenthesized path pattern expression
// note the position of the parentheses!
MATCH SHORTEST 2 ( p = ()--+() WHERE any(n IN nodes(p) WHERE n.p < 42) )
// graph pattern WHERE clause
MATCH p = SHORTEST 2 (a)--+()
WHERE all(n IN nodes(p) WHERE n.p < 42)
分区
如果存在多个匹配路径模式的开始节点和结束节点,那么当指定了选择性路径选择器时,路径模式匹配的路径将根据开始节点和结束节点的唯一对进行分区。在每个分区内,它们按路径长度升序排列。然后根据指定的路径选择器选择分区路径,如下所示
| 选择性路径选择器 | 分区 |
|---|---|
|
前
|
|
路径进一步按路径长度分组,这些组按路径长度升序排列。然后选择前 |
|
所有并列最短的路径。等同于 |
|
返回任意 |
|
返回所有路径。这与不指定任何路径选择器相同。 |
对于选择性路径选择器,如果 k 大于匹配路径模式的路径总数 N,则返回所有 N 条路径。
仅允许一个路径模式
当为路径模式指定“选择性”最短路径选择器时,它必须是图模式中唯一的路径模式。
MATCH p = SHORTEST 2 (:A)--+(a)--+(:B), q = ANY 2 (a)-->{,2}(:C)
RETURN p, q
MATCH ALL SHORTEST (n:A) (()-->(:B))+, (:X)--(n)--(:Y)
RETURN n
MATCH p = SHORTEST 2 (:A)--+(a)--+(:B)
MATCH q = ANY 2 (a)-->{,2}(:C)
RETURN p, q
MATCH ALL SHORTEST (n:A) (()-->(:B))+
MATCH (:X)--(n)--(:Y)
RETURN n
MATCH ALL (n:A) (()-->(:B))+, (:X)--(n)--(:Y)
RETURN n
示例
为匹配 (:A) 和 (:B) 的每一对不同的节点返回一条最短路径
MATCH SHORTEST 1 (:A)-[:R]->{0,10}(:B)
为匹配 (:A) 和 (:B) 的每一对不同的节点返回任意两条路径
MATCH p = ANY 2 (:A)-[:R]->{0,10}(:B)
为匹配 (:A) 和 (:B) 的每一对不同的节点返回等于最短路径长度的所有路径
MATCH ALL SHORTEST (:A)-[:R]->{0,10}(:B)
为匹配 (:A) 和 (:B) 的每一对不同的节点返回等于前两条最短路径长度的所有路径
MATCH SHORTEST 2 GROUPS (:A)-[:R]->{0,10}(:B)
为每一对不同的节点返回一条最短路径,其中路径长度为偶数
MATCH SHORTEST 1 (p = ()--+() WHERE length(p) % 2 = 0)
对于连接每一对不同节点的每条最短路径,仅返回路径长度为偶数的路径(因此结果比上一个示例少)
MATCH p = SHORTEST 2 ()--+()
WHERE length(p) % 2 = 0
shortestPath() 和 allShortestPaths() 函数
在引入基于关键字的最短路径选择规范之前,唯一可用的最短路径语法是 shortestPath() 和 allShortestPaths() 函数。它们类似于 SHORTEST 1 和 ALL SHORTEST,但有几点不同
-
路径模式作为参数传递给函数。
-
路径模式仅限于单个关系模式。
-
要返回路径中第一个和最后一个节点相同的路径,需要更改配置设置
dbms.cypher.forbid_shortestpath_common_nodes。 -
最小路径长度(也称为可变长度关系模式的下限)应为 0 或 1。
这两个函数将继续可用,但它们不符合 GQL 标准。
语法
pathSelectorFunction ::=
{ shortestPathFunction | allShortestPathsFunction }
shortestPathFunction ::=
"shortestPath(" + oneHopPathPatternExpression + ")"
allShortestPathsFunction ::=
"allShortestPaths(" + oneRelPathPatternExpression + ")"
oneRelPathPatternExpression ::=
nodePattern varLengthRelationship nodePattern
请注意,可以将定长路径模式(带单个关系)传递给路径选择函数,但这在发现最短路径时不会有任何作用。
规则
限制为可变长度关系
路径选择函数中的模式必须是可变长度关系,而不是量化路径模式。
shortestPath(((a)-[:R]-(b)){1,5})
shortestPath((:A)-->+(:B))
路径模式长度
路径模式中必须恰好有一个关系模式,并且下限应为 0 或 1。
shortestPath((a)-[:R*1..5]-(b))
shortestPath((a)-[:R*1..5]-(b)-->(:X))
shortestPath((a)-[:R*2..5]-(b))
shortestPath((:A))
allShortestPaths((a:A)-[:S*]->(:B), (a)-[:R*1..3]->(:C))
预过滤和后过滤
如果 shortestPath() 函数的 MATCH 子句包含 WHERE 子句,此条件将充当预过滤器:首先找到满足 WHERE 子句的路径,并从这些路径中选择最短路径。
MATCH p = shortestPath(()-[*]-())
WHERE all(n in nodes(p) WHERE n.p < 42)
MATCH p = shortestPath(()-[*]-())
WHERE all(r in relationships(p) WHERE r.p < 42)
这些与不属于同一 MATCH 子句的 WHERE 子句形成对比。
MATCH p = shortestPath(()-[*]-())
WITH nodes(p) AS N
WHERE all(n in N WHERE n.p < 42)
图模式
图模式是一个或多个路径模式的逗号分隔列表。它是提供给 MATCH 的顶级构造。图模式是否可以匹配关系一次以上,由所选的匹配模式决定。
语法
graphPattern ::=
pathPattern [ "," pathPattern ]* [ graphPatternWhereClause ]
graphPatternWhereClause ::= "WHERE" booleanExpression
规则
路径模式的规则适用于图模式的每个组成路径模式。
变量引用
如果变量是在量化路径模式中声明的,那么只有在其声明的量化路径模式内部,它才能被视为单例。在该量化路径模式之外,它必须被视为组变量。
((n)-[r]->(m WHERE r.p = m.q))+
(n)-[r]->+(m WHERE all(rel in r WHERE rel.q > m.q))
(n)-[r]->+(m WHERE r.p = m.q)
等连接
如果节点变量在路径模式中声明多次,则它表示一个等连接。这是一项操作,要求具有相同节点变量的每个节点模式必须绑定到同一个节点。例如,以下模式用变量 a 两次引用同一个节点,形成一个循环
(a)-->(b)-->(c)-->(a)
以下模式在同一图模式的不同路径模式中用变量 b 引用同一个节点,形成“T”型模式
(a)-->(b)-->(c), (b)-->(e)
等连接只能使用量化路径模式之外的变量来完成。以下内容将不是有效的等连接
(a)-->(b)-->(c), ((b)-->(e))+ (:X)
如果图模式中的路径模式之间不存在等连接,则会从每条路径模式的匹配集形成笛卡尔连接。可以通过多次声明关系变量来在关系模式之间表示等连接。然而,由于在给定的匹配中关系只能遍历一次,因此不会返回任何解决方案。
示例
WHERE 子句可以引用量化路径模式内部和外部的变量
(a)-->(b)-->(c), (b) ((d)-->(e))+ WHERE any(n in d WHERE n.p = a.p)
可以形成等连接以匹配“H”型图
(:A)-->(x)--(:B), (x)-[:R]->+(y), (:C)-->(y)-->(:D)
没有公共变量,此图模式将导致两个路径模式的匹配集之间的笛卡尔连接
(a)-->(b)-->(c), ((d)-->(e))+
可以在路径模式之间形成多个等连接
(:X)-->(a:A)-[!:R]->+(b:B)-->(:Y), (a)-[:R]->+(b)
在先前 MATCH 中声明的变量可以在量化路径模式内部引用
MATCH (n {p = 'ABC'})
MATCH (n)-->(m:A)-->(:B), (m) (()-[r WHERE r.p <> n.p]->())+ (:C)
以下关系变量的重复不会产生任何解,因为 Cypher 在图模式的匹配中强制要求关系唯一性
MATCH ()-[r]->()-->(), ()-[r]-()
匹配模式
匹配模式指定在匹配图模式时是否可以匹配关系一次以上。Cypher 包含两种匹配模式
-
REPEATABLE ELEMENTS仅限 Cypher 25 Neo4j 2025.06 引入
语法
graphPattern ::=
[ matchMode ] pathPattern [ "," pathPattern ]* [ graphPatternWhereClause ]
matchMode ::=
{ REPEATABLE ELEMENT[S] | DIFFERENT RELATIONSHIPS }
规则
DIFFERENT RELATIONSHIPS
DIFFERENT RELATIONSHIPS 是一种限制性的匹配模式。它要求在图模式中所有组成路径模式中匹配到的所有关系必须是唯一的。更具体地说
-
一个关系对于给定的
MATCH结果只能出现一次。 -
给定的关系最多只能绑定到一个关系变量(例如
-[r]-)或一个匿名关系模式(-[]-)。 -
关系只能在关系组变量内绑定一次。
如果关系变量在整个图模式中出现多次,则无法返回任何解。例如,以下模式中,r 变量充当要求所有出现位置匹配相同关系的等连接,无法返回路径
MATCH (a)-[r]-(b)-[f]-(c)-[r]-(d) // r repeated twice
MATCH (a)-[r]-(b), (c)-[r]-(d) // r repeated twice
DIFFERENT RELATIONSHIPS 关键字于 Neo4j 2025.06 中发布。它仅在 Cypher 25 中可用,可用于在 MATCH 之后显式指定 Cypher 的默认匹配模式。指定 DIFFERENT RELATIONSHIPS 关键字在功能上等同于不指定匹配模式。例如,以下两个 MATCH 子句是等效的
MATCH (a)--{2}(b)
MATCH DIFFERENT RELATIONSHIPS (a)--{2}(b)
REPEATABLE ELEMENTS仅限 Cypher 25Neo4j 2025.06 引入
REPEATABLE ELEMENTS 是一种非限制性匹配模式。它允许在图模式中所有组成路径模式中匹配到的关系被重复遍历。更具体地说
-
对于给定的
MATCH结果,一个关系可以出现多次。 -
给定的关系可以绑定到多个关系变量或匿名关系模式。
-
关系可以在关系组变量内被绑定多次。
使用此匹配模式的查询必须在 MATCH 子句和图模式之间添加关键字 REPEATABLE ELEMENTS。
如果关系变量在整个图模式中出现多次,则可以返回解。例如,以下两个图模式中,r 变量充当要求所有出现位置匹配相同关系的等连接,可以返回路径
MATCH REPEATABLE ELEMENTS (a)-[r]-(b)-[f]-(c)-[r]-(d) // r repeated twice
MATCH REPEATABLE ELEMENTS (a)-[r]-(b), (c)-[r]-(d) // r repeated twice
量词界限
以下内容适用于不同匹配模式中可变长度模式量词的使用
-
DIFFERENT RELATIONSHIPS不需要量词有上限。以下是有效的:+,{n, },{ , },*。 -
REPEATABLE ELEMENTS要求所有量词都有上限。以下无效:+,{n, },{ , },*,但这些是有效的:{n},{n, m},{,m}。此限制是必须的,以防止返回潜在无限数量的路径。
子句和子查询
匹配模式只能在 MATCH 之后指定。它们不能应用于 MERGE 子句。
在 MATCH 子句之后的 COLLECT、COUNT 和 EXISTS 子查询中允许使用匹配模式。如果是这样,匹配模式将应用于子查询中匹配的模式,并与应用于顶级图模式的模式分开。在以下示例中,REPEATABLE ELEMENTS 仅应用于在 COUNT 子查询中匹配的模式
MATCH (a)-[:R]->(b)
WHERE COUNT {
MATCH REPEATABLE ELEMENTS (a)-[:S]-{,10}(b)
RETURN *
} > 5
RETURN *
选择性路径选择器
以下内容适用于匹配模式以及带有选择性路径选择器(SHORTEST k、SHORTEST k GROUPS、ALL SHORTEST 和 ANY k)的路径模式数量。
-
如果匹配模式是
DIFFERENT RELATIONSHIPS,则如果它带有选择性路径选择器,则只能有一个路径模式。 -
如果匹配模式是
REPEATABLE ELEMENTS,即使一个或多个路径模式带有选择性路径选择器,也可以有多个路径模式。
DIFFERENT RELATIONSHIPSMATCH SHORTEST 2 ((a)--(b) WHERE a.p < b.p)+
REPEATABLE ELEMENTSMATCH REPEATABLE ELEMENTS SHORTEST 2 (x) ((a)--(b) WHERE a.p < b.p){,10},
ANY (x)-->{,10}(:X)
DIFFERENT RELATIONSHIPSMATCH ALL SHORTEST (x) ((a)--(b) WHERE a.p < b.p){,10},
ANY (x)-->{,10}(:X)
示例
本节使用以下图
要重建它,请针对空的 Neo4j 数据库运行以下查询
CREATE (n1:A {q: 1}),
(n2:B {q: 2}),
(n3:A {q: 3}),
(n4:A {q: 4}),
(n1)-[:R]->(n2),
(n2)-[:R]->(n3),
(n3)-[:R]->(n2),
(n2)-[:R]->(n4),
(n4)-[:R]->(n1)
为了演示 REPEATABLE ELEMENTS 背后的基本概念,以及它与 DIFFERENT RELATIONSHIPS 匹配模式的区别,考虑以下尝试形成关系等连接的模式: (a)-[r]-(b)-[r]-(c)。为了使该模式返回任何结果,必须重新遍历相同的关系。也就是说,连接 a 到 b 的相同关系必须与连接 b 到 c 的关系是同一个。
如果使用 DIFFERENT RELATIONSHIPS 进行测试,由于匹配模式的限制,不会返回任何结果。
DIFFERENT RELATIONSHIPS 查找重新遍历相同关系的路径MATCH p = (:A)-[r]-(:B)-[r]-(:A)
RETURN [n IN nodes(p) | n.q] AS nodes
(no results)
但是,如果同一个查询使用 REPEATABLE ELEMENTS 匹配模式,则会返回四条路径,其中同一个关系被遍历了多次。
REPEATABLE ELEMENTS 查找重新遍历相同关系的路径MATCH REPEATABLE ELEMENTS p = (:A)-[r]-(:B)-[r]-(:A)
RETURN [n IN nodes(p) | n.q] AS nodes
| 节点 |
|---|
|
|
|
|
行:4 |
DIFFERENT RELATIONSHIPS 匹配模式仅允许节点在路径中重复。
DIFFERENT RELATIONSHIPS 匹配长度为 5 个关系的模式MATCH p = (:B)-->{5}()
RETURN [n IN nodes(p) | n.q] AS nodes
| 节点 |
|---|
|
|
行:2 |
REPEATABLE ELEMENTS 匹配模式允许节点和关系在路径中被重复遍历。
REPEATABLE ELEMENTS 匹配长度为 5 个关系的模式MATCH REPEATABLE ELEMENTS p = (:B)-->{5}()
RETURN [n IN nodes(p) | n.q] AS nodes
| 节点 |
|---|
|
|
|
|
|
行:2 |
路径模式 (Path modes)仅限 Cypher 25Neo4j 2026.03 引入
路径模式定义了单个路径模式内节点和关系的唯一性约束。这与匹配模式形成对比,后者约束整个 MATCH 子句中的关系唯一性。有关更多信息,请参阅匹配模式。
Cypher 支持三种路径模式
-
WALK:不强加约束;节点和关系都可以在路径中重复。 -
TRAIL:关系不能重复,但节点可以在路径中重复。 -
ACYCLIC:节点不能在路径中重复。一个节点可以在多条路径中重复,从而允许形成等连接。
语法
pathModePrefix ::= pathMode [ pathKeywords ]
pathMode ::= WALK | TRAIL | ACYCLIC
pathKeywords ::= PATH | PATHS
规则
一个 MATCH 中的所有路径模式必须相同
单个 MATCH 子句中的所有路径模式必须使用相同的路径模式。例如,您不能将 ACYCLIC 与使用 TRAIL 模式的模式混合使用
MATCH p = ACYCLIC (a)-->(b), q = TRAIL (c)-->(d)
RETURN p, q
42N61:错误:语法错误或访问规则冲突 - 不支持混合使用不同的路径模式。不支持在同一图模式中混合使用 ACYCLIC 和 TRAIL。请改为将模式拆分为单独的 MATCH 子句。 42001:错误:语法错误或访问规则冲突 - 无效语法 |
只有 WALK 可以与 REPEATABLE ELEMENTS 匹配模式结合使用
像 ACYCLIC 或 TRAIL 这样的显式路径模式不能与 REPEATABLE ELEMENTS 匹配模式一起使用。例如
MATCH REPEATABLE ELEMENTS p = ACYCLIC (n)-->{1, 10}(m)
RETURN p
42N60:错误:语法错误或访问规则冲突 - 不支持匹配模式和路径模式的组合。不支持在 ACYCLIC 路径模式下使用 REPEATABLE ELEMENTS。 42001:错误:语法错误或访问规则冲突 - 无效语法 |
不允许混合使用限制性路径选择器和显式路径模式
显式路径模式目前不能与限制性路径选择器(例如 ANY、SHORTEST)或传统的最短路径函数(如 shortestPath())结合使用。例如
MATCH p = ANY ACYCLIC (start)-->(target)
RETURN p
51N26:错误:系统配置或操作异常 - 此版本不支持。不支持同时使用 42001:错误:语法错误或访问规则冲突 - 无效语法 |
路径模式不能应用于 MERGE 子句
例如,这是不允许的
MERGE ACYCLIC (robert:Critic)-[:P]->(c:Critic)
42I04:错误:语法错误或访问规则冲突 - 无效表达式。'ACYCLIC' 不能在 MERGE 子句中使用。 42001:错误:语法错误或访问规则冲突 - 无效语法 |
路径模式内重复的节点变量导致没有匹配项
在单个限制性路径模式(如 ACYCLIC)中多次声明节点变量会导致没有匹配项。因为该变量必须绑定到同一个节点元素,而路径模式禁止重复节点,所以没有解决方案。
// This query returns 0 results because the node 'x' is repeated
MATCH p = ACYCLIC (x:Router)-[:LINK]->(x)
RETURN p
路径模式内重复的节点变量导致没有匹配项
在单个限制性路径模式(如 ACYCLIC)中多次声明节点变量会导致没有匹配项。
// This query will return 0 results because node 'x' is repeated
MATCH p = ACYCLIC (x:Router)-[:LINK]->+(x)
RETURN p
不同路径模式中重复的节点变量指定一个等连接
当节点变量在同一个 MATCH 子句中的不同路径模式中重复时,它指定一个等连接。
// 'x' is repeated across p and q, creating an equijoin between two acyclic paths.
// This is allowed because each individual path pattern remains acyclic.
MATCH p = ACYCLIC (a:Router)-[:LINK]->+(x:Router),
q = ACYCLIC (x)-[:LINK]->+(z:Router)
RETURN p, q
子查询中的路径模式作用域
子查询(例如 EXISTS 或 COUNT 表达式)的路径模式独立于外部查询中的路径模式。这允许您使用不同的唯一性约束执行次要检查。
// The outer query finds paths using relationship uniqueness (default WALK +
// DIFFERENT RELATIONSHIPS). The subquery checks for the existence of an ACYCLIC
// path connecting a and b.
MATCH p = (a:Router {name: 'A'})-[:LINK]->+(b:Router {name: 'D'})
WHERE EXISTS { MATCH ACYCLIC (a)-[:LINK]->+(b) }
RETURN [n IN nodes(p) | n.name] AS route
节点模式对
将一对节点模式写在一起并不是有效的语法。例如,以下所有情况都会引发语法错误
(a:A)(b:B)
(a:A)(b:B)<-[r:R]-(c:C)
(a:A)<--(b:B)(c:C)-->(d:C)
然而,在量化路径模式展开间接产生的情况下,将节点模式对放置在一起是有效的。
量化路径模式的迭代
当量化路径模式展开时,其括号中包含的固定路径模式会被重复并链接。这会导致节点模式对相互紧邻。以以下量化路径模式为例
((x:X)<--(y:Y)){3}
它是通过重复三次固定路径模式 (x:X)←-(y:Y) 展开的,变量上的索引表明没有暗示等连接(有关详细信息,请参阅等连接)
(x1:X)<--(y1:Y)(x2:X)<--(y2:Y)(x3:X)<--(y3:Y)
结果是两对节点模式相邻,(y1:Y)(x2:X) 和 (y2:Y)(x3:X)。在匹配过程中,每一对节点模式将匹配相同的节点,并且这些节点将满足节点模式中谓词的合取。例如,在第一对中,y1 和 x2 都将绑定到同一个节点,且该节点必须具有标签 X 和 Y。这种展开和绑定在下图中描绘
简单路径模式和量化路径模式
当简单路径模式放置在量化路径旁边时,也会产生节点模式对。例如,考虑以下路径模式
(:A)-[:R]->(:B) ((:X)<--(:Y)){1,2}
在展开量化路径模式的迭代后,右侧节点模式 (:B) 与左侧节点模式 (:X) 相邻。结果将匹配与以下两个路径模式的匹配并集相同的路径
(:A)-[:R]->(:B&X)<--(:Y)
(:A)-[:R]->(:B&X)<--(:Y&X)<--(:Y)
如果简单路径模式位于量化路径模式的右侧,其最左侧节点 (:A) 与量化路径模式最后一次迭代的最右侧节点 (:Y) 相邻。例如,以下内容
((:X)<--(:Y)){1,2} (:A)-[:R]->(:B)
将匹配与以下两个路径模式的并集相同的路径
(:X)<--(:Y&A)-[:R]->(:B)
(:X)<--(:Y&X)<--(:Y&A)-[:R]->(:B)