基础概念
图数据库中使用以下概念来存储数据:
- 节点(Node):图数据记录
- 关系(Relationship):用来连接节点(拥有方向和类型)
- 属性(Property):在节点和关系中以键值对的形式存储数据
- 标签(Label):节点和关系的分组(可选)
Cypher
匹配
匹配节点
1 2 3
| MATCH (ee:Person) WHERE ee.name = "Emil" RETURN ee;
|
- MATCH 子句指定节点和关系的模式
- (ee:Person) 带有
Person
标签的单节点模式,并将匹配项分配给变量 ee
- WHERE 子句用来对返回结果进行约束
- ee.name=”Emil” 将
name
属性与 Emil
进行比较
- RETURN 用于请求特定结果的子句
匹配节点和关系
1 2 3
| MATCH (ee:Person)-[:KNOWS]-(friends) WHERE ee.name = "Emil" RETURN ee, friends
|
- MATCH 子句描述从已知节点查找节点的模式
- (ee) 从标签为
Person
的节点开始模式
- -[:KNOWS]- 匹配
KNOWS
关系(方向不限)
- (friends) 绑定了 Emil 的朋友列表(认识的人)
匹配标签
1 2
| MATCH (n:Person) RETURN n
|
或者
1 2 3
| MATCH (n) WHERE n:Person RETURN n
|
匹配多个标签
匹配 :Car
或 :Person
标签
1 2 3
| MATCH (n) WHERE n:Person OR n:Car RETURN n
|
匹配 :Car
与 :Person
标签
1 2 3
| MATCH (n) WHERE n:Person:Car RETURN n
|
匹配属性
1 2 3
| MATCH (a:Person) WHERE a.from = "Sweden" RETURN a
|
返回属性 from
的值为 Sweden
的每个节点(和他们的关系)
匹配有相同爱好的朋友
Johan 正在学习冲浪,他想认识他的朋友中爱好冲浪的朋友
1 2 3
| MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer) WHERE js.name = "Johan" AND surfer.hobby = "surfing" RETURN DISTINCT surfer
|
- () 空括号忽略这些节点
- DISTINCT 因为不止一条路径与模式匹配
ID 匹配
每个节点都有一个内部的自增 ID,可以通过 <
, <=
, =
, >=
, <>
和 IN
操作进行查询。
通过 ID 查询
1 2 3
| MATCH (n) WHERE id(n) = 0 RETURN n
|
查询多个 ID
1 2 3
| MATCH (n) WHERE id(n) IN [1, 2, 3] RETURN n
|
根据 ID 查询关系
1 2 3
| MATCH ()-[n]-() WHERE id(n) = 0 RETURN n
|
创建
创建节点
1
| CREATE (ee:Person { name: "Emil", from: "Sweden", klout: 99 })
|
- CREATE 子句用来创建数据
- () 圆括号用于表示节点
- ee:Person 将标签为
Person
的新节点赋值给 ee
- {} 花括号为节点添加属性(键值对)
创建节点和关系
1 2 3 4 5 6 7 8 9
| MATCH (ee:Person) WHERE ee.name = "Emil" CREATE (js:Person { name: "Johan", from: "Sweden", learn: "surfing" }), (ir:Person { name: "Ian", from: "England", title: "author" }), (rvb:Person { name: "Rik", from: "Belgium", pet: "Orval" }), (ally:Person { name: "Allison", from: "California", hobby: "surfing" }), (ee)-[:KNOWS {since: 2001}]->(js),(ee)-[:KNOWS {rating: 5}]->(ir), (js)-[:KNOWS]->(ir),(js)-[:KNOWS]->(rvb), (ir)-[:KNOWS]->(js),(ir)-[:KNOWS]->(ally), (rvb)-[:KNOWS]->(ally)
|
- MATCH 子句将
Emil
赋给 ee
- CREATE 子句创建带有标签和属性的多个节点(用逗号分隔),同时创建了带有方向的关系
(a)-[:Label {key: value}]->(b)
在两个无关系的节点间新建关系
1 2 3
| MATCH (n), (m) WHERE n.name = "Allison" AND m.name = "Emil" CREATE (n)-[:KNOWS]->(m)
|
或者使用 MERGE
,这样可以确保关系只创建一次
1 2
| MATCH (n:User {name: "Allison"}), (m:User {name: "Emil"}) MERGE (n)-[:KNOWS]->(m)
|
创建带多个标签的节点
1
| CREATE (n:Actor:Director)
|
更新
更新节点属性(添加或修改)
添加新的 owns
属性(如果已存在则执行修改)
1 2 3
| MATCH (n) WHERE n.name = "Rik" SET n.owns = "Audi"
|
替换节点属性
警告:如下操作会删除之前的属性并添加 plays
和 age
属性
1 2 3
| MATCH (n) WHERE n.name = "Rik" SET n = {plays: "Piano", age: 23}
|
批量添加新的节点属性(不删除老的)
警告:如果 plays
或者 age
属性已经存在的情况下会被覆盖。
1 2 3
| MATCH (n) WHERE n.name = "Rik" SET n += {plays: "Piano", age: 23}
|
属性不存在的情况下添加属性
1 2 3
| MATCH (n) WHERE n.plays = "Guitar" AND NOT (EXISTS (n.likes)) SET n.likes = "Movies"
|
为所有节点属性重命名
1 2 3 4
| MATCH (n) WHERE NOT (EXISTS (n.instrument)) SET n.instrument = n.plays REMOVE n.plays
|
或者
1 2 3 4
| MATCH (n) WHERE n.instrument is null SET n.instrument = n.plays REMOVE n.plays
|
为现有节点添加标签
给 id 为 7 和 8 的节点添加 :Food
标签
1 2 3
| MATCH (n) WHERE id(n) IN [7, 8] SET n:Food
|
如果节点不存在,创建节点并更新(或添加)属性
1 2
| MERGE (n:Person {name: "Rik"}) SET n.owns = "Audi"
|
删除
删除节点
为了删除一个节点(比如,id=5),我们需要先删除他们的关系,然后才可以删除节点。
1 2 3
| MATCH (n)-[r]-() WHERE id(n) = 5 DELETE r, n
|
2.3+
之后的简便写法:
1 2 3
| MATCH (n) WHERE id(n) = 5 DETACH DELETE n
|
删除指定节点的属性
1 2 3
| MATCH (n) WHERE n:Person AND n.name = "Rik" AND n.plays is NOT null REMOVE n.plays
|
或者
1 2 3
| MATCH (n) WHERE n:Person AND n.name = "Rik" AND EXISTS (n.plays) REMOVE n.plays
|
删除多个节点
1 2 3
| MATCH (n) WHERE id(n) IN [1, 2, 3] DELETE n
|
删除全部节点上的标签
从全部节点上删除 :Person
标签
1 2
| MATCH (n) REMOVE n:Person
|
删除具有特定标签节点上的标签
从带有 :Food
和 :Person
标签的节点中删除 :Person
标签
1 2 3
| MATCH (n) WHERE n:Food:Person REMOVE n:Person
|
删除节点中的多个标签
从带有 :Food
和 :Person
标签的节点中删除这两标签
1 2 3
| MATCH (n) WHERE n:Food:Person REMOVE n:Food:Person
|
删除全部数据
1 2 3
| MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n, r
|
2.3+
之后的简便写法:
1
| MATCH (n) DETACH DELETE n
|
其他子句
展示执行计划
在查询语句前使用 PROFILE
或者 EXPLAIN
PROFILE
:显示执行计划,查询信息和数据库命中。如:Cypher version: CYPHER 3.0, planner: COST, runtime: INTERPRETED. 84 total db hits in 32 ms.
EXPLAIN
:显示执行计划和查询信息。如:Cypher version: CYPHER 3.0, planner: COST, runtime: INTERPRETED.
Count
全部节点数量
1 2
| MATCH (n) RETURN count(n)
|
全部关系数量
1 2
| MATCH ()-->() RETURN count(*);
|
Limit
最多返回 2 个 from
属性值为 Sweden
的节点(及其关系)
1 2 3 4
| MATCH (a:Person) WHERE a.from = "Sweden" RETURN a LIMIT 2
|
创建唯一属性约束
使带有 Person
标签节点的 name
属性值唯一
1 2
| CREATE CONSTRAINT ON (n:Person) ASSERT n.name IS UNIQUE
|
删除唯一属性约束
1 2
| DROP CONSTRAINT ON (n:Person) ASSERT n.name IS UNIQUE
|