模式
Neo4j 的属性图由节点和关系构成,它们都可以拥有属性。节点代表实体,例如概念、事件、地点和事物。关系连接节点对。
然而,节点和关系可以被视为低级构建块。属性图的真正强大之处在于它能够编码连接节点和关系的模式。单个节点或关系通常只编码很少的信息,但节点和关系的模式可以编码任意复杂的概念。
Cypher®,Neo4j 的查询语言,强烈基于模式。具体来说,模式用于匹配所需的图结构。一旦找到或创建了匹配的结构,Neo4j 就可以将其用于进一步处理。
一个简单的模式,只有一个关系,连接一对节点(或偶尔,一个节点连接到自身)。例如,一个人 LIVES_IN
一个城市 或 一个城市 PART_OF
一个国家。
复杂的模式,使用多个关系,可以表达任意复杂的概念并支持各种有趣的用例。例如,我们可能希望匹配*一个人* LIVES_IN
*一个国家* 的实例。以下 Cypher 代码将两个简单模式组合成一个稍微更复杂的模式来执行此匹配
(:Person) -[:LIVES_IN]-> (:City) -[:PART_OF]-> (:Country)
由图标和箭头组成的图表通常用于可视化图。文本注释提供标签、定义属性等。
节点语法
Cypher 使用一对括号 ()
来表示一个节点。这让人联想到圆形或两端圆角的矩形。下面是一些节点示例,提供了不同类型和数量的详细信息
()
(matrix)
(:Movie)
(matrix:Movie)
(matrix:Movie {title: 'The Matrix'})
(matrix:Movie {title: 'The Matrix', released: 1997})
最简单的形式 ()
表示一个匿名、未特征化的节点。如果想在其他地方引用该节点,可以添加一个变量,例如:(matrix)
。变量仅限于单个语句。它在另一个语句中可能具有不同或没有意义。
:Movie
模式声明了节点的标签。这使得我们能够限制模式,防止它匹配(比如说)在此位置包含 Actor
节点的结构。
节点的属性,例如 title
,表示为键值对列表,用一对大括号括起来,例如:{name: 'Keanu Reeves'}
。属性可用于存储信息和/或限制模式。
关系语法
Cypher 使用一对破折号 (--
) 来表示无向关系。有向关系在一端带有箭头 (<--
, -->
)。括号表达式 ([...]
) 可用于添加详细信息。这可能包括变量、属性和类型信息
-->
-[role]->
-[:ACTED_IN]->
-[role:ACTED_IN]->
-[role:ACTED_IN {roles: ['Neo']}]->
关系括号对内的语法和语义与节点括号之间使用的语法和语义非常相似。可以定义一个变量(例如,role
),以便在语句的其他地方使用。关系的类型(例如,:ACTED_IN
)类似于节点的标签。属性(例如,roles
)与节点属性完全等价。
模式语法
结合节点和关系的语法,我们可以表达模式。以下可能是此领域中的一个简单模式(或事实)
(keanu:Person:Actor {name: 'Keanu Reeves'})-[role:ACTED_IN {roles: ['Neo']}]->(matrix:Movie {title: 'The Matrix'})
类似于节点标签,:ACTED_IN
模式声明了关系的类型。变量(例如,role
)可以在语句的其他地方使用以引用该关系。
与节点属性类似,关系属性表示为用一对大括号括起来的键值对列表,例如:{roles: ['Neo']}
。在此例中,我们为 roles
使用了一个数组属性,允许指定多个角色。属性可用于存储信息和/或限制模式。
模式变量
为了增加模块化并减少重复,Cypher 允许将模式分配给变量。这使得可以检查匹配的路径,在其他表达式中使用等。
acted_in = (:Person)-[:ACTED_IN]->(:Movie)
acted_in
变量将包含两个节点以及每个找到或创建的路径的连接关系。有许多函数可以访问路径的详细信息,例如:nodes(path)
、relationships(path)
和 length(path)
。
子句
Cypher 语句通常有多个子句,每个子句执行特定任务,例如
-
创建和匹配图中的模式
-
过滤、投影、排序或分页结果
-
组合部分语句
通过组合 Cypher 子句,您可以组合复杂的语句来表达您想了解或创建的内容。
有关 Cypher 子句及其使用的详细信息,请参阅 Cypher 手册 → 子句。
您还可以访问 Cypher 速查表 以快速参考 Cypher 语法。