2014-02-21 75 views
1

這是的情況: 我有一個節點,有一個屬性ContactId設置爲唯一和索引。該節點標籤:聯繫 (節點:聯繫{使用ContactID:1})Neo4j 2.0與獨特的約束性能錯誤合併?

我有類似的模式來解決另一個節點: (節點2:地址{AddressId:1})

我現在就來試試添加一個新的節點(其他屬性,包括ContactId(用於引用)) (node3:ContactAddress {AddressId:1,ContactId:1})

當我爲每個運行合併命令時,包含在另一個節點類型中設置爲唯一的屬性的節點似乎會使該過程變得更慢。

ContactAddress節點只包含Contact和Address節點之間的關係屬性。聯繫人和地址節點最多包含10個屬性。這是一個錯誤,其中Neo4j是檢查屬性鍵 - >值 - >然後節點標籤?

代碼和屏幕截圖下面:

string strForEach = string.Format("(n in {{{0}}} | 
MERGE (c:{1} {{{2} : n.{2}}}) SET c = n)", propKey, label, PK_Field); 

var query = client 
      .Cypher 
      .ForEach(strForEach) 
      .WithParam(propKey, entities.ToList()); 

Process timings

回答

0

約束檢查不僅僅是插入更昂貴。他們還對約束進行全局鎖定以防止多次插入。

我看到你不使用參數,但字符串替代,我真的建議改變,並與參數。

還設置整個節點c到n觸發器再次約束檢查。

你可能想使用MERGE

(n in {nodes} | 
MERGE (c:Label {key : n.key}}) ON CREATE SET c.foo = n.foo, c.bar = n.bar) 
+0

謝謝邁克爾的ON CREATE SET條款。我使用的參數是項目列表。我可以爲標籤和唯一鍵添加參數。 On Create函數會加快速度嗎?在這個例子中,整個合併點是我想總是更新基於新列表的值。所以在創建和匹配時,'set c = n'。另一個問題是這個列表是動態的,所以讓你的例子中的屬性設置會很麻煩......但是如果你認爲這對性能有幫助,我可以嘗試一下。你知道任何有關這方面的文檔嗎? – dcinzona

+0

另外,請記住,合併也發生在前兩個節點類型(聯繫人和地址)上,但是這些插入的速度大約爲1秒(仍然很糟糕),但是當您查看「聯繫地址」節點插入,它包含索引的ContactId和AddressId鍵,它需要更長的時間。 – dcinzona

+0

有關您的參數評論的另一個快速問題,如何快速地再次查找標籤?我的意思是,怎麼能這樣做:'{labelName} - >解析Params的正確值 - >第二個參數列表中的查找值比跳過整個第一個參數解析步驟快嗎?我的意思是,在我的腦海中,沒有辦法讓2次查找比一次快,但是再次,我真的是新的(顯然)是Neo4j。如果參數查找比靜態設置字符串更快,真棒,我會做出改變。我只是不知道它會如何。 – dcinzona