Neo4j常见语句-merge
merge用法:MERGE 是 Neo4j 中一个强大的操作符,用于确保图中存在特定的节点或关系。它的核心逻辑是:如果目标存在则匹配,不存在则创建
基本语法与逻辑:
MERGE <pattern>
[ON CREATE <create_clause>] // 不存在时执行
[ON MATCH <match_clause>] // 存在时执行
(1). 简单创建 / 匹配节点
// 确保存在一个名为"周杰伦"的歌手节点 (多次执行以下语句,只会插入一条数据,因为如果存在则不执行)
MERGE (s:Singer {name: "周杰伦"})
RETURN s
(2)带属性更新的节点 MERGE
// 创建或更新节点属性 (因为上面 周杰伦这条数据创建过,所以走Match,会创建一个lastUpdate 属性)
MERGE (s:Singer {name: "周杰伦"})
ON CREATE SET s.age = 43, s.debut = 2000
ON MATCH SET s.lastUpdate = timestamp()
RETURN s
(3)合并多个标签的节点
// 节点同时属于歌手和演员 (也就是说同时创建3个node 节点Person、Singer、Actor,name属性为刘德华)
MERGE (p:Person:Singer:Actor {name: "刘德华"})
SET p.age = 61
RETURN p
注释:打个比方,如果我已经存在了Person,Singer nodej节点的刘德华,但是没有Actor 节点,执行上面语句,只会创建Actor节点,其他两个节点不会创建
(4)创建 / 匹配节点间的关系
// 确保周杰伦和陈奕迅之间存在"朋友"关系(在如下语句里面会创建周杰伦和陈奕迅这两个节点数据,然后给他们设置关系(如果关系不存在的话))
MERGE (j:Singer {name: "周杰伦"})
MERGE (e:Singer {name: "陈奕迅"})
MERGE (j)-[r:FRIEND]->(e)
SET r.since = 2005
RETURN r
(5)带条件更新的关系 MERGE
// 匹配或创建关系,并根据情况更新属性 (如下语句,因为已经存在两个节点,所以会设置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 约束结合
创建唯一性约束
// 确保姓名是歌手节点的唯一标识
CREATE CONSTRAINT ON (s:Singer) ASSERT s.name IS UNIQUE
基于约束的 MERGE
// 约束会增强 MERGE 的匹配效率
MERGE (s:Singer {name: "王菲"})
SET s.gender = "女"
RETURN s
(7)MERGE 的性能优化
使用 UNWIND 批量处理
// 批量创建多个歌手节点
WITH [{name: "张学友", age: 62},{name: "郭富城", age: 58}
] AS singersUNWIND singers AS singer
MERGE (s:Singer {name: singer.name})
SET s.age = singer.age
RETURN count(s)
(8)MERGE 的注意事项
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)