语法和语义
本节包含查找图模式匹配特定元素的语法和语义的参考资料。
节点模式
节点模式是匹配单个节点的模式。它可以在诸如 MATCH
或 EXIST
等子句中单独使用,也可以构成路径模式的一部分。
另请参阅节点模式概念。
语法
nodePattern ::= "(" [ nodeVariable ] [ labelExpression ]
[ propertyKeyValueExpression ] [ elementPatternWhereClause] ")"
elementPatternWhereClause ::= "WHERE" booleanExpression
有关有效节点变量名称的规则,请参阅Cypher® 命名规则。
规则
变量绑定
如果变量未在查询的其他地方声明,则在执行其包含的路径模式匹配时,它将绑定到节点。如果它已在先前的子句中绑定,则不会有新节点绑定到该变量;任何先前绑定但与当前路径模式不匹配的节点将导致该匹配项从结果中消除。有关子句之间结果传递的更多详细信息,请参阅子句组合部分。
关系模式
关系模式是匹配单个关系的模式。它只能与其两侧的节点模式一起使用。
关系模式紧跟一个量词是量化路径模式的缩写形式,称为量化关系。
另请参阅关系模式概念。
语法
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 ]+
量化路径模式的嵌套
不允许嵌套量化路径模式。例如,不允许在量化路径模式中嵌套量化关系:
作为量化路径模式内布尔表达式一部分的量化路径模式不被视为嵌套,是允许的。
((x:A)){2,4}
组变量
在量化路径模式内部引入的变量在模式定义外部被称为作为组变量暴露。作为组变量,它们将绑定到节点列表或关系列表。相比之下,在声明它们的量化路径模式内部,变量可以被视为单例。这种区别可以在以下查询中看到:
(:A) (()-[:R]->+()){2,3} (:B)
在布尔表达式 z.p > x.p
中,z
和 x
都是单例;在 RETURN
子句中,x
是一个可以像列表一样迭代的组变量。请注意,这意味着上面的 WHERE
子句 z.p > x.p
需要放在量化路径模式内部。以下操作会抛出语法错误,因为它将 z
和 p
视为单例:
MATCH ((n:A)-[:R]->({p: 30}) WHERE EXISTS { (n)-->+(:X) }){2,3}
然而,可以将 WHERE
子句放置在节点模式之外。
MATCH ((x)-[r]->(z WHERE z.p > x.p)){2,3}
RETURN [n in x | n.p] AS x_p
将量化路径模式与路径匹配的机制最好通过示例解释。对于本示例,将使用以下简单图:
MATCH ((x)-[r]->(z)){2,3} WHERE z.p > x.p
首先,考虑以下简单路径模式:
MATCH ((x)-[r]->(z) WHERE z.p > x.p){2,3}
这匹配了上图中的三个不同路径。每个匹配的 x
和 z
的结果绑定如下(n1
等标题表示上图中节点的身份):
x
z
(x:A)-[:R]->(z:B WHERE z.h > 2)
n1
n2 | n3 |
---|---|
|
|
|
|
|
|
然后,相邻节点模式中的节点变量被合并。
((x:A)-[:R]->(z:B WHERE z.h > 2)){2}
变量 x2
和 z1
绑定到相同节点模式的匹配项这一事实用 {z1,x2}
表示。在模式之外,变量 x
和 z
将是包含节点列表的组变量。
(x:A)-[:R]->(z:B WHERE z.h > 2) (x:A)-[:R]->(z:B WHERE z.h > 2)
考虑以下查询中的量化路径模式:
(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)
x_h
z_h
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
现在量词更改为匹配长度从一到五:
与固定长度量词 {2} 相比,这也匹配长度为一和三的路径,但没有匹配长度大于三的路径。 |
量化关系 |
---|---|
|
|
|
|
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} 相比,这也匹配长度为一和三的路径,但没有匹配长度大于三的路径。 |
量化关系 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
量化关系是量化路径模式的缩写形式,只指定了一个关系模式。
例如,以下量化关系:
quantifiedRelationship ::= relationshipPattern quantifier
它匹配包含 m
到 n
个类型为 R
的关系(从左到右指向),从类型为 A
的节点开始,到类型为 B
的节点结束,并匹配中间的任何节点。它等同于以下量化路径模式:
使用量化路径模式的扩展形式,可以在内部添加谓词。反之,如果唯一的谓词是关系类型表达式,则使用量化关系可以使查询语法更简洁。
请注意,与量化路径模式不同,量化关系的两侧必须始终有一个节点模式。
(:A)-[r:R]->{m,n}(:B)
(:A) (()-[r:R]->()){m,n} (:B)
匹配一个或多个类型为 R
且任何方向的关系,以及连接这些关系的任何节点
匹配由两条入站子路径组成的路径,一条包含类型为 R
的关系,另一条包含类型为 S
的关系,并在标签为 A
的节点处相遇
unsignedDecimalInteger
不得大于 Java 常量 Long.MAX_VALUE
(263-1)。
通用量词语法中没有上限意味着没有上限。下表显示了量词语法的变体及其规范形式:
quantifier ::=
"*" | "+" | fixedQuantifier | generalQuantifier
fixedQuantifier ::= "{" unsignedDecimalInteger "}"
generalQuantifier ::= "{" lowerBound "," upperBound "}"
lowerBound ::= unsignedDecimalInteger
upperBound ::= unsignedDecimalInteger
unsignedDecimalInteger ::= [0-9]+
变体 |
规范形式
{m,n}
m 到 n 次迭代之间。 |
1 次或更多次迭代。 | 描述 |
---|---|---|
|
|
{n} |
|
|
{n,n} |
|
|
恰好 |
|
|
{,n} |
|
|
0 到 |
|
在 Neo4j 5.9 中引入量化路径模式和量化关系语法之前,Cypher 中匹配可变长度路径的唯一方法是使用可变长度关系。此语法仍然可用,但它不符合GQL。它等同于量化关系的语法,但有以下不同之处: |
|
|
|
恰好 |
量词的位置和语法。
星号的语义。
类型表达式仅限于析取运算符。
-
不允许使用WHERE子句。
-
有关有效关系变量名称的规则,请参阅Cypher 命名规则。
下表显示了可变长度量词语法的变体及其等效量词形式(量化路径模式使用的形式):
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]+
变体 |
等效量化关系
等效量化路径模式
-[*n]->
m 到 n 次迭代之间。 |
描述 | -[]->{n} | (()-[]->()){n} |
---|---|---|---|
|
{n,n} |
|
|
|
{,n} |
|
|
|
{n} |
|
|
|
0 到 |
|
|
|
恰好 |
|
|
|
-[*0..n]-> |
|
|
|
在 Neo4j 5.9 中引入量化路径模式和量化关系语法之前,Cypher 中匹配可变长度路径的唯一方法是使用可变长度关系。此语法仍然可用,但它不符合GQL。它等同于量化关系的语法,但有以下不同之处: |
|
|
等效量化路径模式
(a)-[*2]->(b)
(a) (()-[]->()){2,2} (b) | (a)-[:KNOWS*3..5]->(b) |
---|---|
|
|
|
|
|
|
要重新创建图,请针对空的 Neo4j 数据库运行以下查询:
查询
在以下查询中,节点变量将绑定到相同的节点:
表 1. 结果
CREATE ({name: 'Filipa'})-[:KNOWS]->({name:'Anders'})-[:KNOWS]->
({name:'Dilshad'})
b = d
MATCH (a {name: 'Dilshad'})<-[r*1..2]-(b)
MATCH (c)<-[r*1..2]-(d)
RETURN a = c, b = d, size(r)
true | 行数:2 | 关系列表保持其顺序。这意味着在以下查询中,当第二个 MATCH 中可变长度关系的方向发生切换时,等值连接只会匹配一次,即当只有一个关系时。 |
---|---|---|
|
|
|
|
|
|
false |
行数:1
MATCH (a {name: 'Dilshad'})<-[r*1..2]-(b)
MATCH (c)-[r*1..2]->(d)
RETURN a = c, b = d, size(r)
true | 行数:2 | 关系列表保持其顺序。这意味着在以下查询中,当第二个 MATCH 中可变长度关系的方向发生切换时,等值连接只会匹配一次,即当只有一个关系时。 |
---|---|---|
|
|
|
a = d |
b = c
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)
更改后续 MATCH 语句上的边界意味着只有量词边界的重叠长度才会产生结果。 |
表 4. 结果 | 由于 Cypher 只允许路径在给定图模式匹配中遍历关系一次(请参阅关系唯一性),在同一图模式中重复可变长度关系将不会产生任何结果。例如,此 MATCH 子句将永远不会将任何中间结果传递给后续子句。 |
---|---|---|
|
|
|
|
|
|
false |
尝试在单个关系模式中重复可变长度关系将引发错误。例如,以下模式会引发错误,因为变量 r
同时出现在可变长度关系和固定长度关系中。
MATCH (a {name: 'Dilshad'})<-[r*1..2]-(b)
MATCH (c)<-[r*2..3]-(d)
RETURN a = c, b = d, size(r)
true | 行数:2 | 关系列表保持其顺序。这意味着在以下查询中,当第二个 MATCH 中可变长度关系的方向发生切换时,等值连接只会匹配一次,即当只有一个关系时。 |
---|---|---|
|
|
|
a = d |
以下模式匹配以标签为 A
的节点开始,以标签为 B
的节点结束的路径,这些路径遍历类型为 R
的二到三个关系。
MATCH (x)-[r*1..2]->(y)-[r*1..2]->(z)
以下遍历类型为 R
或 S
或 T
的关系恰好五次。
MATCH (x)-[r*1..2]->(y)-[r]->(z)
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
变体 |
这意味着它们减少了路径模式产生的匹配数量。ALL
返回所有生成的匹配,因此不是选择性的。
路径选择顺序
指定路径选择器时,按以下步骤查找路径模式的解决方案:
-
ANY k
-
前三种是最短路径选择器,它们指定应返回哪些最短路径,具体选择方法取决于路径选择器类型和
k
的值。 -
ALL
-
有关在路径模式中何处包含路径选择器的详细信息,请参阅路径模式。
找到所有匹配路径模式的路径。
移除不满足路径模式中谓词的任何路径。这是一个预过滤器。
根据指定的路径选择器选择路径。
// 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
条路径,从最短的开始。如果给定长度可以选择多条路径,则选择没有特定顺序。如果 k
大于分区中的路径数量,则返回该分区中的所有路径。
ANY SHORTEST 等同于 SHORTEST 1 。 |
路径按路径长度进一步分组,这些组按路径长度升序排列。然后选择前 k 个组中的路径。如果 k 大于分区中路径长度组的数量,则返回该分区中的所有路径。GROUP 和 GROUPS 可以互换使用。 |
---|---|
|
所有最短路径长度相同的路径。等同于 返回任意 |
|
返回所有路径。这与不指定任何路径选择器相同。 |
|
对于选择性路径选择器,如果 |
|
|
当为路径模式指定选择性最短路径选择器时,它必须是图模式中唯一的路径模式。 |
关键字 PATH
和 PATHS
是可选的,可以添加到路径选择器的末尾(但在 GROUP
或 GROUPS
之前)。包含其中任何一个都不会改变路径选择。例如,以下两个 MATCH
子句是等效的:
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)
的每对不同节点的一条最短路径。
返回连接匹配 (:A)
和 (:B)
的每对不同节点的任意两条路径。
MATCH ALL SHORTEST PATHS (n:A) (()-->(:B))+
MATCH ALL SHORTEST (n:A) (()-->(:B))+
返回匹配 (:A)
和 (:B)
的每对不同节点的所有与最短路径长度相同的路径。
返回匹配 (:A)
和 (:B)
的每对不同节点的所有与两条最短路径长度相同的路径。
MATCH SHORTEST 1 (:A)-[:R]->{0,10}(:B)
返回每对不同节点的一条最短路径,其中路径长度为偶数。
MATCH p = ANY 2 (:A)-[:R]->{0,10}(:B)
对于连接每对不同节点的每一条最短路径,只返回路径长度为偶数的那些(因此结果少于上一个示例)。
MATCH ALL SHORTEST (:A)-[:R]->{0,10}(:B)
MATCH SHORTEST 2 GROUPS (:A)-[:R]->{0,10}(:B)
在 Neo4j 5.21 中引入基于关键字的最短路径选择规范之前,最短路径的唯一可用语法是 shortestPath()
和 allShortestPaths()
函数。它们与 SHORTEST 1
和 ALL SHORTEST
相似,但有几个区别:
MATCH SHORTEST 1 (p = ()--+() WHERE length(p) % 2 = 0)
路径模式作为参数传递给函数。
MATCH p = SHORTEST 2 ()--+()
WHERE length(p) % 2 = 0
路径模式仅限于单个关系模式。
要返回路径中第一个和最后一个节点相同的查询结果,需要更改配置设置dbms.cypher.forbid_shortestpath_common_nodes
。
-
最小路径长度,也称为可变长度关系模式的下限,应为 0 或 1。
-
这两个函数将继续可用,但它们不符合GQL。
-
请注意,可以将固定长度路径模式(包含单个关系)传递给路径选择器函数,但这样做对于发现最短路径没有任何意义。
仅限于可变长度关系
pathSelectorFunction ::=
{ shortestPathFunction | allShortestPathsFunction }
shortestPathFunction ::=
"shortestPath(" + oneHopPathPatternExpression + ")"
allShortestPathsFunction ::=
"allShortestPaths(" + oneRelPathPatternExpression + ")"
oneRelPathPatternExpression ::=
nodePattern varLengthRelationship nodePattern
路径选择器函数中的模式必须是可变长度关系,而不是量化路径模式。
路径模式长度
路径模式中必须只有一个关系模式,并且下限应为 0 或 1。
shortestPath(((a)-[:R]-(b)){1,5})
shortestPath((:A)-->+(:B))
如果 shortestPath()
函数的 MATCH
子句包含 WHERE
子句,此条件将作为前置过滤器:首先找到满足 WHERE
子句的路径,然后从这些路径中选择最短路径。
这与不属于同一 MATCH
子句的 WHERE
子句形成对比。
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))
后过滤器示例:
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)
如果存在多条最短长度路径,则 shortestPath()
函数将非确定性地返回其中一条。由于 allShortestPaths()
将返回所有这些路径,因此其结果是确定性的。
规则
路径模式的规则适用于图模式的每个组成路径模式。
变量引用
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
两次引用同一个节点,形成一个循环:
以下模式在同一图模式的不同路径模式中使用变量 b
引用同一个节点,形成一个“T”形模式:
等值连接只能使用量化路径模式之外的变量进行。以下内容不是有效的等值连接:
如果图模式中的路径模式之间不存在等值连接,则会从每个路径模式的匹配集中形成笛卡尔连接。通过多次声明关系变量,可以在关系模式之间表达等值连接。然而,由于关系在给定匹配中只能遍历一次,因此不会返回任何解决方案。
(a)-->(b)-->(c)-->(a)
(a)-->(b)-->(c), (b)-->(e)
WHERE
子句可以引用量化路径模式内部和外部的变量。
(a)-->(b)-->(c), ((b)-->(e))+ (:X)
可以形成等值连接来匹配“H”形图。
如果没有共同变量,此图模式将导致两个路径模式匹配集之间的笛卡尔连接。
路径模式之间可以形成多个等值连接。
(a)-->(b)-->(c), (b) ((d)-->(e))+ WHERE any(n in d WHERE n.p = a.p)
在之前的 MATCH
中声明的变量可以在量化路径模式内部引用。
(:A)-->(x)--(:B), (x)-[:R]->+(y), (:C)-->(y)-->(:D)
以下关系变量的重复不会产生任何解决方案,因为 Cypher 在图模式的匹配中强制执行关系唯一性。
(a)-->(b)-->(c), ((d)-->(e))+
(:X)-->(a:A)-[!:R]->+(b:B)-->(:Y), (a)-[:R]->+(b)
将一对节点模式写在一起不是有效的语法。例如,以下所有情况都会引发语法错误:
MATCH (n {p = 'ABC'})
MATCH (n)-->(m:A)-->(:B), (m) (()-[r WHERE r.p <> n.p]->())+ (:C)
然而,如果节点模式对相邻放置是量化路径模式扩展的间接结果,则是有效的。
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)
三次来扩展,变量上带有索引以表明不涉及等值连接(有关更多信息,请参阅等值连接)。
结果是两对节点模式相互邻接,(y1:Y)(x2:X)
和 (y2:Y)(x3:X)
。在匹配过程中,每对节点模式将匹配相同的节点,并且这些节点将满足节点模式中谓词的合取。例如,在第一对中,y1
和 x2
都将绑定到同一个节点,并且该节点必须具有标签 X
和 Y
。这种扩展和绑定如下图所示:
((x:X)<--(y:Y)){3}
当简单路径模式放置在量化路径模式旁边时,也会生成节点模式对。例如,考虑以下路径模式:
(x1:X)<--(y1:Y)(x2:X)<--(y2:Y)(x3:X)<--(y3:Y)
展开量化路径模式的迭代后,右手侧的节点模式 (:B)
与左手侧的节点模式 (:X)
相邻。结果将匹配与以下两个路径模式的匹配并集相同的路径:
如果简单路径模式位于量化路径模式的右侧,其最左侧节点 (:A)
与量化路径模式最后一次迭代的最右侧节点 (:Y)
相邻。例如,以下内容:
将匹配与以下两个路径模式的并集相同的路径:
(:A)-[:R]->(:B) ((:X)<--(:Y)){1,2}
(:A)-[:R]->(:B&X)<--(:Y)
(:A)-[:R]->(:B&X)<--(:Y&X)<--(:Y)
当两个量化路径模式相邻时,第一个模式最后一次迭代的最右侧节点与第二个模式第一次迭代的最左侧节点合并。例如,以下相邻模式:
((:X)<--(:Y)){1,2} (:A)-[:R]->(:B)
将匹配与这两个路径模式所匹配路径的并集相同的路径集:
(:X)<--(:Y&A)-[:R]->(:B)
(:X)<--(:Y&X)<--(:Y&A)-[:R]->(:B)