模式
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 语法。