Cypher介绍

Neo
Neo
2022-03-11 / 0 评论 / 57 阅读

本节内容源自Cypher官方手册V4.4版,笔者对其进行学习、翻译、记录。

什么是 Cypher?

Cypher 是一种声明式图查询语言,它允许对图进行表达性和高效的查询、更新和管理。它旨在适用于开发人员和运营专业人员。Cypher 设计简单但功能强大;可以轻松表达高度复杂的数据库查询,使您能够专注于您的领域,而不是迷失在数据库访问中。

Cypher 受到许多不同方法的启发,并建立在表达查询的既定实践之上。许多关键字,例如 WHERE 和 ORDER BY,都受到SQL的启发。模式匹配借鉴了SPARQL的表达式方法。一些列表语义是从 Haskell 和 Python 等语言中借用的。Cypher 的结构基于英文散文和简图,使查询变得容易,无论是书写还是阅读。

结构

Cypher 借鉴了 SQL 的结构—查询是使用各种子句构建的。

子句链接在一起,它们在彼此之间提供中间结果集。例如,一个子句中的匹配变量 MATCH 将是下一个子句所在的上下文。

查询语言由几个不同的子句组成。这些在子句章节中有更详细的讨论。

以下是一些用于从图中读取的子句示例:

  • MATCH:要匹配的图模式。这是从图中获取数据的最常用方法。

  • WHERE: 本身不是一个子句,而是 MATCH, OPTIONAL MATCH 和 WITH 的一部分。向模式添加约束,或通过WITH过滤中间结果.

  • RETURN: 返回什么。

让我们使用以下查询创建一个简单的示例图:

CREATE (john:Person {name: 'John'})
CREATE (joe:Person {name: 'Joe'})
CREATE (steve:Person {name: 'Steve'})
CREATE (sara:Person {name: 'Sara'})
CREATE (maria:Person {name: 'Maria'})
CREATE (john)-[:FRIEND]->(joe)-[:FRIEND]->(steve)
CREATE (john)-[:FRIEND]->(sara)-[:FRIEND]->(maria)

image.png

例如,这是一个查询,它在返回“John”和找到任何朋友的朋友(即间接朋友)

MATCH (john {name: 'John'})-[:FRIEND]->()-[:FRIEND]->(fof)
RETURN john.name, fof.name

查询结果:

+----------------------+
| john.name | fof.name |
+----------------------+
| "John"    | "Maria"  |
| "John"    | "Steve"  |
+----------------------+
2 rows

接下来,我们将添加过滤以设置更多动态部分:

我们获取一个用户名列表,并从该列表中找到具有名称的所有节点,匹配他们的朋友并仅返回那些具有以'S'开头的'name'属性的被关注用户。

MATCH (user)-[:FRIEND]->(follower)
WHERE user.name IN ['Joe', 'John', 'Sara', 'Maria', 'Steve'] AND follower.name =~ 'S.*'
RETURN user.name, follower.name

查询结果:

+---------------------------+
| user.name | follower.name |
+---------------------------+
| "John"    | "Sara"        |
| "Joe"     | "Steve"       |
+---------------------------+
2 rows

这些是用于更新图的子句示例:

  • CREATE(和DELETE):创建(和删除)节点和关系。

  • SET(和REMOVE):使用SET为属性设置值和在节点上添加标签,用REMOVE删除它们。

  • MERGE:匹配现有的或创建新的节点和模式。这与唯一性约束一起特别有用。