什么是 Cypher

本页介绍了 Cypher® 的基础知识。如需完整的文档,请参阅 Cypher 手册

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

Cypher 直观且接近自然语言,其语法基于 ASCII 艺术风格,提供了一种匹配模式和关系的视觉化方法。

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

圆括号用于表示 (:Nodes)(节点),方括号 -[]→ 用于表示 (:Nodes) 之间的关系。通过这种查询语法,您可以对图数据执行创建、读取、更新或删除 (CRUD) 操作。

想要尝试使用 Cypher 进行查询,您可以获取一个免费的 Aura 实例,无需安装。使用右上角的毕业帽图标可以访问交互式指南。“查询基础 (Query fundamentals)”为您提供了 Cypher 的实践入门。

Cypher 是如何工作的?

图由节点关系组成,它们还可以拥有指定的属性。通过节点和关系,您可以构建出能够表达简单或复杂模式的图。

模式识别是一种核心的认知过程。使用 Cypher,您可以利用模式匹配,这使得学习过程更加直观。

Cypher 语法

Cypher 的构造接近自然语言,其语法旨在从视觉上呈现出图的形状。

如果您想用英语表达此图中的数据,它读起来就像是:“Sally 喜欢图 (Graphs)。Sally 是 John 的朋友。Sally 为 Neo4j 工作。”

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

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

通过这个查询,您将信息转化为节点和关系,这是 Cypher 的核心元素。

节点

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

如前所述,节点在 Cypher 中表示为圆括号 (node)。圆括号代表了可视化中构成节点的圆圈。

节点标签 (Node labels)

节点可以通过标签进行分组,标签的作用类似于标记,允许您在查询中指定特定类型的实体。标签有助于 Cypher 区分不同的节点并优化执行。

在示例中,SallyJohn 都是人,所以他们获得了 Person 标签;Graphs 获得了 Technology 标签;而 Neo4j 是一个 Company

在关系型数据库中,这相当于使用 SQL 来引用表中的特定行。正如您可以使用 SQL 从 Person 表查询某个人的信息一样,您也可以在 Cypher 中使用 Person 标签来获取该信息。

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

节点变量 (Node variables)

如果查询的部分内容匹配到了您需要在后续查询(即子句)中引用的节点,则可以使用节点变量

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

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

关系 (Relationships)

在图数据库中,节点和关系都是“一等公民”,它们具有同等价值。在关系型数据库中,关系仅通过外键和连接表隐含表示。

在 Cypher 中,关系表示为方括号,并带有一个可选的箭头来指示方向(例如 (Node1)-[]→(Node2))。

在示例中,连接节点的箭头表示节点之间的关系。

cypherintro graph
图 5. 展示节点和关系的图。

关系方向

关系始终有一个由箭头指示的方向。

它们可以从左向右

(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 工作

请记住,务必在关系类型前加上冒号。如果您写成 (Person)-[LIKES]→(Technology)[LIKES] 将代表一个关系变量,而不是关系类型。在这种情况下,由于没有声明关系类型,Cypher 的 RETURN 子句将搜索所有类型的关系以检索查询结果。

关系变量

关系变量的使用方式与节点变量相同。一旦指定了变量,您就可以在查询的后续部分中使用它来引用该关系。

以这个例子为例

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

属性 (Properties)

属性用于存储额外信息,可以添加到节点和关系中,并且可以是多种数据类型。有关值和类型的完整列表,请参阅 Cypher 手册 → 值和类型

在下面的示例中,sallyjohnPerson 节点的变量,这些节点包含一个 name 属性,其属性值分别为 "Sally" 和 "John"。

cypherintro properties
图 7. 带有节点和关系属性的图示例。

要将此信息添加到图中,您可以使用以下查询

CREATE (sally:Person {name:'Sally'})-[r:IS_FRIENDS_WITH]->(john:Person {name:'John'})
RETURN sally, r, john

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

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

Cypher 中的模式 (Patterns)

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

考虑这个例子

(sally:Person {name:'Sally'})-[l:LIKES]->(g:Technology {type: "Graphs"})

这段 Cypher 代码代表了一个模式。它表示一个 name 属性为 SallyPerson 节点,与一个 type 属性为 GraphsTechnology 节点之间存在 LIKES 关系。

通过添加关键字使其成为子句,您可以在数据库的不同查询中使用此模式。

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

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

一旦数据写入数据库,您就可以使用此模式将其检索出来

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

模式变量

与节点和关系一样,您也可以为模式使用变量。考虑前面的示例,您可以将整个模式 ((Sally)-[:LIKES]→(Technology)) 转变为一个变量 (p)。

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

更多信息,请参阅 Cypher 手册 → 模式 → 语法和语义

持续学习

如果您想了解更多关于编写 Cypher 查询的信息,可以阅读关于 Cypher 入门的教程。在 Cypher 手册中,您可以找到关于以下内容的更多信息:

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

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

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

从 NoSQL 到图

如果您熟悉 NoSQL 系统,还可以详细了解如何迁移到图数据库。

GraphAcademy

通过 Cypher 基础 (Cypher Fundamentals) 课程,您可以在 60 分钟内学会 Cypher,并使用沙箱环境进行练习。

其他资源

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

术语表

label (标签)

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

labels (标签)

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

node (节点)

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

nodes (节点)

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

relationship (关系)

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

relationships (关系)

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

property (属性)

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

properties (属性)

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

cluster (集群)

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

clusters (集群)

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

graph (图)

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

graphs (图)

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

schema (模式)

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

schemas (模式)

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

[[database schema]]database schema (数据库模式)

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

indexes (索引)

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

indexed (已索引)

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

constraints (约束)

约束是一组数据建模规则,用于确保数据一致且可靠。查看 Cypher 中有哪些可用约束

data model (数据模型)

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

data models (数据模型)

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