什么是 Cypher
本页涵盖 Cypher® 的基础知识。如需完整文档,请参阅Cypher。 |
Cypher 是 Neo4j 的声明式且符合 GQL 标准的查询语言。通过openCypher 项目以开源形式提供,Cypher 类似于 SQL,但针对图进行了优化。
Cypher 直观且接近自然语言,通过其基于 ASCII 艺术式语法的自身设计,提供了一种可视化匹配模式和关系的方式。
(:nodes)-[:ARE_CONNECTED_TO]->(:otherNodes)
使用圆括号表示 (:Nodes)
,使用 -[:ARROWS]→
表示 (:Nodes)
之间的关系。使用此查询语法,您可以对图执行创建、读取、更新或删除 (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 中,您可以通过用括号括起来表示一个节点,例如 (node)
。括号表示可视化中构成节点的圆圈。
节点标签
节点可以通过标签进行分组。它们像标签一样工作,允许您指定要查找或创建的特定实体类型。标签还有助于 Cypher 区分实体并优化查询执行。
在此示例中,Sally
和 John
都可以归类到 Person
标签下,Graphs
可以获得 Technology
标签,而 Neo4j
可以标记为 Company
。
在关系型数据库上下文中,这等同于告诉 SQL 在哪个表中查找特定行。正如您可以告诉 SQL 从 Person
表中查询人员信息一样,您也可以告诉 Cypher 只检查 Person
标签以获取该信息。
如果您不为 Cypher 指定标签以过滤掉不匹配的节点类别,查询将检查数据库中的所有节点。这可能会影响非常大图的性能。 |
关系
图数据库的优势之一是您可以以关系的形式存储有关元素(节点)之间如何相互关联的信息。
在 Cypher 中,关系表示为方括号和连接两个节点的箭头(例如 (Node1)-[]→(Node2)
)。
在此示例中,包含 :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
)都指定了变量。在 RETURN 子句中,您可以使用这些变量(即 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
节点之间存在 LIKES
关系,该 Technology
节点的 type
属性为 Graphs。
为了对这个模式进行一些操作,例如将其添加到图或从图检索,您需要查询数据库。
例如,您可以使用 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 手册中,您可以找到更多信息,包括:
从 NoSQL 到图
如果您熟悉 NoSQL(“不仅仅是 SQL”)系统,您还可以了解更多关于如何过渡到图数据库的信息。
GraphAcademy
通过Cypher 基础课程,您可以在 60 分钟内学习 Cypher 并使用沙盒进行实践。
其他资源
有关如何扩展 Cypher 知识的更多建议,请参阅资源。
术语表
- 标签
-
将节点标记为命名且已索引子集的成员。一个节点可以分配零个或多个标签。
- 标签
-
标签将节点标记为命名且已索引子集的成员。一个节点可以分配零个或多个标签。
- 节点
-
节点代表图数据模型中的一个实体或离散对象。节点可以通过关系连接,在属性中保存数据,并按标签进行分类。
- 节点
-
节点代表图数据模型中的一个实体或离散对象。节点可以通过关系连接,在属性中保存数据,并按标签进行分类。
- 关系
-
关系代表图数据模型中节点之间的连接。关系连接源节点和目标节点,在属性中保存数据,并按类型进行分类。
- 关系
-
关系代表图数据模型中节点之间的连接。关系连接源节点和目标节点,在属性中保存数据,并按类型进行分类。
- 属性
-
属性是用于在节点和关系上存储数据的键值对。
- 属性
-
属性是用于在节点和关系上存储数据的键值对。
- 集群
-
一个 Neo4j DBMS,它跨多个服务器协同工作,以提高容错性或读取可扩展性。集群上的数据库可以配置为在集群中的服务器之间进行复制,从而实现读取可扩展性或高可用性。
- 集群
-
一个 Neo4j DBMS,它跨多个服务器协同工作,以提高容错性或读取可扩展性。集群上的数据库可以配置为在集群中的服务器之间进行复制,从而实现读取可扩展性或高可用性。
- 图
-
一组节点的逻辑表示,其中某些对通过关系连接。
- 图
-
一组节点的逻辑表示,其中某些对通过关系连接。
- 模式
-
节点和关系的规定属性存在和数据类型。
- 模式
-
节点和关系的规定属性存在和数据类型。
- [[数据库模式]]数据库模式
-
节点和关系的规定属性存在和数据类型。
- 索引
-
一种提高数据库读取性能的数据结构。阅读有关支持的索引类别的更多信息。
- 已索引
-
一种提高数据库读取性能的数据结构。阅读有关支持的索引类别的更多信息。
- 约束
-
约束是一组数据建模规则,可确保数据的一致性和可靠性。查看 Cypher 中可用的约束。
- 数据模型
-
数据模型定义了信息在数据库中的组织方式。一个好的数据模型将使查询和理解数据变得更容易。在 Neo4j 中,数据模型具有图结构。
- 数据模型
-
数据模型定义了信息在数据库中的组织方式。一个好的数据模型将使查询和理解数据变得更容易。在 Neo4j 中,数据模型具有图结构。