什么是 Cypher

此页面介绍了 Cypher® 的基础知识。有关完整文档,请参阅 Cypher

Cypher 是 Neo4j 的声明式和 符合 GQL 的查询语言。作为通过 开放 Cypher 项目 提供的开源语言,Cypher 类似于 SQL,但针对图进行了优化。

Cypher 具有直观的语法,接近自然语言,它通过基于 ASCII 艺术类型的语法提供了一种匹配模式和关系的视觉方式。

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

圆括号用于表示 (:节点),而 -[:箭头]→ 用于表示 (:节点) 之间的关系。使用此查询语法,您可以对图执行创建、读取、更新或删除 (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 中,您可以通过将节点用括号包围来描绘它,例如 (节点)。括号表示可视化中构成节点的圆圈。

节点标签

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

在示例中,SallyJohn 都可以归入 Person 标签,Graphs 可以接收 Technology 标签,Neo4j 可以标记为 Company

在关系数据库上下文中,这与告诉 SQL 从哪个表查找特定行相同。您告诉 SQL 从 Person 表查询个人信息的方式与告诉 Cypher 仅检查 Person 标签以获取该信息的方式相同。

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

节点变量

虽然不是强制性的,但变量在查询数据库时特别有用,因为它们允许在后续子句中引用指定的节点,而无需完整编写其标签。

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

MATCH 查询中检索所有标记为 Person 的节点,如下所示

没有变量 有变量
MATCH (:Person)
RETURN Person
MATCH (p:Person)
RETURN p

请注意,在没有变量的示例中,节点 Person 前面有一个冒号 (:)。这就是您防止类型或标签成为变量的方式。

如果您忘记添加冒号并像这样编写查询

MATCH (Person)
RETURN Person

那么 Person 将是一个变量,而不是类型或标签。

关系

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

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

在示例中,包含 :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)指定了变量。在返回子句中,你可以使用这些变量(例如 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 节点(其 type 属性值为 Graphs)之间存在 LIKES 关系。

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

例如,你可以使用 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 中可用的约束.