Neo4j常见语句-merge

merge用法:MERGE 是 Neo4j 中一个强大的操作符,用于确保图中存在特定的节点或关系。它的核心逻辑是:如果目标存在则匹配,不存在则创建

基本语法与逻辑:

bash 复制代码
MERGE <pattern>
[ON CREATE <create_clause>]  // 不存在时执行
[ON MATCH <match_clause>]     // 存在时执行

(1). 简单创建 / 匹配节点

bash 复制代码
 // 确保存在一个名为"周杰伦"的歌手节点 (多次执行以下语句,只会插入一条数据,因为如果存在则不执行)
MERGE (s:Singer {name: "周杰伦"})
RETURN s

(2)带属性更新的节点 MERGE

bash 复制代码
  // 创建或更新节点属性 (因为上面 周杰伦这条数据创建过,所以走Match,会创建一个lastUpdate 属性)
MERGE (s:Singer {name: "周杰伦"})
ON CREATE SET s.age = 43, s.debut = 2000
ON MATCH SET s.lastUpdate = timestamp()
RETURN s

(3)合并多个标签的节点

bash 复制代码
  // 节点同时属于歌手和演员 (也就是说同时创建3个node 节点Person、Singer、Actor,name属性为刘德华)
MERGE (p:Person:Singer:Actor {name: "刘德华"})
SET p.age = 61
RETURN p

注释:打个比方,如果我已经存在了Person,Singer nodej节点的刘德华,但是没有Actor 节点,执行上面语句,只会创建Actor节点,其他两个节点不会创建

(4)创建 / 匹配节点间的关系

bash 复制代码
  // 确保周杰伦和陈奕迅之间存在"朋友"关系(在如下语句里面会创建周杰伦和陈奕迅这两个节点数据,然后给他们设置关系(如果关系不存在的话))
MERGE (j:Singer {name: "周杰伦"})
MERGE (e:Singer {name: "陈奕迅"})
MERGE (j)-[r:FRIEND]->(e)
SET r.since = 2005
RETURN r

(5)带条件更新的关系 MERGE

bash 复制代码
 // 匹配或创建关系,并根据情况更新属性 (如下语句,因为已经存在两个节点,所以会设置lastMet的关系属性)
MERGE (j:Singer {name: "周杰伦"})-[r:FRIEND]-(e:Singer {name: "陈奕迅"})
ON CREATE SET r.since = 2005, r.verified = true
ON MATCH SET r.lastMet = timestamp()
RETURN r

(6)MERGE 与 UNIQUE 约束结合

创建唯一性约束

bash 复制代码
  // 确保姓名是歌手节点的唯一标识
CREATE CONSTRAINT ON (s:Singer) ASSERT s.name IS UNIQUE

基于约束的 MERGE

bash 复制代码
 // 约束会增强 MERGE 的匹配效率
MERGE (s:Singer {name: "王菲"})
SET s.gender = "女"
RETURN s

(7)MERGE 的性能优化

使用 UNWIND 批量处理

bash 复制代码
 // 批量创建多个歌手节点
WITH [
  {name: "张学友", age: 62},
  {name: "郭富城", age: 58}
] AS singers

UNWIND singers AS singer
MERGE (s:Singer {name: singer.name})
SET s.age = singer.age
RETURN count(s)

(8)MERGE 的注意事项

bash 复制代码
a.模式匹配的精确性:
MERGE (n:Person {name: "张三"}) 只会匹配完全符合属性的节点,若节点还有其他属性(如 age),仍会被匹配。
b.性能开销:
MERGE 比 CREATE 慢,因为它需要先检查是否存在,适合需要避免重复数据的场景。
c.与 WHERE 结合
// 仅当歌手年龄小于60时才创建关系
MERGE (j:Singer {name: "周杰伦"})
MERGE (s:Singer {name: "孙燕姿"})
WHERE s.age < 60
MERGE (j)-[r:COLLABORATED]->(s)
相关推荐
曾几何时`8 小时前
基于python和neo4j构建知识图谱医药问答系统
python·知识图谱·neo4j
RoundLet_Y1 天前
【知识图谱】Neo4j桌面版运行不起来怎么办?Neo4j Desktop无法打开!
数据库·python·知识图谱·neo4j
曾几何时`6 天前
Neo4j启动
数据库·neo4j
欧阳秦穆9 天前
Neo4j desktop 2.0.1版本如何安装apoc、gds等插件
neo4j
路溪非溪9 天前
Tensorflow的安装记录
人工智能·tensorflow·neo4j
一屉大大大花卷9 天前
初识Neo4j之图数据库(二)
数据库·neo4j
一屉大大大花卷11 天前
初识Neo4j之入门介绍(一)
数据库·neo4j
AustinCyy13 天前
【环境配置】Neo4j Community Windows 安装教程
windows·neo4j
萧鼎13 天前
深度探索 Py2neo:用 Python 玩转图数据库 Neo4j
数据库·python·neo4j
背太阳的牧羊人13 天前
Cypher 是 Neo4j 专用的查询语言
neo4j