本节内容源自Cypher官方手册V4.4版,笔者对其进行学习、翻译、记录。
简介
模式和模式匹配是 Cypher 的核心,因此要有效使用 Cypher 需要对模式有很好的理解。
使用模式,您可以描述您正在寻找的数据的形状。例如,在MATCH子句中,您使用模式描述形状,Cypher 将找出如何为您获取该数据。
该模式使用一种类似于在白板上绘制属性图的形式来描述数据:通常用圆圈表示节点,它们之间的箭头来表示关系。
模式出现在 Cypher 中的多个位置:在MATCH、CREATE和MERGE子句中,以及在模式表达式中。
节点模式
可以在模式中描述的最简单的“形状”是节点。使用一对括号来描述一个节点,并且通常会给出一个名称。例如:
(a)
这个简单的模式描述了一个节点,并使用变量a命名该节点。
相关节点的模式
更强大的构造是描述多个节点和它们之间的关系的模式。Cypher模式通过在两个节点之间使用箭头来描述关系。例如:
(a)-->(b)
此模式描述了一个非常简单的数据形状:两个节点,以及从一个节点到另一个节点的单一关系。在本例中,两个节点分别命名为a和b,关系是“有向的”:从a到b。
这种描述节点和关系的方式可以扩展到覆盖任意数量的节点和它们之间的关系,例如:
(a)-->(b)<--(c)
这样一系列连接的节点和关系称为“路径”。
请注意,仅当需要再次引用同一节点时才需要在这些模式中命名节点,无论是在模式的后期还是在 Cypher 查询的其他地方。如果这不是必需的,则可以省略名称,如下所示:
(a)-->()<--(c)
标签模式
除了简单地描述模式中节点的形状外,还可以描述属性。模式中可以描述的最简单的属性是节点必须具有的标签。例如:
(a:User)-->(b)
还可以描述具有多个标签的节点:
(a:User:Admin)-->(b)
指定属性
节点和关系是图中的基本结构。Neo4j 使用这两个属性来支持更丰富的模型。
属性可以使用映射结构以模式表示,如下:
(a {name: 'Andy', sport: 'Brazilian Ju-Jitsu'})
在关系中也能设置属性:
(a)-[{blocked: false}]->(b)
当属性出现在模式中时,它们会为数据的形状添加额外的约束。在CREATE子句的情况下,将在新创建的节点和关系中设置属性。在MERGE子句的情况下,属性将用作任何现有数据必须具有的形状的附加约束(指定的属性必须与图中的任何现有数据完全匹配)。如果没有找到匹配的数据,则MERGE行为类似CREATE,并将在新创建的节点和关系中设置属性。
请注意,提供给的模式CREATE可能使用单个参数来指定属性,例如:CREATE (node $paramName). 这对于其他子句中使用的模式是不可能的,因为 Cypher 需要在编译查询时知道属性名称,以便可以有效地进行匹配。
关系模式
描述关系的最简单方法是使用两个节点之间的箭头,如前面的示例所示。使用这种技术,您可以描述应该存在的关系及其方向性。如果不关心关系的方向,可以省略箭头,例如:
(a)--(b)
与节点一样,关系也可以被命名。在这种情况下,使用一对方括号来分隔箭头,并将变量放置在它们之间。例如:
(a)-[r]->(b)
就像节点上的标签一样,关系也可以有类型。要描述与特定类型的关系,您可以按如下方式指定:
(a)-[r:REL_TYPE]->(b)
与标签不同,关系只能有一种类型。但是,如果我们想描述一些数据,使得关系可以具有一组类型中的任何一种,那么它们都可以在模式中列出,用管道符号 | 将它们分开,如下所示:
(a)-[r:TYPE1|TYPE2]->(b)
请注意,这种形式的模式只能用于描述现有数据(即,当使用带有MATCH或作为表达式的模式时)。它不适用于 CREATE 或者 MERGE,因为不可能创建具有多种类型的关系。
与节点一样,关系的名称总是可以省略,例如:
(a)-[:REL_TYPE]->(b)
变长模式匹配
对于长路径的描述,不是使用模式中的许多节点和关系,而是可以通过在模式的关系描述中指定长度来描述许多关系(和中间节点)。例如:
(a)-[*2]->(b)
这描述了三个节点和两个关系的图,都在一个路径中(长度为 2 的路径)。这相当于:
(a)-->()-->(b)
还可以指定长度范围:这种关系模式称为“可变长度关系”。例如:
(a)-[*3..5]->(b)
最小长度为 3,最大长度为 5。它描述了一个由 4 个节点和 3 个关系、5 个节点和 4 个关系或 6 个节点和 5 个关系组成的图,所有这些都在一条路径中连接在一起。
任何一个边界都可以省略。例如,要描述长度为 3 或更长的路径,请使用:
(a)-[*3..]->(b)
要描述长度为 5 或更短的路径,请使用:
(a)-[*..5]->(b)
省略两个边界等效于指定最小值 1,允许描述任何正长度的路径:
(a)-[*]->(b)
作为一个简单的例子,让我们看下面的图表和查询:
MATCH (me)-[:KNOWS*1..2]-(remote_friend)
WHERE me.name = 'Filipa'
RETURN remote_friend.name
"Dilshad"
"Anders"
此查询在图形中查找形状符合模式的数据:特别是一个节点(具有名称属性'Filipa'),然后是KNOWS一两跳之外的相关节点。这是寻找一级和二级朋友的典型例子。
请注意,可变长度关系不能与 CREATE 和 MERGE 一起使用。
定义路径变量
如上所述,一系列连接的节点和关系称为“路径”。Cypher 允许使用标识符命名路径,例如:
p = (a)-[*3..5]->(b)
您可以在 MATCH , CREATE 和 MERGE 中执行此操作,但不能在将模式用作表达式时执行此操作。