教程目录 引自:https://neo4j.com/docs/getting-started/cypher/
什么是 Cypher
本页介绍 Cypher® 的基础知识。有关完整文档,请参阅 Cypher。
Cypher 学习

Cypher 是 Neo4j 的声明式和 GQL 兼容的查询语言。Cypher 通过 openCypher 项目以开源形式提供,类似于 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)
但是,为了使此信息在图中,首先需要将其表示为节点和关系。
节点
在属性图模型中,主要组件是节点和关系。节点通常用于表示数据模型中的名词或对象。在前面的示例中,Sally、John、Graphs 和 Neo4j 是节点:

在 Cypher 中,您可以通过用括号将其括起来来描述一个节点,例如 (node)
。括号是构成可视化中节点的圆圈的表示。
节点标签
节点可以通过标签分组在一起。它们像标签一样工作,允许您指定要查找或创建的某些类型的实体。标签还有助于 Cypher 区分实体并优化查询的执行。
在示例中,Sally 和 John 都可以归类在 Person
标签下,Graphs
可以接收 Technology
标签,而 Neo4j
可以标记为 Company
:

在关系数据库上下文中,这与告诉 SQL 在哪个表中查找特定行相同。就像您可以告诉 SQL 从 Person
表中查询人员的信息一样,您也可以告诉 Cypher 仅检查 Person
标签以获取该信息。
如果您不指定标签让 Cypher 过滤掉不匹配的节点类别,则查询将检查数据库中的所有节点。这可能会影响非常大的图中的性能。
节点变量
虽然不是强制性的,但在查询数据库时,变量特别有用,因为它们允许在后续子句中引用指定的节点,而无需完整地编写其标签。
变量可以是单个字母或单词,并且应以小写形式书写。例如,如果要将所有标记为 Person
的节点绑定到变量 p
,则可以编写 (p:Person)
。同样,如果要使用完整的单词,则可以编写 (person:Person)
。
在 MATCH
查询中检索所有标记为 Person
的节点,如下所示:
没有变量 | 有变量 |
---|---|
MATCH (:Person) |
MATCH (p:Person) |
RETURN Person |
RETURN p |
请注意,在没有变量的示例中,节点 Person
前面有一个冒号 (:)
。这是防止类型或标签成为变量的方式。
如果您忘记添加冒号并像这样编写查询:
MATCH (Person)
RETURN Person
那么 Person
将是一个变量,而不是类型或标签。
关系
图数据库的优点之一是您可以存储有关元素(节点)如何以关系的形式相互关联的信息。
在 Cypher 中,关系表示为方括号和连接两个节点的箭头(例如 (Node1)-[]->(Node2)
)。
在示例中,包含 :LIKES
、:IS_FRIENDS_WITH
和 :WORKS_FOR
的行表示节点之间的关系:

请记住始终在关系类型前面加上冒号。如果您忘记了,并编写了诸如 (: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
代表 Person
,t
代表 Technology
)和关系类型(r
代表 :LIKES
)指定变量。在 RETURN
子句中,您可以使用变量(即 p
、r
和 t
)来返回绑定的实体。
这将是您的结果:

表 1. 结果
p | r | t |
---|---|---|
(:Person) | [:LIKES] | (:Technology) |
行数:1
请记住始终在关系类型前面加上冒号。如果您忘记了,并像这样编写查询:
(Person)-[LIKES]->(Technology)
[LIKES]
将表示关系变量,而不是关系类型。在这种情况下,由于未声明关系类型,Cypher 将搜索所有类型的关系,以便检索查询的结果。
属性
属性值可以添加到节点和关系,并且可以是各种数据类型。有关值和类型的完整列表,请参阅 Cypher 手册 → 值和类型。
组织前面示例中数据的另一种方法是添加一个属性 name
,并将 Sally
和 John
作为 Person
标记节点上的属性值:

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 代表一个模式,但它不是一个查询。它仅表示名称属性为 Sally 的 Person
节点与类型属性为 Graphs 的 Technology
节点具有 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 中有哪些值和类型以及函数可用。
从 SQL 到 Cypher
如果您具有 SQL 背景并且是图数据库的新手,则以下是一些资源,可用于获取有关关键差异以及过渡到图的更多信息:
- Cypher 和 SQL 之间的主要区别
- 从关系型数据库过渡到图数据库
- 参考:将 Cypher 与 SQL 进行比较
- 操作方法:从 RDBMS 导入到图
- 教程:将数据从关系数据库导入到 Neo4j
- 操作方法:将数据从关系型建模到图
从 NoSQL 到图
如果您熟悉 NoSQL(“不仅仅是 SQL”)系统,您还可以了解更多关于如何过渡到图数据库的信息。
GraphAcademy
通过 Cypher 基础课程,您可以在 60 分钟内学习 Cypher,并使用沙盒进行练习。
其他资源
有关如何扩展您对 Cypher 的知识的更多建议,请参阅资源。