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)
相关推荐
2501_941823372 天前
Java高性能图像识别与TensorFlow实战分享:深度学习模型部署与优化经验
neo4j
松岛雾奈.2302 天前
深度学习--TensorFlow框架使用
深度学习·tensorflow·neo4j
艾斯比的日常3 天前
Neo4j 完全指南:从核心特性到 Java 实战(附企业级应用场景)
java·开发语言·neo4j
hai-chu4 天前
将 Neo4j 安装为 macOS 服务
macos·策略模式·neo4j
Petrichor_H_7 天前
DAY 36 复习日
neo4j
计算机毕业设计指导8 天前
基于Neo4j的民航知识图谱问答系统设计与实现
知识图谱·neo4j·easyui
L.EscaRC9 天前
Neo4j Cypher查询语言深度解析
neo4j
L.EscaRC9 天前
图数据库Neo4j原理与运用
数据库·oracle·neo4j
知己80809 天前
docker搭建图数据库neo4j
数据库·docker·neo4j
羊羊小栈10 天前
基于知识图谱(Neo4j)和大语言模型(LLM)的图检索增强(GraphRAG)的医疗健康知识问诊系统(vue+flask+AI算法)
人工智能·语言模型·毕业设计·知识图谱·neo4j·大作业