什么是 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 的构造接近自然语言,其语法旨在从视觉上呈现出图的形状。
如果您想用英语表达此图中的数据,它读起来就像是:“Sally 喜欢图 (Graphs)。Sally 是 John 的朋友。Sally 为 Neo4j 工作。”
现在,如果您用 Cypher 来编写相同的信息,它看起来会是这样
(:Sally)-[:LIKES]->(:Graphs)
(:Sally)-[:IS_FRIENDS_WITH]->(:John)
(:Sally)-[:WORKS_FOR]->(:Neo4j)
通过这个查询,您将信息转化为节点和关系,这是 Cypher 的核心元素。
节点
图中的主要组件是节点和关系。节点通常用于表示数据模型中的名词或对象。在前面的示例中,Sally、John、Graphs 和 Neo4j 就是节点。
如前所述,节点在 Cypher 中表示为圆括号 (node)。圆括号代表了可视化中构成节点的圆圈。
节点标签 (Node labels)
节点可以通过标签进行分组,标签的作用类似于标记,允许您在查询中指定特定类型的实体。标签有助于 Cypher 区分不同的节点并优化执行。
在示例中,Sally 和 John 都是人,所以他们获得了 Person 标签;Graphs 获得了 Technology 标签;而 Neo4j 是一个 Company。
在关系型数据库中,这相当于使用 SQL 来引用表中的特定行。正如您可以使用 SQL 从 Person 表查询某个人的信息一样,您也可以在 Cypher 中使用 Person 标签来获取该信息。
|
如果您没有为 Cypher 指定标签来过滤不匹配的节点类别,查询将检查数据库中的所有节点。这可能会影响超大规模图的性能。 |
节点变量 (Node variables)
如果查询的部分内容匹配到了您需要在后续查询(即子句)中引用的节点,则可以使用节点变量。
变量可以是单个字母或单词,应使用小写字母书写。例如,如果您想将所有标记为 Person 的节点绑定到变量 p,您可以写成 (p:Person)。如果您想使用完整的单词作为变量,(person:Person) 的效果完全一样。
MATCH (p:Person)
RETURN p
关系 (Relationships)
在图数据库中,节点和关系都是“一等公民”,它们具有同等价值。在关系型数据库中,关系仅通过外键和连接表隐含表示。
在 Cypher 中,关系表示为方括号,并带有一个可选的箭头来指示方向(例如 (Node1)-[]→(Node2))。
在示例中,连接节点的箭头表示节点之间的关系。
关系方向
关系始终有一个由箭头指示的方向。
它们可以从左向右
(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)来返回绑定的实体。
这就是您的结果
| p | r | t |
|---|---|---|
|
|
|
行:1 |
||
属性 (Properties)
属性用于存储额外信息,可以添加到节点和关系中,并且可以是多种数据类型。有关值和类型的完整列表,请参阅 Cypher 手册 → 值和类型。
在下面的示例中,sally 和 john 是 Person 节点的变量,这些节点包含一个 name 属性,其属性值分别为 "Sally" 和 "John"。
要将此信息添加到图中,您可以使用以下查询
CREATE (sally:Person {name:'Sally'})-[r:IS_FRIENDS_WITH]->(john:Person {name:'John'})
RETURN sally, r, john
属性用花括号 ({}) 括起来,键后面跟冒号,值用单引号或双引号括起来。
Cypher 中的模式 (Patterns)
图模式匹配是 Cypher 的核心。它是一种通过应用声明式模式来导航、描述和从图中提取数据的机制。
考虑这个例子
(sally:Person {name:'Sally'})-[l:LIKES]->(g:Technology {type: "Graphs"})
这段 Cypher 代码代表了一个模式。它表示一个 name 属性为 Sally 的 Person 节点,与一个 type 属性为 Graphs 的 Technology 节点之间存在 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 手册 → 模式 → 语法和语义。
持续学习
从 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 中,数据模型具有图结构。