核心概念

从根本上讲,Neo4j 图数据库由三个核心实体组成:节点、关系和路径。构建 Cypher® 查询的目的就是为了匹配或创建图中的这些实体。因此,掌握节点、关系和路径在图数据库中的基本概念,对于构建 Cypher 查询至关重要。

下方的示例使用了 MATCHRETURN 子句来查找并返回所需的图模式。要了解有关这些子句及更多 Cypher 子句的详细信息,请参阅 子句 (Clauses) 部分。

节点 (Nodes)

Neo4j 图数据库中的数据实体被称为节点。在 Cypher 中,节点通过圆括号 () 来表示。

MATCH (n:Person {name:'Anna'})
RETURN n.born AS birthYear

在上面的示例中,节点包含以下内容:

  • 一个 Person 标签 (label)。标签就像标记一样,用于在数据库中查询特定的节点。一个节点可以拥有多个标签,例如 PersonActor

  • 一个 name 属性 (property),其值被设置为 Anna。属性定义在花括号 {} 中,用于为节点提供具体信息,这些信息也可以作为查询条件,从而进一步提高精确定位数据的能力。

  • 一个变量 (variable),即 n。变量允许在后续子句中引用指定的节点。

在此示例中,第一个 MATCH 子句查找图中所有 name 属性设置为 AnnaPerson 节点,并将它们绑定到变量 n。随后,变量 n 被传递给后续的 RETURN 子句,该子句返回属于同一节点的另一个属性 (born) 的值。

关系 (Relationships)

图中的节点可以通过关系连接起来。一个关系必须拥有起始节点、结束节点,且只能有一种类型。在 Cypher 中,关系通过箭头(例如 -->)来表示,以指明关系的方向。

MATCH (:Person {name: 'Anna'})-[r:KNOWS WHERE r.since < 2020]->(friend:Person)
RETURN count(r) As numberOfFriends

与节点不同,关系模式中的信息必须用方括号括起来。上面的查询示例匹配了类型为 KNOWSsince 属性值小于 2020 的关系。该查询还要求关系是从名为 AnnaPerson 节点指向任何其他被称为 friendPerson 节点。RETURN 子句中使用了 count() 函数,用于统计前一个 MATCH 子句中被 r 变量绑定的所有关系(即:Anna2020 年之前认识了多少位朋友)。

请注意,虽然节点可以拥有多个标签,但关系只能拥有一种类型。

路径 (Paths)

图中的路径由连接的节点和关系组成。探索这些路径是 Cypher 的核心所在。

MATCH (n:Person {name: 'Anna'})-[:KNOWS]-{1,5}(friend:Person WHERE n.born < friend.born)
RETURN DISTINCT friend.name AS youngerConnections

此示例使用了量化关系来查找从起始节点 Anna 出发,跳数最多为 5 跳的所有路径,且仅遍历类型为 KNOWS 的关系,并指向其他更年轻的 Person 节点(由 WHERE 子句定义)。DISTINCT 操作符用于确保 RETURN 子句仅返回唯一的节点。

路径也可以被分配给变量。例如,下方的查询绑定了一个完整的路径模式,它匹配从 Anna 到图中另一个 nationality 属性为 CanadianPerson 节点之间的 SHORTEST(最短)路径。在这种情况下,RETURN 子句返回这两个节点之间的完整路径。

MATCH p = SHORTEST 1 (:Person {name: 'Anna'})-[:KNOWS]-+(:Person {nationality: 'Canadian'})
RETURN p

有关图模式匹配的更多信息,请参阅 模式 (Patterns)