语法和语义

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

节点模式

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

另请参阅节点模式概念

语法

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

elementPatternWhereClause ::= "WHERE" booleanExpression

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

规则

谓词

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

WHERE 子句的布尔表达式可以引用节点模式范围内所有变量。节点变量需要在节点模式中声明才能在布尔表达式中引用它。

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

变量绑定

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

示例

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

(n:A)

匹配所有标签为 B 且具有属性 departs,其时间值为 11:11 的节点

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

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

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

关系模式

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

关系模式紧跟一个量词是量化路径模式的缩写形式,称为量化关系

另请参阅关系模式概念

语法

relationshipPattern ::= fullPattern | abbreviatedRelationship

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

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

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

elementPatternWhereClause ::= "WHERE" booleanExpression

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

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

规则

谓词

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

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

WHERE 子句的布尔表达式可以引用关系模式范围内所有变量。关系变量需要在模式中声明才能在布尔表达式中引用它。

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

变量绑定

如果变量未在查询的其他地方声明,则在执行其包含的路径模式匹配时,它将绑定到关系。如果它已在先前的子句中绑定,则不会有新关系绑定到该变量;如果任何先前绑定但与当前路径模式不匹配的关系,则这些匹配项将从结果中消除。

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

示例

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

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

匹配所有类型为 R 且属性 distance 等于 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]->

属性键值表达式

语法

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)

路径模式

路径模式是图中最顶层的模式,用于匹配图中的路径。

语法

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

语法

规则

patterns qpp reference

最小模式长度

被量化的路径模式长度必须大于零。换句话说,它必须包含至少一个关系。单个节点模式不能被量化。

quantifiedPathPattern ::=
  parenthesizedPathPatternExpression quantifier

fixedPath ::= nodePattern [ relationshipPattern nodePattern ]+

量化路径模式的嵌套

不允许嵌套量化路径模式。例如,不允许在量化路径模式中嵌套量化关系:

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

当路径模式与图中的路径匹配时,节点可以被重复访问,但关系不能。
((x:A)){2,4}

组变量

在量化路径模式内部引入的变量在模式定义外部被称为作为组变量暴露。作为组变量,它们将绑定到节点列表或关系列表。相比之下,在声明它们的量化路径模式内部,变量可以被视为单例。这种区别可以在以下查询中看到:

当路径模式与图中的路径匹配时,节点可以被重复访问,但关系不能。
(:A) (()-[:R]->+()){2,3} (:B)

在布尔表达式 z.p > x.p 中,zx 都是单例;在 RETURN 子句中,x 是一个可以像列表一样迭代的组变量。请注意,这意味着上面的 WHERE 子句 z.p > x.p 需要放在量化路径模式内部。以下操作会抛出语法错误,因为它将 zp 视为单例:

允许单个节点模式,因为它至少有一个元素
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}

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

x

patterns qpp reference example

z

(x:A)-[:R]->(z:B WHERE z.h > 2)

n1

n2 n3

n5

如果量词 {2} 附加到简单路径模式,结果将是以下量化路径模式:

如果量词 {2} 附加到简单路径模式,结果将是以下量化路径模式:

这等同于将模式的两次迭代链式连接起来,其中第一次迭代的最右侧节点与第二次迭代的最左侧节点合并。(有关更多详细信息,请参阅节点模式对。)

这等同于将模式的两次迭代链式连接起来,其中第一次迭代的最右侧节点与第二次迭代的最左侧节点合并。(有关更多详细信息,请参阅节点模式对。)

为了避免在 x 的两个实例之间以及 z 的两个实例之间引入等值连接,在每次迭代内部,变量都被替换为一组新的变量:

然后,相邻节点模式中的节点变量被合并。

((x:A)-[:R]->(z:B WHERE z.h > 2)){2}

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

(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} 相比,这也匹配长度为一和三的路径,但没有匹配长度大于三的路径。 量化关系

[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} 相比,这也匹配长度为一和三的路径,但没有匹配长度大于三的路径。 量化关系

[1]

[3]

[3]

[4]

[4]

[5]

[1, 3]

[3, 4]

[3, 4]

[4, 5]

[1, 3, 4]

[3, 4, 5]

量化关系是量化路径模式的缩写形式,只指定了一个关系模式。

例如,以下量化关系:

quantifiedRelationship ::= relationshipPattern quantifier

它匹配包含 mn 个类型为 R 的关系(从左到右指向),从类型为 A 的节点开始,到类型为 B 的节点结束,并匹配中间的任何节点。它等同于以下量化路径模式:

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

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

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

示例

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

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

匹配由两条入站子路径组成的路径,一条包含类型为 R 的关系,另一条包含类型为 S 的关系,并在标签为 A 的节点处相遇

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

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

()-[:R]-+()

量词

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

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

()--+()

语法

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

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

规则

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

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

fixedQuantifier ::= "{" unsignedDecimalInteger "}"

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

lowerBound ::= unsignedDecimalInteger

upperBound ::= unsignedDecimalInteger

unsignedDecimalInteger ::= [0-9]+

变体

规范形式

{m,n}

mn 次迭代之间。 1 次或更多次迭代。 描述

0 次或更多次迭代。

0 次或更多次迭代。

{n}

+

{1,}

{n,n}

*

{0,}

恰好 n 次迭代。

{m,}

m 次或更多次迭代。

{,n}

{0,n}

{0,n}

0 到 n 次迭代之间。

请注意,带有量词 {1} 的量化路径模式不等同于固定长度路径模式。尽管生成的量化路径模式将匹配与不带量词的固定长度路径相同的路径,但量词的存在意味着路径模式内的所有变量都将作为组变量暴露。

可变长度关系

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

{,}

{0,}

恰好 n 次迭代。

量词的位置和语法。

星号的语义。

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

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

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

mn 次迭代之间。 描述 -[]->{n} (()-[]->()){n}

-[*]->

{n,n}

-[]->+

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

-[*m..n]->

{,n}

-[]->{m,n}

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

-[*m..]->

{n}

-[]->{m,}

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

-[*..n]->

0 到 n 次迭代之间。

1 到 n 次迭代之间。

-[]->{1,n}

-[*0..]->

恰好 n 次迭代。

-[]->*

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

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

-[*0..n]->

-[]->{,n}

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

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

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

此表显示了一些示例:

可变长度关系

等效量化路径模式

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

等值连接

可变长度关系的变量可以在后续模式中用于引用该变量绑定的关系列表。这与绑定到单个节点或关系变量的等值连接相同。

本节使用以下图:

要重新创建图,请针对空的 Neo4j 数据库运行以下查询:

查询

在以下查询中,节点变量将绑定到相同的节点:

patterns equijoin reference

表 1. 结果

a = c
CREATE ({name: 'Filipa'})-[:KNOWS]->({name:'Anders'})-[:KNOWS]->
         ({name:'Dilshad'})

b = d

a = c
MATCH (a {name: 'Dilshad'})<-[r*1..2]-(b)
MATCH (c)<-[r*1..2]-(d)
RETURN a = c, b = d, size(r)
size(r)
true 行数:2 关系列表保持其顺序。这意味着在以下查询中,当第二个 MATCH 中可变长度关系的方向发生切换时,等值连接只会匹配一次,即当只有一个关系时。

表 2. 结果

表 2. 结果

1

表 2. 结果

表 2. 结果

2

false

行数:1

a = c
MATCH (a {name: 'Dilshad'})<-[r*1..2]-(b)
MATCH (c)-[r*1..2]->(d)
RETURN a = c, b = d, size(r)
变量 r 可以像任何列表一样反转顺序,并使其与关系模式方向的切换匹配。
true 行数:2 关系列表保持其顺序。这意味着在以下查询中,当第二个 MATCH 中可变长度关系的方向发生切换时,等值连接只会匹配一次,即当只有一个关系时。

表 3. 结果

表 3. 结果

1

a = d

b = c

a = 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)
size()
更改后续 MATCH 语句上的边界意味着只有量词边界的重叠长度才会产生结果。 表 4. 结果 由于 Cypher 只允许路径在给定图模式匹配中遍历关系一次(请参阅关系唯一性),在同一图模式中重复可变长度关系将不会产生任何结果。例如,此 MATCH 子句将永远不会将任何中间结果传递给后续子句。

表 2. 结果

表 2. 结果

1

表 2. 结果

表 2. 结果

2

false

尝试在单个关系模式中重复可变长度关系将引发错误。例如,以下模式会引发错误,因为变量 r 同时出现在可变长度关系和固定长度关系中。

a = c
MATCH (a {name: 'Dilshad'})<-[r*1..2]-(b)
MATCH (c)<-[r*2..3]-(d)
RETURN a = c, b = d, size(r)
示例
true 行数:2 关系列表保持其顺序。这意味着在以下查询中,当第二个 MATCH 中可变长度关系的方向发生切换时,等值连接只会匹配一次,即当只有一个关系时。

表 2. 结果

表 2. 结果

2

a = d

以下模式匹配以标签为 A 的节点开始,以标签为 B 的节点结束的路径,这些路径遍历类型为 R 的二到三个关系。

MATCH (x)-[r*1..2]->(y)-[r*1..2]->(z)

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

MATCH (x)-[r*1..2]->(y)-[r]->(z)

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

如果移除下限,它将默认为一,并且不再返回长度为零的路径,即单个节点。

(:A)-[r:R*2..3]->(:B)

以下模式遍历一个或多个任何方向且具有属性 p = $param 的关系。

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

最短路径

(:A)-[*0..5]->(:B)

路径选择器是在路径模式级别指定的模式。路径选择器有五种类型:

(:A)-[*..5]->(:B)

SHORTEST k

()-[* {p: $param}]-()

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

  • 有关在路径模式中何处包含路径选择器的详细信息,请参阅路径模式

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

移除不满足路径模式中谓词的任何路径。这是一个过滤器。

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

  1. 移除不满足图模式 WHERE 子句中谓词的任何路径。这是一个过滤器。

  2. 预过滤器示例:

  3. 后过滤器示例:

  4. 分区

如果有多个起始节点和结束节点匹配路径模式,那么当指定选择性路径选择器时,路径模式匹配的路径将按不同的起始节点和结束节点对进行分区。在每个分区内,它们按路径长度升序排列。然后根据指定的路径选择器选择分区后的路径,如下所示:
// 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 大于分区中路径长度组的数量,则返回该分区中的所有路径。GROUPGROUPS 可以互换使用。

ANY k

所有最短路径长度相同的路径。等同于 SHORTEST 1 GROUP

返回任意 k 条路径。ANYANY 1 相同。这对于确定节点的可达性很有用。

前三种是最短路径选择器,它们指定应返回哪些最短路径,具体选择方法取决于路径选择器类型和 k 的值。

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

ALL

对于选择性路径选择器,如果 k 大于 N(匹配路径模式的路径数量),则返回所有 N 条路径。

有关在路径模式中何处包含路径选择器的详细信息,请参阅路径模式

只允许一个路径模式

语法

当为路径模式指定选择性最短路径选择器时,它必须是图模式中唯一的路径模式。

PATH/PATHS

关键字 PATHPATHS 是可选的,可以添加到路径选择器的末尾(但在 GROUPGROUPS 之前)。包含其中任何一个都不会改变路径选择。例如,以下两个 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)

shortestPath()allShortestPaths() 函数

MATCH SHORTEST 2 GROUPS (:A)-[:R]->{0,10}(:B)

在 Neo4j 5.21 中引入基于关键字的最短路径选择规范之前,最短路径的唯一可用语法是 shortestPath()allShortestPaths() 函数。它们与 SHORTEST 1ALL 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() 将返回所有这些路径,因此其结果是确定性的。

示例
MATCH p = shortestPath(()-[*]-())
WITH nodes(p) AS N
WHERE all(n in N WHERE n.p < 42)

图模式

图模式是由一个或多个路径模式组成的逗号分隔列表。它是提供给 MATCH 的顶层构造。

语法

返回匹配 (:A)(:B) 的每对不同节点的所有与两条最短路径长度相同的路径。

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

对于连接每对不同节点的每一条最短路径,只返回路径长度为偶数的那些(因此结果少于上一个示例)。

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

规则

路径模式的规则适用于图模式的每个组成路径模式。

patterns graph pattern reference

变量引用

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

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

((x:X)<--(y:Y)){3}

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

(x1:X)<--(y1:Y)(x2:X)<--(y2:Y)(x3:X)<--(y3:Y)

展开量化路径模式的迭代后,右手侧的节点模式 (:B) 与左手侧的节点模式 (:X) 相邻。结果将匹配与以下两个路径模式的匹配并集相同的路径:

patterns node pattern pairs

如果简单路径模式位于量化路径模式的右侧,其最左侧节点 (: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)

零次迭代

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

((: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)
© . All rights reserved.