2017-02-24 34 views
0

Neo4j的關係寫入性能我評估的Neo4j在交互式應用程序使用的數據存儲。有了下面的代碼,我可以增加一個40毫秒左右的關係,這對我們的需求來說太慢了,因爲我們的模型可以有數萬個關係。 這是典型的表現嗎?任何改進代碼的提示?我測試了12種關係類型和6652個關係。與Neo4j.Driver.V1

using (var session = driver.Session()) 
{ 
    foreach (var relationType in relationTypes) 
    { 
     var nodeArray = relationType.Value.Select(n => new Dictionary<string, string> {{"from", n.Item1}, {"to", n.Item2}}).ToArray(); 
     var dictionary = new Dictionary<string, object> {{"nodes", nodeArray}}; 
     var relationCommand = 
      string.Format(
       "UNWIND $nodes as node WITH node.from as from, node.to as to " 
       + "MATCH (f {{nodeId:from}}), (t {{nodeId:to}}) " 
       + "CREATE (f)-[:" + relationType.Key + "]->(t) "); 
     session.Run(relationCommand, dictionary); 
    } 
} 
+0

您不使用任何標籤,因此沒有唯一的約束/索引。您的查詢完全沒有優化 –

+0

它肯定沒有優化。 :)好的,所以需要標籤才能使MATCH高效? –

+0

標籤+的屬性索引/唯一約束你匹配(在此節點ID),以便查找是O(1)+ 1:標籤+物業 –

回答

2

不使用標籤與索引屬性相結合可以使查詢極其不高效。

所以最好:

將標籤添加到您的節點。

CREATE (n:Label {id: 1})用於如創建節點時,或者如果你想一個通用的標籤添加到您已經創建的節點,你可以做

MATCH (n) SET n:Label 

然後爲你的節點ID屬性創建一個唯一約束:

CREATE CONSTRAINT ON (n:Label) ASSERT n.nodeId IS UNIQUE 

然後用它在查詢:

var relationCommand = 
      string.Format(
       "UNWIND $nodes as node WITH node.from as from, node.to as to " 
       + "MATCH (f:Label {{nodeId:from}}), (t:Label {{nodeId:to}}) " 
       + "CREATE (f)-[:" + relationType.Key + "]->(t) "); 
     session.Run(relationCommand, dictionary); 

享受differenc e!