概述
本节提供了 Cypher® 的概述,并简要讨论了 Cypher 与 SQL 的区别。
什么是 Cypher?
Cypher 是 Neo4j 的声明式图查询语言。它由 Neo4j 工程师于 2011 年创建,旨在作为图数据库中 SQL 的等效语言。与 SQL 类似,Cypher 让用户专注于从图中检索“什么”(what),而不是检索的“方式”(how)。因此,Cypher 允许用户通过高效且富有表现力的查询来揭示此前未知的数据连接和集群,从而充分发挥其属性图数据库的潜力。
Cypher 提供了一种匹配模式和关系的视觉化方式。它依赖于以下 ASCII 艺术风格的语法:(nodes)-[:CONNECT_TO]→(otherNodes)。圆括号用于表示圆形的节点,而 -[:ARROWS]→ 则用于表示关系。编写查询实际上就像在图中的数据上绘制模式。换句话说,节点及其关系等实体被直观地构建到查询中。这使得 Cypher 成为一种在阅读和编写方面都非常直观的语言。
Cypher 与 SQL:主要区别
Cypher 和 SQL 在许多方面是相似的。例如,它们共享许多相同的关键字,如 WHERE 和 ORDER BY。然而,两者之间存在一些重要差异:
- Cypher 具有模式灵活性
-
虽然可以通过 图类型/约束 和 索引 在 Neo4j 中强制执行 开放模式(这也是推荐的做法),但与 SQL 和关系数据库相比,Cypher 和 Neo4j 提供了更高程度的模式灵活性。更具体地说,Neo4j 数据库中的节点和关系不需要强制拥有特定的属性,即使同一图中的其他节点或关系拥有该属性(除非在该特定属性上创建了 属性存在约束)。这意味着用户不需要使用固定的模式来表示数据,并且可以随着图的演进随时添加新的属性和关系。
- 查询顺序
-
SQL 查询以用户想要返回的内容开头,而 Cypher 查询则以 return 子句结尾。例如,考虑以下两个查询(均在数据库中搜索评分大于 7 的电影标题),第一个是用 SQL 编写的,第二个是用 Cypher 编写的:
SELECT movie.name FROM movie WHERE movie.rating > 7MATCH (movie:Movie) WHERE movie.rating > 7 RETURN movie.title - Cypher 查询更加简洁
-
由于其直观的、类似白板的子句构建方法,Cypher 查询通常比等效的 SQL 查询更简洁。例如,考虑以下两个查询(均在数据库中搜索电影《黑客帝国》(The Matrix) 中演员的名字),第一个是用 SQL 编写的,第二个是用 Cypher 编写的:
SELECT actors.name FROM actors LEFT JOIN acted_in ON acted_in.actor_id = actors.id LEFT JOIN movies ON movies.id = acted_in.movie_id WHERE movies.title = "The Matrix"MATCH (actor:Actor)-[:ACTED_IN]->(movie:Movie {title: 'The Matrix'}) RETURN actor.name
Cypher 与 APOC
Neo4j 支持 APOC (Awesome Procedures on Cypher) 核心库。APOC 核心库提供了对用户定义过程和函数的访问,这些过程和函数将 Cypher 查询语言的使用扩展到了数据集成、图算法和数据转换等领域。
有关更多详细信息,请访问 APOC 核心页面。