与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);
}
}
答
不使用标签与索引属性相结合可以使查询极其不高效。
所以最好:
将标签添加到您的节点。
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!
您不使用任何标签,因此没有唯一的约束/索引。您的查询完全没有优化 –
它肯定没有优化。 :)好的,所以需要标签才能使MATCH高效? –
标签+的属性索引/唯一约束你匹配(在此节点ID),以便查找是O(1)+ 1:标签+物业 –