什么是 Cypher
此页面介绍了 Cypher® 的基础知识。有关完整文档,请参阅 Cypher。 |
Cypher 是 Neo4j 的声明式和 符合 GQL 的查询语言。作为通过 开放 Cypher 项目 提供的开源语言,Cypher 类似于 SQL,但针对图进行了优化。
Cypher 具有直观的语法,接近自然语言,它通过基于 ASCII 艺术类型的语法提供了一种匹配模式和关系的视觉方式。
(:nodes)-[:ARE_CONNECTED_TO]->(:otherNodes)
圆括号用于表示 (:节点)
,而 -[:箭头]→
用于表示 (:节点)
之间的关系。使用此查询语法,您可以对图执行创建、读取、更新或删除 (CRUD) 操作。
如需快速查看,无需安装,请获取免费的 Aura 实例。使用右上角部分的毕业帽图标访问交互式指南。“查询基础”为您提供了 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 中,您可以通过将节点用括号包围来描绘它,例如 (节点)
。括号表示可视化中构成节点的圆圈。
节点标签
节点可以通过 标签 分组在一起。它们就像标签一样,允许您指定要查找或创建的特定类型的实体。标签还有助于 Cypher 区分实体并优化查询的执行。
在示例中,Sally
和 John
都可以归入 Person
标签,Graphs
可以接收 Technology
标签,Neo4j
可以标记为 Company
。
在关系数据库上下文中,这与告诉 SQL 从哪个表查找特定行相同。您告诉 SQL 从 Person
表查询个人信息的方式与告诉 Cypher 仅检查 Person
标签以获取该信息的方式相同。
如果您没有为 Cypher 指定标签以过滤掉不匹配的节点类别,则查询将检查数据库中的所有节点。这会影响非常大型图的性能。 |
节点变量
虽然不是强制性的,但变量在查询数据库时特别有用,因为它们允许在后续子句中引用指定的节点,而无需完整编写其标签。
变量可以是单个字母或单词,应小写。例如,如果您想将所有标记为 Person
的节点绑定到变量 p
,则写入 (p:Person)
。同样,如果您想使用完整单词,则可以编写 (person:Person)
。
在 MATCH
查询中检索所有标记为 Person
的节点,如下所示
没有变量 | 有变量 |
---|---|
|
|
请注意,在没有变量的示例中,节点 Person
前面有一个冒号 (:
)。这就是您防止类型或标签成为变量的方式。
如果您忘记添加冒号并像这样编写查询
MATCH (Person)
RETURN Person
那么 Person
将是一个变量,而不是类型或标签。
关系
图数据库的优势之一是您可以存储有关元素(节点)之间如何关联的信息,这些信息以关系的形式存储。
在 Cypher 中,关系表示为方括号和连接两个节点的箭头(例如 (节点 1)-[]→(节点 2)
)。
在示例中,包含 :LIKES
、:IS_FRIENDS_WITH
和 :WORKS_FOR
的行表示节点之间的关系。
请记住,在关系类型前面始终放置冒号。如果您忘记了它,并编写了类似 |
关系方向
关系 **始终** 具有一个方向,由箭头指示。
它们可以从左到右
(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
)指定了变量。在返回子句中,你可以使用这些变量(例如 p
、r
和 t
)来返回绑定的实体。
这将是你的结果
p | r | t |
---|---|---|
|
|
|
行数: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
属性用花括号 ({}
) 包含,键后跟冒号,值用单引号或双引号包含。
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 手册 → 模式 → 语法和语义.
继续学习
从 NoSQL 到图形
如果你熟悉 NoSQL(“不仅仅是 SQL”)系统,你也可以学习有关 如何过渡到图形数据库 的更多信息。
GraphAcademy
通过 Cypher 基础知识 课程,你可以在 60 分钟内学习 Cypher 并使用沙盒进行练习。
其他资源
有关如何扩展 Cypher 知识的更多建议,请参阅 资源.
词汇表
- 标签
-
将节点标记为命名和索引子集的成员。一个节点可以分配零个或多个标签。
- 标签
-
标签将节点标记为命名和索引子集的成员。一个节点可以分配零个或多个标签。
- 节点
-
节点表示图形数据模型中的实体或离散对象。节点可以通过关系连接,在属性中保存数据,并通过标签进行分类。
- 节点
-
节点表示图形数据模型中的实体或离散对象。节点可以通过关系连接,在属性中保存数据,并通过标签进行分类。
- 关系
-
关系表示图形数据模型中节点之间的连接。关系将源节点连接到目标节点,在属性中保存数据,并通过类型进行分类。
- 关系
-
关系表示图形数据模型中节点之间的连接。关系将源节点连接到目标节点,在属性中保存数据,并通过类型进行分类。
- 属性
-
属性是用于存储节点和关系上的数据的键值对。
- 属性
-
属性是用于存储节点和关系上的数据的键值对。
- 集群
-
跨越多个服务器的 Neo4j DBMS,这些服务器共同工作以提高容错能力和/或读取可扩展性。集群上的数据库可以配置为在集群中的服务器之间进行复制,从而实现读取可扩展性或高可用性。
- 集群
-
跨越多个服务器的 Neo4j DBMS,这些服务器共同工作以提高容错能力和/或读取可扩展性。集群上的数据库可以配置为在集群中的服务器之间进行复制,从而实现读取可扩展性或高可用性。
- 图形
-
一组节点的逻辑表示,其中某些对通过关系连接。
- 图形
-
一组节点的逻辑表示,其中某些对通过关系连接。
- 模式
-
节点和关系的规定属性存在性和数据类型。
- 模式
-
节点和关系的规定属性存在性和数据类型。
- [[数据库模式]]数据库模式
-
节点和关系的规定属性存在性和数据类型。
- 索引
-
提高数据库读取性能的数据结构。 了解支持的索引类别.
- 索引
-
提高数据库读取性能的数据结构。 了解支持的索引类别.
- 约束
-
约束是一组数据建模规则,用于确保数据一致性和可靠性。 查看 Cypher 中可用的约束.