语法与语义

本节包含用于查找图模式匹配特定元素的语法和语义的参考资料。

节点模式 (Node patterns)

节点模式是匹配单个节点的模式。它可以单独用于 MATCHEXIST 等子句中,也可以构成路径模式的一部分。

另请参阅 节点模式概念

语法

nodePattern ::= "(" [ nodeVariable ] [ labelExpression ]
    [ propertyKeyValueExpression ] [ elementPatternWhereClause] ")"

elementPatternWhereClause ::= "WHERE" booleanExpression

有关有效节点变量命名的规则,请参阅 Cypher® 命名规则

规则

谓词

节点模式内部可以指定三种类型的谓词:

WHERE 子句的布尔表达式可以引用节点模式作用域内的任何变量。为了在布尔表达式中引用节点变量,必须在节点模式中声明该变量。

如果未指定任何谓词,则该节点模式匹配任何节点。

变量绑定

如果变量未在查询的其他位置声明,则在执行其所属的路径模式匹配时,它将被绑定到节点。如果该变量已在之前的子句中绑定,则不会有新节点绑定到该变量;任何在当前路径模式中不匹配的先前已绑定节点,都将导致该匹配项从结果中剔除。有关在子句之间传递结果的更多详细信息,请参阅子句组合一节。

示例

匹配所有标签为 A 的节点,并将它们绑定到变量 n

(n:A)

匹配所有标签为 B 且具有 departs 属性(其 time 值为 11:11)的节点

(:B { departs: time('11:11') })

匹配所有 departs 属性值等于当前时间加上 30 分钟的节点

(n WHERE n.departs > time() + duration('PT30M'))

关系模式 (Relationship patterns)

关系模式是匹配单个关系的模式。它只能与其两侧的节点模式一起使用。

紧跟在量词之后的关系模式是一种缩写的量化路径模式,称为量化关系

另请参阅 关系模式概念

语法

relationshipPattern ::= fullPattern | abbreviatedRelationship

fullPattern ::=
    "<-[" patternFiller "]-"
  | "-[" patternFiller "]->"
  | "-[" patternFiller "]-"

abbreviatedRelationship ::= "<--" | "--" | "-->"

patternFiller ::= [ relationshipVariable ] [ typeExpression ]
    [ propertyKeyValueExpression ] [ elementPatternWhereClause ]

elementPatternWhereClause ::= "WHERE" booleanExpression

请注意,关系模式中的类型表达式语法与节点模式中的标签表达式语法相同(尽管与节点标签不同,关系必须且只能有一个类型)。

有关有效关系变量命名的规则,请参阅 Cypher 命名规则

规则

谓词

在完整关系模式(即带有方括号的模式)的模式填充中,可以指定以下三种类型的谓词:

第四种谓词使用小于号或大于号(<>)形成箭头,来指定关系相对于整个路径模式的方向性。如果关系模式没有箭头,它将匹配任何方向的关系。

WHERE 子句的布尔表达式可以引用关系模式作用域内的任何变量。为了在布尔表达式中引用关系变量,必须在模式中声明该变量。

如果未指定谓词,则该模式匹配所有关系。

变量绑定

如果变量未在查询的其他位置声明,则在执行其所属的路径模式匹配时,它将被绑定到关系。如果该变量已在之前的子句中绑定,则不会有新关系绑定到该变量;如果任何先前已绑定的关系在当前路径模式中不匹配,则这些匹配项将从结果中剔除。

有关在子句之间传递结果的更多详细信息,请参阅子句组合章节。

示例

匹配所有类型为 R 的关系,并将它们绑定到变量 r

()-[r:R]->()

匹配所有类型为 Rdistance 属性等于 100 的关系

()-[:R {distance: 100}]->()

匹配所有 distance 属性在 10100 之间的关系

()-[r WHERE 10 < r.distance < 100]->()

匹配所有以标签为 A 的节点为源、以标签为 B 的节点为目标的关系

(:A)-->(:B)

匹配所有连接标签为 A 的节点和标签为 B 的节点的关系,无论方向如何

(:A)--(:B)

标签表达式

以下内容适用于节点模式的标签表达式和关系模式的类型表达式。

标签表达式是一个布尔谓词,由标签名称和通配符组成,使用析取(或)、合取(与)、否定(非)和分组。当标签表达式匹配节点的标签集时,它返回 true。

尽管关系具有类型而不是标签,但匹配关系类型的表达式语法与标签表达式相同。

语法

labelExpression ::= ":" labelTerm

labelTerm ::=
    labelIdentifier
  | labelTerm "&" labelTerm
  | labelTerm "|" labelTerm
  | "!" labelTerm
  | "%"
  | "(" labelTerm ")"

有关有效的标签标识符,请参阅 Cypher 命名规则

规则

下表列出了标签表达式中使用的符号

符号 描述 优先级

%

通配符。如果标签集非空,则求值为 true

()

括号内的表达式在评估包含该组的外部表达式之前进行评估。

1(最高)

!

否定

2

&

合取

3

|

析取

4(最低)

结合性为从左到右。

示例

在下表中,打钩处表示标签表达式与显示了相应标签的节点匹配

节点

节点模式

()

(:A)

(:B)

(:C)

(:A:B)

(:A:C)

(:B:C)

(:A:B:C)

()

(:A)

(:A&B)

(:A|B)

(:!A)

(:!!A)

(:A&!A)

(:A|!A)

(:%)

(:!%)

(:%|!%)

(:%&!%)

(:A&%)

(:A|%)

(:(A&B)&!(B&C))

(:!A&%)

由于每个关系恰好只有一个类型,此表达式永远不会匹配关系

-[:A&B]->

类似地,以下表达式将始终匹配关系

-[:%]->

否定词的使用可以使合取在关系模式中非常有用。以下表达式匹配类型既不是 A 也不是 B 的关系

-[:!A&!B]->

动态标签和类型表达式

节点标签和关系类型可以在表达式、参数和标签表达式内的变量中动态引用。

动态创建节点和关系的语法
dynamicLabelExpression ::= ":$(" + valueExpression ")"

valueExpression 必须求值为 STRING NOT NULL | LIST<STRING NOT NULL> NOT NULL 值。

属性键值表达式

语法

propertyKeyValueExpression ::=
  "{" propertyKeyValuePairList "}"

propertyKeyValuePairList ::=
  propertyKeyValuePair [ "," propertyKeyValuePair ]

propertyKeyValuePair ::= propertyName ":" valueExpression

规则

属性键值表达式被视为包含该模式的元素属性上的等式合取。

例如,以下节点模式

({ p: valueExp1, q: valueExp2 })

等同于带有 WHERE 子句的以下节点模式

(n WHERE n.p = valueExp1 AND n.q = valueExp2)

值表达式可以是 表达式 一节中列出的任何表达式,路径模式除外(这会抛出语法错误),正则表达式除外(会被视为字符串字面量)。空的属性键值表达式匹配所有元素。属性键值表达式可以与 WHERE 子句结合使用。

示例

匹配所有属性 p = 10 的节点

({ p: 10 })

匹配所有属性 p = 10q 等于日期 2023-02-10 的关系

()-[{ p: 10, q: date('2023-02-10') }]-()

匹配所有属性 p 等于其源节点属性 p 的关系

(s)-[{ p: s.p }]-()

匹配所有属性 p = 10 且属性 q 大于 100 的节点

(n { p: 10 } WHERE n.q > 100)

路径模式 (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

请参阅每个语法规则的相关章节

shortestPathSelector

quantifiedPathPattern

nodePattern

relationshipPattern

quantifiedRelationship

规则

路径模式中的元素最小数量必须大于零。例如,不允许使用下限为零的量化路径模式

不允许
((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)

作为量化路径模式内布尔表达式一部分的量化路径模式不计为嵌套,是允许的。

允许
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 中,zx 都是单例;在 RETURN 子句中,x 是一个可以像列表一样迭代的组变量。请注意,这意味着上述 WHERE 子句 z.p > x.p 需要在量化路径模式内部。以下查询会抛出语法错误,因为它将 zp 视为单例

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

这与上图中的三条不同路径相匹配。每个匹配的 xz 的绑定结果如下(标题 n1 等表示上图中节点的身份)

x z

n1

n2

n2

n3

n3

n5

如果量词 {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)

变量 x2z1 绑定到相同节点模式的匹配项这一事实由符号 {z1,x2} 表示。在模式之外,变量 xz 将是包含节点列表的组变量。

考虑以下查询中的量化路径模式

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, 3]

[3, 4]

[3, 4]

[4, 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} 相比,这也匹配长度为一和三的路径,但不存在长度大于三的匹配项

x_h z_h

[1]

[3]

[3]

[4]

[4]

[5]

[1, 3]

[3, 4]

[3, 4]

[4, 5]

[1, 3, 4]

[3, 4, 5]

量化关系

语法

quantifiedRelationship ::= relationshipPattern quantifier

规则

量化关系是量化路径模式的一种缩写形式,仅指定单个关系模式。

例如,以下量化关系

(:A)-[r:R]->{m,n}(:B)

它匹配路径,这些路径具有 mn 个类型为 R 的关系,从左到右指向,始于类型为 A 的节点,终于类型为 B 的节点,并匹配中间的任何节点。它等同于以下量化路径模式

(:A) (()-[r:R]->()){m,n} (:B)

使用量化路径模式的扩展形式,可以在内部添加谓词。相反,如果唯一的谓词是关系类型表达式,使用量化关系可以使查询语法更简洁。

请注意,与量化路径模式不同,量化关系必须始终在每一侧都有一个节点模式。

示例

匹配一个或多个类型为 R 的关系(任何方向),以及连接这些关系的任何节点

()-[:R]-+()

匹配由两条入站子路径组成的路径,一条是类型为 R 的关系,一条是类型为 S 的关系,它们汇合于一个标签为 A 的节点

()-[:R]->+(:A)<-[:S]-+()

匹配包含任何节点以及一个或多个任何方向和任何类型的关系的路径

()--+()

匹配以标签为 A 的节点开始并以标签为 B 的节点结束的路径,其遍历两个到三个类型为 R 的关系,匹配任何中间节点

(:A)-[r:R]->{2,3}(:B)

量词

此处的量词仅指用于量化路径模式量化关系中的那些量词。

语法

quantifier ::=
  "*" | "+" | fixedQuantifier | generalQuantifier

fixedQuantifier ::= "{" unsignedDecimalInteger "}"

generalQuantifier ::= "{" lowerBound "," upperBound "}"

lowerBound ::= unsignedDecimalInteger

upperBound ::= unsignedDecimalInteger

unsignedDecimalInteger ::= [0-9]+

unsignedDecimalInteger 不得大于 Java 常量 Long.MAX_VALUE (263-1)。

规则

通用量词语法中没有上限意味着没有上限。下表显示了量词语法的变体及其规范形式

变体 规范形式 描述

{m,n}

{m,n}

介于 m 和 n 次迭代之间。

+

{1,}

1 次或多次迭代。

*

{0,}

0 次或多次迭代。

{n}

{n,n}

恰好 n 次迭代。

{m,}

{m,}

m 次或更多次迭代。

{,n}

{0,n}

介于 0 和 n 次迭代之间。

{,}

{0,}

0 次或多次迭代。

请注意,具有量词 {1}量化路径模式不等同于定长路径模式。虽然生成的量化路径模式会与其中包含的定长路径模式匹配相同的路径(不带量词),但量词的存在意味着路径模式内的所有变量都将作为组变量公开。

可变长度关系

在引入量化路径模式和量化关系语法之前,在 Cypher 中匹配可变长度路径的唯一方法是使用可变长度关系。此语法仍然可用,但它不符合 GQL 标准。它等同于量化关系的语法,但有以下区别

  • 量词的位置和语法。

  • 星号符号的语义。

  • 类型表达式仅限于析取运算符

  • 不允许使用 WHERE 子句。

语法

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]+

unsignedDecimalInteger 不得大于 Java 常量 Long.MAX_VALUE (263-1)。

有关有效关系变量命名的规则,请参阅 Cypher 命名规则

规则

下表显示了可变长度量词语法的变体及其等效的量词形式(量化路径模式使用的形式)

变体 描述 等效的量化关系 等效的量化路径模式

-[*]->

1 次或多次迭代。

-[]->+

(()-[]->())+

-[*n]->

恰好 n 次迭代。

-[]->{n}

(()-[]->()){n}

-[*m..n]->

介于 m 和 n 次迭代之间。

-[]->{m,n}

(()-[]->()){m,n}

-[*m..]->

m 次或更多次迭代。

-[]->{m,}

(()-[]->()){m,}

-[*0..]->

0 次或多次迭代。

-[]->*

(()-[]->())*

-[*..n]->

介于 1 和 n 次迭代之间。

-[]->{1,n}

(()-[]->()){1,n}

-[*0..n]->

介于 0 和 n 次迭代之间。

-[]->{,n}

(()-[]->()){,n}

请注意,此处单独使用的 * 与 Kleene 星号(代表零次或多次重复的运算符)不同,因为 Kleene 星号的下限为零。上表可用于转换可变长度关系中使用的量词。为量化路径模式给出的规则适用于此转换。

此表显示了一些示例

可变长度关系 等效的量化路径模式

(a)-[*2]->(b)

(a) (()-[]->()){2,2} (b)

(a)-[:KNOWS*3..5]->(b)

(a) (()-[:KNOWS]->()){3,5} (b)

(a)-[r*..5 {name: 'Filipa'}]->(b)

(a) (()-[r {name: 'Filipa'}]->()){1,5} (b)

等连接 (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)

true

true

1

true

true

2

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

false

false

1

行: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()

true

true

1

true

true

2

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

true

true

2

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

以下模式恰好遍历类型为 RST 的关系五次

()-[r:R|S|T*5]->()

以下模式遍历任何关系零到五次,路径以标签为 A 的节点开始并以标签为 B 的节点结束。请注意,对于遍历零个关系的情况,这也将返回所有同时具有 AB 标签的节点

(: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

unsignedDecimalInteger 不得大于 Java 常量 Long.MAX_VALUE (263-1)。

规则

选择性路径选择器

以下路径选择器类型是“选择性”路径选择器

  • SHORTEST k

  • SHORTEST k GROUPS

  • ALL SHORTEST

  • ANY k

这意味着它们减少了路径模式产生的匹配项数量。ALL 返回产生的所有匹配项,因此不具有选择性。

路径选择顺序

当指定了路径选择器时,将遵循以下步骤来查找路径模式的解

  1. 找到所有与路径模式匹配的路径。

  2. 删除任何不满足路径模式中包含的谓词的路径。这是一个“预”过滤器。

  3. 根据指定的路径选择器选择路径。

  4. 删除任何不满足图模式 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)

分区

如果存在多个匹配路径模式的开始节点和结束节点,那么当指定了选择性路径选择器时,路径模式匹配的路径将根据开始节点和结束节点的唯一对进行分区。在每个分区内,它们按路径长度升序排列。然后根据指定的路径选择器选择分区路径,如下所示

选择性路径选择器 分区

SHORTEST k

k 条路径,从最短的开始。如果有多个路径对于给定的长度可以被选择,则选择顺序没有特定的先后。如果 k 大于分区中的路径数,则返回该分区中的所有路径。

ANY SHORTEST 等同于 SHORTEST 1

SHORTEST k GROUPS

路径进一步按路径长度分组,这些组按路径长度升序排列。然后选择前 k 组中的路径。如果 k 大于分区内的路径长度组数,则返回该分区中的所有路径。GROUPGROUPS 可以互换使用。

ALL SHORTEST

所有并列最短的路径。等同于 SHORTEST 1 GROUP

ANY k

返回任意 k 条路径。ANYANY 1 相同。这对于确定节点的连通性非常有用。

ALL

返回所有路径。这与不指定任何路径选择器相同。

对于选择性路径选择器,如果 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

PATH/PATHS

关键字 PATHPATHS 是可选的,可以添加到路径选择器的末尾(但在 GROUPGROUPS 之前)。包含它们中的任何一个都不会改变路径选择。例如,以下两个 MATCH 子句是等效的

MATCH ALL SHORTEST PATHS (n:A) (()-->(:B))+
MATCH ALL SHORTEST (n:A) (()-->(:B))+

示例

为匹配 (: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 1ALL 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)

不确定性

如果存在多条具有最小长度的路径,则 shortestPath() 函数将不确定地返回其中一条路径。由于 allShortestPaths() 会返回所有这些路径,因此其结果是确定性的。

示例

为匹配 (:A)(:B) 的每一对不同的节点返回一条最短路径

MATCH shortestPath((:A)-[:R*0..10]->(:B))

为匹配 (:A)(:B) 的每一对不同的节点返回等于最短路径长度的所有路径

MATCH allShortestPaths((:A)-[:R*0..10]->(:B))

图模式

图模式是一个或多个路径模式的逗号分隔列表。它是提供给 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 包含两种匹配模式

语法

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

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 子句之后的 COLLECTCOUNTEXISTS 子查询中允许使用匹配模式。如果是这样,匹配模式将应用于子查询中匹配的模式,并与应用于顶级图模式的模式分开。在以下示例中,REPEATABLE ELEMENTS 仅应用于在 COUNT 子查询中匹配的模式

MATCH (a)-[:R]->(b)
WHERE COUNT {
    MATCH REPEATABLE ELEMENTS (a)-[:S]-{,10}(b)
    RETURN *
} > 5
RETURN *

选择性路径选择器

以下内容适用于匹配模式以及带有选择性路径选择器SHORTEST kSHORTEST k GROUPSALL SHORTESTANY k)的路径模式数量。

  • 如果匹配模式是 DIFFERENT RELATIONSHIPS,则如果它带有选择性路径选择器,则只能有一个路径模式。

  • 如果匹配模式是 REPEATABLE ELEMENTS,即使一个或多个路径模式带有选择性路径选择器,也可以有多个路径模式。

允许:带有选择性路径选择器且仅有一个路径模式的 DIFFERENT RELATIONSHIPS
MATCH SHORTEST 2 ((a)--(b) WHERE a.p < b.p)+
允许:带有多个路径模式和选择性路径选择器的 REPEATABLE ELEMENTS
MATCH REPEATABLE ELEMENTS SHORTEST 2 (x) ((a)--(b) WHERE a.p < b.p){,10},
      ANY (x)-->{,10}(:X)
不允许:带有多个路径模式和选择性路径选择器的 DIFFERENT RELATIONSHIPS
MATCH 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)。为了使该模式返回任何结果,必须重新遍历相同的关系。也就是说,连接 ab 的相同关系必须与连接 bc 的关系是同一个。

如果使用 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
结果
节点

[3, 2, 3]

[4, 2, 4]

[3, 2, 3]

[1, 2, 1]

行:4

DIFFERENT RELATIONSHIPS 匹配模式仅允许节点在路径中重复。

使用 DIFFERENT RELATIONSHIPS 匹配长度为 5 个关系的模式
MATCH p = (:B)-->{5}()
RETURN [n IN nodes(p) | n.q] AS nodes
结果
节点

[2, 3, 2, 4, 1, 2]

[2, 4, 1, 2, 3, 2]

行:2

REPEATABLE ELEMENTS 匹配模式允许节点和关系在路径中被重复遍历。

使用 REPEATABLE ELEMENTS 匹配长度为 5 个关系的模式
MATCH REPEATABLE ELEMENTS p = (:B)-->{5}()
RETURN [n IN nodes(p) | n.q] AS nodes
结果
节点

[2, 3, 2, 3, 2, 3]

[2, 3, 2, 3, 2, 4]

[2, 3, 2, 4, 1, 2]

[2, 4, 1, 2, 3, 2]

[2, 4, 1, 2, 4, 1]

行:2

路径模式 (Path modes)

路径模式定义了单个路径模式内节点和关系的唯一性约束。这与匹配模式形成对比,后者约束整个 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
GQLSTATUS 错误链

42N61:错误:语法错误或访问规则冲突 - 不支持混合使用不同的路径模式。不支持在同一图模式中混合使用 ACYCLIC 和 TRAIL。请改为将模式拆分为单独的 MATCH 子句。

42001:错误:语法错误或访问规则冲突 - 无效语法

只有 WALK 可以与 REPEATABLE ELEMENTS 匹配模式结合使用

ACYCLICTRAIL 这样的显式路径模式不能与 REPEATABLE ELEMENTS 匹配模式一起使用。例如

MATCH REPEATABLE ELEMENTS p = ACYCLIC (n)-->{1, 10}(m)
RETURN p
GQLSTATUS 错误链

42N60:错误:语法错误或访问规则冲突 - 不支持匹配模式和路径模式的组合。不支持在 ACYCLIC 路径模式下使用 REPEATABLE ELEMENTS。

42001:错误:语法错误或访问规则冲突 - 无效语法

不允许混合使用限制性路径选择器和显式路径模式

显式路径模式目前不能与限制性路径选择器(例如 ANYSHORTEST)或传统的最短路径函数(如 shortestPath())结合使用。例如

MATCH p = ANY ACYCLIC (start)-->(target)
RETURN p
GQLSTATUS 错误链

51N26:错误:系统配置或操作异常 - 此版本不支持。不支持同时使用 SHORTEST 和显式路径模式 ACYCLIC。此 Cypher 实现不支持在 ACYCLIC 路径模式下使用 SHORTEST。

42001:错误:语法错误或访问规则冲突 - 无效语法

路径模式不能应用于 MERGE 子句

例如,这是不允许的

MERGE ACYCLIC (robert:Critic)-[:P]->(c:Critic)
GQLSTATUS 错误链

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

子查询中的路径模式作用域

子查询(例如 EXISTSCOUNT 表达式)的路径模式独立于外部查询中的路径模式。这允许您使用不同的唯一性约束执行次要检查。

// 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)。在匹配过程中,每一对节点模式将匹配相同的节点,并且这些节点将满足节点模式中谓词的合取。例如,在第一对中,y1x2 都将绑定到同一个节点,且该节点必须具有标签 XY。这种展开和绑定在下图中描绘

简单路径模式和量化路径模式

当简单路径模式放置在量化路径旁边时,也会产生节点模式对。例如,考虑以下路径模式

(: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)

量化路径模式对

当两个量化路径模式相邻时,第一个模式最后一次迭代的最右侧节点与第二个模式第一次迭代的最左侧节点合并。例如,以下相邻模式

((:A)-[:R]->(:B)){2} ((:X)<--(:Y)){1,2}

将匹配与这两个路径模式匹配的路径并集相同的路径集

(:A)-[:R]->(:B&A)-[:R]->(:B&X)<--(:Y)
(:A)-[:R]->(:B&A)-[:R]->(:B&X)<--(:Y&X)<--(:Y)

零次迭代

如果量词允许模式零次迭代,例如 {0,3},那么该模式的第 0 次迭代会导致两侧的节点模式配对。

例如,以下路径模式

(:X) ((a:A)-[:R]->(b:B)){0,1} (:Y)

将匹配与以下两个路径模式的并集相同的路径集

(:X&Y)
(:X&A)-[:R]->(:B&Y)