语法和语义
本节包含用于查找图模式匹配特定元素的语法和语义的参考材料。
节点模式
节点模式是一种匹配单个节点的模式。它可以单独用于诸如 MATCH
或 EXIST
之类的子句中,或者构成 路径模式的一部分。
另请参阅 节点模式概念。
语法
nodePattern ::= "(" [ nodeVariable ] [ labelExpression ]
[ propertyKeyValueExpression ] [ elementPatternWhereClause] ")"
elementPatternWhereClause ::= "WHERE" booleanExpression
有关有效节点变量名称的规则,请参阅 Cypher® 命名规则。
规则
谓词
可以在节点模式内指定三种类型的谓词
WHERE
子句的布尔表达式可以引用节点模式范围内任何变量。为了在布尔表达式中引用节点变量,需要在节点模式中声明它。
如果未指定任何谓词,则节点模式将匹配任何节点。
变量绑定
如果在查询的其他地方尚未声明变量,则在执行其包含的路径模式的匹配时,它将绑定到节点。如果它已在前面的子句中绑定,则不会将新节点绑定到该变量;任何先前绑定的节点如果与当前路径模式不匹配,都将导致匹配从结果中消除。有关子句之间结果传递的更多详细信息,请参阅关于 子句组合 的部分。
关系模式
关系模式是一种匹配单个关系的模式。它只能与位于其两侧的节点模式一起使用。
另请参阅 关系模式概念。
语法
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
子句结合使用。
路径模式
路径模式是针对图中路径匹配的顶级模式。
语法
pathVariableDeclaration ::= pathVariable "="
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
的两个实例之间引入等值连接,变量在每次迭代中都用一组新的变量替换。
(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 |
---|---|
|
|
|
|
现在,限定符已更改为匹配长度从 1 到 5 的路径。
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}
相比,这也匹配长度为 1 和 3 的路径,但长度大于 3 的路径不存在匹配项。
x_h | z_h |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
限定关系
规则
量化关系是量化路径模式的简写形式,只指定了一个关系模式。
例如,以下量化关系
(:A)-[r:R]->{m,n}(:B)
它匹配从类型为 A
的节点开始,到类型为 B
的节点结束的路径,路径中包含 m
到 n
个类型为 R
的从左到右的关系,并且匹配路径中的所有中间节点。它等价于以下量化路径模式
(: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}
的量化路径模式不等价于固定长度的路径模式。虽然生成的量化路径模式将匹配与其中包含的固定长度路径在没有量词的情况下匹配的相同路径,但量词的存在意味着路径模式中的所有变量都将作为组变量公开。
可变长度关系
在 Neo4j 5.9 中引入量化路径模式和量化关系的语法之前,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 星号的下限为零。可以使用上表来转换可变长度关系中使用的量词。量化路径模式给出的规则将应用于转换。
此表显示了一些示例
可变长度关系 | 等价的量化路径模式 |
---|---|
|
|
|
|
|
|
等值连接
可变长度关系的变量可以在后续模式中使用,以引用变量绑定的关系列表。这与等值连接绑定到单个节点或关系的变量相同。
本节使用以下图形
要重新创建图形,请针对空的 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 只允许路径遍历一次关系(请参阅关系唯一性),所以在同一图形模式中重复可变长度关系将不会产生任何结果。例如,此 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)
如果删除下限,它将默认为 1,并且将不再返回长度为零的路径,即单个节点
(: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
numberOfGroups ::= unsignedDecimalInteger
|
规则
选择性路径选择器
以下路径选择器类型是选择性路径选择器
-
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()
函数
在 Neo4j 5.21 中引入基于关键字的最短路径选择规范之前,最短路径的唯一可用语法是 shortestPath()
和 allShortestPaths()
函数。它们类似于 SHORTEST 1
和 ALL SHORTEST
,但有一些区别。
-
路径模式作为参数传递给函数。
-
路径模式限于单个关系模式。
-
要返回路径中第一个和最后一个节点相同的结果,需要更改配置设置
dbms.cypher.forbid_shortestpath_common_nodes
。
这两个函数将继续可用,但它们不是 GQL 兼容的。
语法
pathSelectorFunction ::=
{ shortestPathFunction | allShortestPathsFunction }
shortestPathFunction ::=
"shortestPath(" + oneHopPathPatternExpression + ")"
allShortestPathsFunction ::=
"allShortestPaths(" + oneRelPathPatternExpression + ")"
oneRelPathPatternExpression ::=
nodePattern varLengthRelationship nodePattern
请注意,可以将固定长度的路径模式(具有单个关系)传递给路径选择器函数,但这样做对发现最短路径没有任何作用。
规则
限制为可变长度
路径选择器函数中的模式必须是可变长度的关系,而不是量化的路径模式。
shortestPath(((a)-[:R]-(b)){1,5})
shortestPath((:A)-->+(:B))
路径模式长度
路径模式中必须恰好有一个关系模式。
shortestPath((a)-[:R*1..5]-(b))
shortestPath((a)-[:R*1..5]-(b)-->(:X))
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]-()
节点模式对
编写一对节点模式并排放置不是有效的语法。例如,以下所有操作都将引发语法错误。
(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)