1. 什么是 Cypher #
1.1 基础概念 #
Cypher® 是 Neo4j 图数据库的查询语言,就像 SQL 是关系型数据库的查询语言一样。Cypher 专门为图数据库设计,让你能够用接近自然语言的方式来查询和操作图数据。
1.2 前置知识:什么是查询语言? #
查询语言是一种用来与数据库"对话"的语言。就像人类用语言交流一样,你需要用查询语言告诉数据库你想要什么数据。
常见的查询语言:
- SQL:用于关系型数据库(MySQL、PostgreSQL等)
- Cypher:用于图数据库(Neo4j)
- MongoDB Query Language:用于文档数据库(MongoDB)
1.3 Cypher 的特点 #
- 直观易读:语法接近自然语言,读起来就像在描述图的结构
- ASCII 艺术风格:使用括号、箭头等符号直观表示图结构
- 声明式语言:你只需要描述"想要什么",不需要说明"如何获取"
- 模式匹配:强大的模式识别和匹配能力
1.4 为什么叫 Cypher? #
Cypher 这个名字来源于"密码"(Cipher),但这里不是指加密,而是指"用符号表示"的意思。Cypher 用符号(括号、箭头)来表示图的结构,就像用密码符号表示信息一样。
2. Cypher 的基本语法 #
2.1 前置知识:什么是声明式语言? #
声明式语言(Declarative Language)是一种编程范式,你只需要描述"想要什么结果",而不需要说明"如何得到这个结果"。
对比:
- 命令式语言(如 Python):你需要一步步告诉计算机怎么做
- 声明式语言(如 Cypher):你只需要描述结果,数据库自己决定怎么做
示例对比:
# 定义一个函数,查找某个人的朋友
def find_friends(person):
# 新建一个空列表用于存储朋友
friends = []
# 遍历此人的所有关系
for relationship in person.relationships:
# 判断关系类型是否为"IS_FRIENDS_WITH"(朋友关系)
if relationship.type == "IS_FRIENDS_WITH":
# 如果是朋友关系,把关系的目标节点加入朋友列表
friends.append(relationship.end_node)
# 返回所有找到的朋友列表
return friends# 匹配所有标签为 Person 的节点,变量名为 p
MATCH (p:Person)-[:IS_FRIENDS_WITH]->(friend)
# 查找通过 IS_FRIENDS_WITH 关系连接的 friend 节点
RETURN friend2.2 Cypher 的基本结构 #
Cypher 查询通常由以下几个部分组成:
- MATCH:匹配图中的模式(查找数据)
- WHERE:过滤条件(可选)
- RETURN:返回结果
基本格式:
MATCH (模式)
WHERE (条件)
RETURN (结果)2.3 用自然语言理解 Cypher #
Cypher 的语法设计让你可以用接近自然语言的方式描述图:
自然语言:
- "Sally 喜欢图数据库"
- "Sally 与 John 是朋友"
- "Sally 为 Neo4j 公司工作"
Cypher 表示:
(Sally)-[:LIKES]->(Graphs)
(Sally)-[:IS_FRIENDS_WITH]->(John)
(Sally)-[:WORKS_FOR]->(Neo4j)是不是很像?这就是 Cypher 的优势——直观易懂!
3. Cypher 关键字速览 #
Cypher 提供了丰富的关键字来操作图数据。以下是常用的关键字:
| 关键字 | 作用 | 示例 | 说明 |
|---|---|---|---|
MATCH |
匹配图中的节点和关系,用于查询 | MATCH (p:Person {name: "张三"}) RETURN p |
查找名字是张三的节点 |
MERGE |
如果找不到则创建节点/关系,否则返回已存在的 | MERGE (n:City {name: "北京"}) RETURN n |
没有北京就创建,有则返回 |
CREATE |
创建新的节点和关系 | CREATE (p:Person {name: "张三"}) |
创建新节点 |
WHERE |
增加过滤条件 | MATCH (p:Person) WHERE p.age > 18 RETURN p |
查询大于18岁的所有人 |
NOT |
逻辑非,用于反向筛选 | MATCH (p:Person) WHERE NOT p.city = "上海" RETURN p |
查询不是上海的所有人 |
RETURN |
指定查询结果的输出项 | MATCH (p:Person) RETURN p.name, p.age |
只返回名字和年龄 |
DISTINCT |
去重,只显示不同的结果 | MATCH (p:Person) RETURN DISTINCT p.city |
返回去重后的城市列表 |
AS |
给输出结果起别名,方便阅读和使用 | MATCH (p:Person) RETURN p.name AS 姓名, p.age AS 年龄 |
给属性重命名 |
SET |
更新节点或关系的属性 | MATCH (p:Person) SET p.age = 30 |
更新年龄属性 |
DELETE |
删除节点或关系 | MATCH (p:Person) DELETE p |
删除节点 |
DETACH DELETE |
删除节点及其所有关系 | MATCH (p:Person) DETACH DELETE p |
删除节点和关系 |
REMOVE |
删除属性或标签 | MATCH (p:Person) REMOVE p.email |
删除属性 |
ORDER BY |
排序结果 | MATCH (p:Person) RETURN p ORDER BY p.age |
按年龄排序 |
LIMIT |
限制返回结果数量 | MATCH (p:Person) RETURN p LIMIT 10 |
只返回前10条 |
SKIP |
跳过前面的结果 | MATCH (p:Person) RETURN p SKIP 10 LIMIT 10 |
跳过前10条,返回接下来的10条 |
3.1 常用函数 #
| 函数 | 作用 | 示例 | 说明 |
|---|---|---|---|
type() |
获取关系的类型 | MATCH ()-[r]->() RETURN type(r) |
返回关系类型(如 "LIKES") |
labels() |
获取节点的所有标签(列表) | MATCH (n) RETURN n.name, labels(n) |
返回节点的所有标签 |
length() |
计算路径的长度(边的数量) | MATCH p=(a)-[*]->(b) RETURN length(p) |
返回路径包含的关系数(跳数) |
nodes() |
获取路径上的所有节点列表 | MATCH p=(a)-[*]->(b) RETURN nodes(p) |
返回路径上所有节点(按顺序排列) |
shortestPath() |
查找两个节点之间的最短路径 | MATCH p=shortestPath((a)-[*]-(b)) RETURN p |
返回最短路径 |
4. Cypher 查询示例 #
4.1 基本查询 #
// 清空数据库
MATCH (n) DETACH DELETE n
// 创建测试数据
CREATE (p1:Person {name: 'Sally', age: 30}),
(p2:Person {name: 'John', age: 25}),
(c1:Company {name: 'Neo4j'}),
(p1)-[:WORKS_FOR]->(c1),
(p1)-[:IS_FRIENDS_WITH]->(p2)
// 查询所有 Person 节点
MATCH (p:Person)
RETURN p.name, p.age
// 查询名字为 Sally 的 Person 节点
MATCH (p:Person {name: 'Sally'})
RETURN p
// 查询 Sally 的工作关系
MATCH (p:Person {name: 'Sally'})-[r:WORKS_FOR]->(c:Company)
RETURN p.name, c.name, type(r)
// 查询 Sally 的朋友
MATCH (p:Person {name: 'Sally'})-[:IS_FRIENDS_WITH]->(friend:Person)
RETURN friend.name4.2 使用 WHERE 过滤 #
// 查询年龄大于25岁的人
MATCH (p:Person)
WHERE p.age > 25
RETURN p.name, p.age
// 查询在 Neo4j 公司工作的人
MATCH (p:Person)-[:WORKS_FOR]->(c:Company)
WHERE c.name = 'Neo4j'
RETURN p.name4.3 使用 RETURN 返回结果 #
// 返回所有属性
MATCH (p:Person)
RETURN p
// 返回特定属性
MATCH (p:Person)
RETURN p.name, p.age
// 使用别名
MATCH (p:Person)
RETURN p.name AS 姓名, p.age AS 年龄
// 返回去重结果
MATCH (p:Person)
RETURN DISTINCT p.city5. 小结 #
5.1 Cypher 是什么? #
Cypher 是 Neo4j 图数据库的查询语言,专门为图数据库设计,让你能够用接近自然语言的方式来查询和操作图数据。
5.2 Cypher 的特点 #
- 直观易读:语法接近自然语言
- ASCII 艺术风格:使用括号、箭头等符号直观表示图结构
- 声明式语言:只需要描述"想要什么"
- 模式匹配:强大的模式识别和匹配能力
5.3 基本结构 #
MATCH (模式)
WHERE (条件)
RETURN (结果)5.4 常用关键字 #
- MATCH:匹配图中的模式
- CREATE:创建新数据
- MERGE:创建或匹配数据
- WHERE:过滤条件
- RETURN:返回结果
- SET:更新属性
- DELETE:删除数据