什么是 Cypher

本页涵盖 Cypher® 的基础知识。如需完整文档,请参阅Cypher

Cypher 是 Neo4j 的声明式且符合 GQL 标准的查询语言。通过openCypher 项目以开源形式提供,Cypher 类似于 SQL,但针对图进行了优化。

Cypher 直观且接近自然语言,通过其基于 ASCII 艺术式语法的自身设计,提供了一种可视化匹配模式和关系的方式。

(:nodes)-[:ARE_CONNECTED_TO]->(:otherNodes)

使用圆括号表示 (:Nodes),使用 -[:ARROWS]→ 表示 (:Nodes) 之间的关系。使用此查询语法,您可以对图执行创建、读取、更新或删除 (CRUD) 操作。

无需安装即可快速体验,获取免费的 Aura 实例。使用右上角的学士帽图标访问交互式指南。“查询基础”为您提供 Cypher 的实践入门。

Cypher 如何工作?

Neo4j 的图模型由节点关系组成,它们也可以拥有分配的属性。通过节点和关系,您可以构建强大的模式,表达简单或复杂的模式。

模式识别是关键的基本认知过程,这使得利用模式匹配的 Cypher 直观且易于学习。

Cypher 语法

Cypher 的构造基于英文散文和图标。这使得查询既易于编写又易于阅读。

如果您要用英文表示此图中的数据,它可能读作:“Sally 喜欢图。Sally 是 John 的朋友。Sally 为 Neo4j 工作。

现在,如果您要用 Cypher 编写相同的信息,它将看起来像这样

(:Sally)-[:LIKES]->(:Graphs)
(:Sally)-[:IS_FRIENDS_WITH]->(:John)
(:Sally)-[:WORKS_FOR]->(:Neo4j)

然而,为了在图中拥有此信息,首先您需要将其表示为节点和关系。

节点

在属性图模型中,主要组件是节点和关系。节点通常用于表示数据模型中的名词或对象。在前面的示例中,SallyJohnGraphsNeo4j 是节点。

在 Cypher 中,您可以通过用括号括起来表示一个节点,例如 (node)。括号表示可视化中构成节点的圆圈。

节点标签

节点可以通过标签进行分组。它们像标签一样工作,允许您指定要查找或创建的特定实体类型。标签还有助于 Cypher 区分实体并优化查询执行。

在此示例中,SallyJohn 都可以归类到 Person 标签下,Graphs 可以获得 Technology 标签,而 Neo4j 可以标记为 Company

在关系型数据库上下文中,这等同于告诉 SQL 在哪个表中查找特定行。正如您可以告诉 SQL 从 Person 表中查询人员信息一样,您也可以告诉 Cypher 只检查 Person 标签以获取该信息。

如果您不为 Cypher 指定标签以过滤掉不匹配的节点类别,查询将检查数据库中的所有节点。这可能会影响非常大图的性能。

节点变量

为了在后续子句中引用匹配的数据实体,需要将它们绑定到变量。

变量可以是单个字母或单词,并且应以小写形式编写。例如,如果您想将所有标记为 Person 的节点绑定到变量 p,您可以编写 (p:Person)。同样,如果您想使用完整的单词,则可以编写 (person:Person)

检索所有 Person 节点
MATCH (p:Person)
RETURN p

关系

图数据库的优势之一是您可以以关系的形式存储有关元素(节点)之间如何相互关联的信息。

在 Cypher 中,关系表示为方括号和连接两个节点的箭头(例如 (Node1)-[]→(Node2))。

在此示例中,包含 :LIKES:IS_FRIENDS_WITH:WORKS_FOR 的行表示节点之间的关系。

cypherintro graph
图 5. 包含节点和关系的图。

请记住始终在关系类型前面加上冒号。如果您忘记了,并编写了诸如 (:Person)-[LIKES]→(:Technology) 这样的查询,那么 [LIKES] 将表示一个关系变量,而不是关系类型

关系方向

关系总是有方向的,由箭头指示。

它们可以从左到右

(p:Person)-[:LIKES]->(t:Technology)

从右到左

(p:Person)<-[:LIKES]-(t:Technology)

或者无方向(方向指定)

MATCH (p:Person)-[:LIKES]-(t:Technology)

无方向关系

无方向关系并不意味着它没有方向,而是意味着它可以沿任一方向遍历。虽然您不能在没有方向的情况下创建关系,但可以无方向地查询它们(例如,使用 MATCH 子句)。

在查询中使用无方向关系特别有用,因为当您不知道方向时,Cypher 不会返回任何内容,如果您编写的查询方向错误。因此,Cypher 将检索由指定关系类型连接的所有节点,无论方向如何。

因为查询中的无方向关系会被遍历两次(每个方向一次),所以相同的模式会返回两次。这可能会影响查询的性能。

关系类型

关系类型对关系进行分类并增加其含义,类似于标签将节点分组。最佳实践是使用动词或其派生词作为关系类型。类型描述了节点之间如何相互关联。这样,Cypher 几乎就像自然语言,其中节点是主语和宾语(名词),而关系(动词)是连接它们的动作词。

在前面的示例中,关系类型是

  • [:LIKES] - 表示 Sally(一个节点)喜欢图(另一个节点)。

  • [:IS_FRIENDS_WITH] - 表示 Sally John 的朋友

  • [:WORKS_FOR] - 表示 Sally Neo4j 工作

关系变量

变量可以像用于节点一样用于关系。一旦指定了变量,您就可以在查询中稍后使用它来引用该关系。

以下示例

MATCH (p:Person)-[r:LIKES]->(t:Technology)
RETURN p,r,t

此查询为节点标签(p 代表 Persont 代表 Technology)和关系类型(r 代表 :LIKES)都指定了变量。在 RETURN 子句中,您可以使用这些变量(即 prt)来返回绑定的实体。

这将是您的结果

cypherintro variables
图 6. 使用节点和关系变量的示例查询结果。
表 1. 结果
p r t

(:Person)

[:LIKES]

(:Technology)

行数:1

请记住始终在关系类型前面加上冒号。如果您碰巧忘记了,并像这样编写查询

(Person)-[LIKES]->(Technology)

[LIKES] 将代表一个关系变量,而不是关系类型。在这种情况下,由于没有声明关系类型,Cypher 将搜索所有类型的关系以检索查询结果。

属性

属性值可以添加到节点和关系中,并且可以是各种数据类型。有关值的完整列表和类型,请参阅Cypher 手册 → 值与类型

另一种组织前面示例中数据的方法是添加一个属性 name,并将 SallyJohn 作为 Person 标签节点上的属性值

cypherintro properties
图 7. 带有节点和关系属性的图示例。
CREATE (p:Person {name:'Sally'})-[r:IS_FRIENDS_WITH]->(p:Person {name:'John'})
RETURN p, r

属性用花括号 ({}) 括起来,键后跟冒号,值用单引号或双引号括起来。

如果您已将 Sally 和 John 添加为节点标签,但想将它们更改为节点属性,则需要重构您的图。重构是数据建模中的一种策略,您可以在本教程中了解更多信息。

Cypher 中的模式

图模式匹配是 Cypher 的核心。它是通过应用声明式模式来导航、描述和从图中提取数据的机制。

考虑以下示例

(p:Person {name: "Sally"})-[r:LIKES]->(g:Technology {type: "Graphs"})

这段 Cypher 表示一个模式,但它不是一个查询。它仅表示一个 Person 节点,其 name 属性为 Sally,与一个 Technology 节点之间存在 LIKES 关系,该 Technology 节点的 type 属性为 Graphs

为了对这个模式进行一些操作,例如将其添加到图或从图检索,您需要查询数据库。

例如,您可以使用 CREATE 子句将此信息添加到数据库中。

CREATE (p:Person {name: "Sally"})-[r:LIKES]->(t:Technology {type: "Graphs"})

一旦此数据写入数据库,您就可以使用此模式检索它。

MATCH (p:Person {name: "Sally"})-[r:LIKES]->(t:Technology {type: "Graphs"})
RETURN p,r,t

模式变量

与节点和关系一样,您也可以对模式使用变量。有关更多信息,请参阅Cypher 手册 → 模式 → 语法和语义

继续学习

既然已经介绍了 Cypher 的基本概念,您可以学习如何开始使用 Cypher 教程,了解如何编写自己的查询。在Cypher 手册中,您可以找到更多信息,包括:

  • 如何编写基本查询以及可以使用哪些子句从数据库读取数据。

  • 模式如何工作以及如何使用它们来导航、描述和从图中提取数据。

  • Cypher 中有哪些值和类型以及函数可用。

从 NoSQL 到图

如果您熟悉 NoSQL(“不仅仅是 SQL”)系统,您还可以了解更多关于如何过渡到图数据库的信息。

GraphAcademy

通过Cypher 基础课程,您可以在 60 分钟内学习 Cypher 并使用沙盒进行实践。

其他资源

有关如何扩展 Cypher 知识的更多建议,请参阅资源

术语表

标签

将节点标记为命名且已索引子集的成员。一个节点可以分配零个或多个标签。

标签

标签将节点标记为命名且已索引子集的成员。一个节点可以分配零个或多个标签。

节点

节点代表图数据模型中的一个实体或离散对象。节点可以通过关系连接,在属性中保存数据,并按标签进行分类。

节点

节点代表图数据模型中的一个实体或离散对象。节点可以通过关系连接,在属性中保存数据,并按标签进行分类。

关系

关系代表图数据模型中节点之间的连接。关系连接源节点和目标节点,在属性中保存数据,并按类型进行分类。

关系

关系代表图数据模型中节点之间的连接。关系连接源节点和目标节点,在属性中保存数据,并按类型进行分类。

属性

属性是用于在节点和关系上存储数据的键值对。

属性

属性是用于在节点和关系上存储数据的键值对。

集群

一个 Neo4j DBMS,它跨多个服务器协同工作,以提高容错性或读取可扩展性。集群上的数据库可以配置为在集群中的服务器之间进行复制,从而实现读取可扩展性或高可用性。

集群

一个 Neo4j DBMS,它跨多个服务器协同工作,以提高容错性或读取可扩展性。集群上的数据库可以配置为在集群中的服务器之间进行复制,从而实现读取可扩展性或高可用性。

一组节点的逻辑表示,其中某些对通过关系连接。

一组节点的逻辑表示,其中某些对通过关系连接。

模式

节点和关系的规定属性存在和数据类型。

模式

节点和关系的规定属性存在和数据类型。

[[数据库模式]]数据库模式

节点和关系的规定属性存在和数据类型。

索引

一种提高数据库读取性能的数据结构。阅读有关支持的索引类别的更多信息

已索引

一种提高数据库读取性能的数据结构。阅读有关支持的索引类别的更多信息

约束

约束是一组数据建模规则,可确保数据的一致性和可靠性。查看 Cypher 中可用的约束

数据模型

数据模型定义了信息在数据库中的组织方式。一个好的数据模型将使查询和理解数据变得更容易。在 Neo4j 中,数据模型具有图结构。

数据模型

数据模型定义了信息在数据库中的组织方式。一个好的数据模型将使查询和理解数据变得更容易。在 Neo4j 中,数据模型具有图结构。

© . All rights reserved.