与Neo4j.Driver.V1

与Neo4j.Driver.V1

问题描述:

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:标签+物业 –

不使用标签与索引属性相结合可以使查询极其不高效。

所以最好:

将标签添加到您的节点。

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!