我现在使用的代码非常慢,每秒大约有20个插入,并使用拆分器来创建多个要加载的csv文件。有没有办法使用"使用周期性委托1000"以适当的方式使用Neo4jClient进行dotnet?
await Client.Cypher
.Create("INDEX ON :Node(label);")
.ExecuteWithoutResultsAsync();
await Client.Cypher
.LoadCsv(new Uri("file://" + f.FullName), "csvNode", true)
.Create("(n:Node {label:csvNode.label, source:csvNode.source})")
.ExecuteWithoutResultsAsync();
创建我使用的节点
public class SimpleNodeModel
{
public long id { get; set; }
public string label { get; set; }
public string source { get; set; } = "";
public override string ToString()
{
return $"label: {label}, source: {source}, id: {id}";
}
public SimpleNodeModel(string label, string source)
{
this.label = label;
this.source = source;
}
public SimpleNodeModel() { }
public static string Header => "label,source";
public string ToCSVWithoutID()
{
return $"{label},{source}";
}
}
标签上的索引似乎不会改变任何insert语句的速度。我有大约200,000个边缘要插入,每秒20个,这需要几个小时。能够添加USING PERIODIC COMMIT 1000会清理我的代码,但不会提高性能。
有没有办法加快插入?我知道neo4jclient不是最快但我真的想留在asp.net环境中。
USING PERIODIC COMMIT 500
LOAD CSV FROM 'file://F:/edge.csv' AS rels
MATCH (from {label: rels.From}), (to {label: rels.To})
CREATE (from)-[:edge {{weight: rels.Weight}}]->(to);
CLI
答案 0 :(得分:0)
您正在使用的版本中的Neo4jClient不支持期间提交。
我刚刚提交了一个即将发布的更改(2.0.0.7
),然后您可以使用该更改:
.LoadCsv(new Uri("file://" + f.FullName), "rels", true, periodicCommit:1000)
将生成正确的密码。
它已经开始了,应该是5分钟左右,具体取决于nuget的索引时间。
答案 1 :(得分:0)
关于底部Cypher代码的速度慢,那是因为你没有在MATCH中使用标签,所以你的MATCH从不使用索引来快速找到节点,而是必须扫描数据库中的每个节点TWICE ,一次用于from
,一次用于to
。
您在节点属性中使用label
与节点标签不同。由于您使用:Node标签创建了节点,请在匹配中重复使用此标签:
...
MATCH (from:Node {label: rels.FROM}), (to:Node {label: rels.To})
...