核心概念
节点
Neo4j 图数据库中的数据实体称为节点。在 Cypher 中,节点使用括号 ()
来表示。
MATCH (n:Person {name:'Anna'})
RETURN n.born AS birthYear
在上面的示例中,节点包括以下内容:
-
一个
Person
标签。标签类似于标记,用于查询数据库中的特定节点。一个节点可以有多个标签,例如Person
和Actor
。 -
一个
name
属性,设置为Anna
。属性定义在大括号{}
内,用于为节点提供特定信息,这些信息也可以用于查询,并进一步提高精确定位数据的能力。 -
一个变量,
n
。变量允许在后续子句中引用指定的节点。
在此示例中,第一个 MATCH
子句查找图中所有 Person
节点,其中 name
属性设置为 Anna
,并将它们绑定到变量 n
。然后,变量 n
被传递到后续的 RETURN
子句,该子句返回同一节点的另一个属性 (born
) 的值。
关系
图中的节点可以通过关系连接。关系必须有一个起始节点、一个结束节点和恰好一个类型。在 Cypher 中,关系用箭头(例如 -->
)表示,指示关系的方向。
MATCH (:Person {name: 'Anna'})-[r:KNOWS WHERE r.since < 2020]->(friend:Person)
RETURN count(r) As numberOfFriends
与节点不同,关系模式中的信息必须用方括号括起来。上面的查询示例匹配类型为 KNOWS
且属性 since
小于 2020
的关系。该查询还要求关系从名为 Anna
的 Person
节点指向任何其他 Person
节点,这些节点被称为 friend
。count() 函数在 RETURN
子句中用于计算前面 MATCH
子句中由变量 r
绑定的所有关系(即 Anna
在 2020
年之前认识了多少朋友)。
请注意,虽然节点可以有多个标签,但关系只能有一个类型。
路径
图中的路径由连接的节点和关系组成。探索这些路径是 Cypher 的核心。
MATCH (n:Person {name: 'Anna'})-[:KNOWS]-{1,5}(friend:Person WHERE n.born < friend.born)
RETURN DISTINCT friend.name AS youngerConnections
此示例使用量化关系来查找最远 5
跳的所有路径,只遍历从起始节点 Anna
到其他更年轻的 Person
节点(由 WHERE 子句定义)的类型为 KNOWS
的关系。DISTINCT
操作符用于确保 RETURN
子句只返回唯一节点。
路径也可以被分配变量。例如,下面的查询绑定了一个完整的路径模式,它匹配从 Anna
到图中另一个 Person
节点的最短路径,该节点的 nationality
属性设置为 Canadian
。在这种情况下,RETURN
子句返回两个节点之间的完整路径。
MATCH p = SHORTEST 1 (:Person {name: 'Anna'})-[:KNOWS]-+(:Person {nationality: 'Canadian'})
RETURN p
有关图模式匹配的更多信息,请参阅模式。