0%

Neo4j 速查手册

基础概念

图数据库中使用以下概念来存储数据:

  • 节点(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"

替换节点属性

警告:如下操作会删除之前的属性并添加 playsage 属性

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