Neo4j 之 Cypher 笔记
Cypher 简介
Cypher 是 Neo4j 提出的图查询语言,是一种声明式的图数据库查询语言,如同关系数据库中的 SQL,它拥有精简的语法和强大的表现力,能够精准且高效地对图数据进行查询和更新。
1 2
| # Alice 居住在北京 (Alice:Person) -[:LIVES_IN]-> (:City {name: 'Beijing'})
|
节点与关系
在 Neo4j 中,数据以节点、关系的形式存储在数据库中。
节点
在 Cypher 中节点的表示方法非常简单,形式如下:
1 2 3 4 5 6
| (node-name:label-name) { property-name: property-value, property-name: property-value, ... }
|
下面是一些示例:
1 2 3 4 5 6
| () # 匿名的节点 (Alice) # 节点名(变量名)为 Alice (:Person) # 类型为 Person 的节点 (Alice:Person) # 节点名为 Alice,类型为 Person (Alice:Person {name: "Alice"}) # 指定特定属性 (Alice:Person {name: "Alice", age: 12})
|
和 SQL 很相似,Cypher 语言的关键字不区分大小写,但是属性值,标签,关系类型和变量是区分大小写的。
关系
关系通常用箭头来表示:
在 Cypher 中,关系分为三种:符号 --
,表示有关系,忽略关系的类型和方向;符号 -->
和 <--
,表示有方向的关系;通过 [r]
为关系定义一个变量名,命名方法与节点类似。
1 2 3 4 5
| --> # 非直接相连的关系 -[role]-> # 关系名(变量名)为 role -[:LIVES_IN]-> # 类型为 LIVES_IN 的关系 -[role:LIVES_IN]-> # 关系名为 role,类型为 LIVES_IN -[role:LIVES_IN {roles: ["Neo"]}]-> # 指定特定属性
|
变长路径的表示方式是:[*N..M]
,N
和 M
表示路径长度的最小值和最大值
1 2 3 4 5
| (a)-[*2]->(b) # 表示路径长度为2,起始节点是a,终止节点是b; (a)-[*3..5]->(b) # 表示路径长度的最小值是3,最大值是5,起始节点是a,终止节点是b; (a)-[*..5]->(b) # 表示路径长度的最大值是5,起始节点是a,终止节点是b; (a)-[*3..]->(b) # 表示路径长度的最小值是3,起始节点是a,终止节点是b; (a)-[*]->(b) # 表示不限制路径长度,起始节点是a,终止节点是b;
|
模式
将节点和关系组合起来,得出一个模式,就像最开始展示的:
1 2
| # Alice 居住在北京 (Alice:Person) -[:LIVES_IN]-> (:City {name: 'Beijing'})
|
Cypher 关键字
与 SQL 类似,Cypher 中也有类似于 SELECT
,FROM
,WHERE
的关键字。
MATCH & RETURN
MATCH
用于检索图数据库中的节点和关系,RETURN
则返回匹配结果,两者通常结合使用。
OPTIONAL MATCH
可选的,对于找不到的匹配项,会用 null
代替
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| # 节点查找 # 查找所有电影 MATCH (m:Movie) RETURN m
# 查找所有姓名为 Alice 的人 MATCH (p:Person {name: "Alice"}) RETURN p
# 关系查找 # 查找所有与成龙有关的电影的名字(一跳) MATCH (p:Person {name: "jackie chan"}) --> (m:Movie) RETURN m.name
# 查找成龙与电影之间的关系(一跳) MATCH (p:Person {name: "jackie chan"}) -[r]-> (m:Movie) RETURN R
|
CREATE & DELETE
使用 CREATE
关键字能够创建节点、关系、模式,只要加上关键词 CREATE
。
DELETE
用于删除节点和关系。
1 2 3 4 5 6 7 8 9 10 11
| # 创建节点 Alice,类型为 Person CREATE (Alice:Person {name: "Alice", age: 12}) # 创建关系 Alice 认识 Bob CREATE (Alice) -[:KNOWS]-> (Bob:Person {name:"Bob"})
# 删除所有名为 Alice 的人物节点 MATCH (p:Person {name: "Alice"}) DELETE p # 删除所有名为 Alice 的人物节点,并删除与其有关联的所有关系 MATCH (p:Person {name: "Alice"}) DETACH DELETE p
|
WHERE
WHERE
用于为 MATCH,OPTIONAL MATCH 和 WITH 语句添加过滤条件。
1 2 3 4
| # 查找所有2000年之后的电影 MATCH (m:Movie) WHERE m.year > 2000 RETURN m
|
WITH
WITH
用于向后面的语句传递指定结果,并可以改变结果集中实体的形式和数量。
1 2 3 4 5
| # 查询五部评分最高的电影,并查找与这五部电影有关系的人物 MATCH (m:Movie) WITH m ORDER BY m.score DESC LIMIT 5 MATCH (m:Movie)-[r]-(p:Person) RETURN p
|
ORDER BY
ORDER BY
用于对结果进行排序。
1 2 3 4
| # 查找所有人物节点,返回姓名和年龄,并按人物姓名排序 MATCH (p:Person) RETURN p.name, p.age ORDER BY p.name
|
SKIP & LIMIT
SKIP
用于跳过指定行数的结果,LIMIT
用于保留指定行数的结果。
1 2 3 4 5 6 7 8 9 10
| # 查找所有人物的姓名,跳过前3个人 MATCH (p:Person) RETURN p.name SKIP 3
# 查找所有人物节点,按年龄排序,保留前5个 MATCH (p:Person) RETURN p ORDER BY p.age LIMIT 5
|
SET & REMOVE
SET
用于设置节点和关系的属性,REMOVE
用于移除节点和关系的属性。
1 2 3 4 5 6 7
| MATCH (p:Person {name: "Bob"}) SET p.age = 18 RETURN p.age
MATCH (p:Person {name: "Bob"}) REMOVE p.age RETURN p
|
MERGE
MERGE
用于保证元素一定存在,作用为查询节点和边,若查不到就创建该节点和边。
1 2 3 4
| # 查找人物成龙和电影十二生肖,再查找之间的出演关系,若找不到该关系,则创建该关系 MATCH (p:Person {name: "jackie chan"}), (m:Movie {name: "十二生肖"}) MERGE (p)-[r:ACT_IN]->(m) RETURN n.name, r, m.name
|
参考资料