2015-08-28 75 views
1

我最近發現執行併發MERGE語句時存在競爭條件。具體而言,可以在步驟MATCH之後但在給定MERGE的步驟CREATE之前創建節點的情況下創建重複節點。創建獨特路徑時是否存在競爭條件?

這可以在一些情況下在合併節點上使用唯一約束來解決;但是,在以下情況下,這種情況不足:

  1. 沒有單一的唯一屬性強制執行(例如,屬性對必須是唯一的,但個別屬性不需要)。
  2. 嘗試合併關係和路徑。

是否使用CREATE UNIQUE解決這個問題(或者做同樣的陷阱存在)?如果是這樣,它是唯一的選擇嗎?感覺好像MERGE的有用性在其無法保證路徑或節點被合併的唯一性時會相當嚴重地減少...

+0

根據[本Grokbase問題]的答案(http://grokbase.com/t/gg/neo4j/137q6a6rg5/are-merge-operations-in-cypher-atomic),「MERGE」應該是作爲neo4j 2.0的最終版本的原子。如果您檢測到非原子行爲,則應該[創建neo4j問題](http://grokbase.com/t/gg/neo4j/137q6a6rg5/are-merge-operations-in-cypher-atomic)。 – cybersam

+0

[這是正確的鏈接](https://github.com/neo4j/neo4j/issues)用於創建問題。我只是檢查了一下,並且[這個存在的問題](https://github.com/neo4j/neo4j/issues/5091)可能會出現同樣的問題。 – cybersam

+0

對於複合屬性,您可以對數組prop使用唯一約束。 –

回答

0

MERGE語句同時執行時,可能會發生這些情況。基本上,每筆交易在第一次閱讀時都會看到圖表,並且不會看到該點後的更新(有一些變化)。這個主要的例外是獨特的約束節點,其中Neo4j將在讀取時從索引初始化新的讀取器,而不管之前在事務中讀取什麼。

解決方法是創建一個「虛擬」屬性及其唯一約束條件和其中一個節點標籤。在Neo4j 2.2.5中,這應該解決您的問題。