2014-03-31 50 views
19

我想弄清楚MERGE和CREATE UNIQUE之間有什麼區別。我知道這些功能:合併和獨特的Neo4j之間的區別

MERGE

我能夠創建節點,如果它不存在模式。

MERGE (n { name:"X" }) RETURN n; 

這創建節點「n」與屬性名稱,空節點「m」和關係RELATED。

MERGE (n { name:"X" })-[:RELATED]->(m) RETURN n, m; 

CREATE UNIQUE

我不能這樣創建節點。

CREATE UNIQUE (n { name:"X" }) RETURN n; 

如果存在節點「n」,則創建唯一使空節點「m」和關係RELATED。

MATCH (n { name: 'X' }) CREATE UNIQUE (n)-[:RELATED]->(m) RETURN n, m; 

如果這個模式存在,沒有創建任何東西,只返回模式。

從我的角度來看,我看到MERGE和CREATE UNIQUE是完全相同的查詢,但是CREATE UNIQUE不能在關係中創建起始節點。我會很感激,如果有人能解釋這個問題並比較這些查詢,thx。

回答

28

CREATE UNIQUEMERGE稍微模糊的語義。 MERGE是作爲替代方式開發的,比CREATE UNIQUE更直觀;如果有疑問,MERGE通常是正確的選擇。

想想MERGE的最簡單方法是作爲MATCH或創建。也就是說,如果數據庫中的東西MATCH您在MERGE中使用的模式,那麼MERGE將只返回該模式。如果沒有匹配,則MERGE將在模式中創建所有缺少的元素,其中缺少的元素表示任何未綁定的標識符。

鑑於

MATCH (a {uid:123}) 
MERGE (a)-[r:LIKES]->(b)-[:LIKES]->(c) 

「a」 是從合併的透視綁定標識符。這意味着密碼器已經知道它代表了哪個節點。

該聲明可以有兩個結果。或者整個模式已經存在,並且不會創建任何內容,或者模式的某些部分不存在,並且會創建一組全新的關係和與該模式匹配的節點。

例子

// Before merge: 
(a)-[:LIKES]->()-[:LIKES]->() 

// After merge: 
(a)-[:LIKES]->()-[:LIKES]->() 


// Before merge: 
(a)-[:LIKES]->()-[:OWNS]->() 

// After merge: 
(a)-[:LIKES]->()-[:OWNS]->() 
(a)-[:LIKES]->()-[:LIKES]->() 


// Before merge: 
(a) 

// After merge: 
(a)-[:LIKES]->()-[:LIKES]->() 
+1

爲什麼你會永遠使用剛剛創建的時候,你已經合併? –

+0

'CREATE'通常要快得多。 'CREATE'只是創建你所告訴的內容,而'MERGE'必須執行相同的'MATCH'子句和高級鎖定,以確保沒有其他人同時創建相同的模式。通過創建MERGE可以依賴的唯一性約束,你可以加速許多'MERGE'語句。 – jakewins

+1

@jakewins *思考MERGE的最簡單方法是作爲MATCH或創建。*如果你沒有一個獨特的約束,這不是原子的,這完全把我扔掉了。命名爲'MERGE'並且不是原子的真的很糟糕:(我在添加一個唯一的索引後開始出現死鎖錯誤,這再次給我帶來了困難。所以,我的問題是這樣的:爲什麼我要使用'MERGE' – tugberk