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)