加载速度真的很慢Neo4jClient C#LoadCsv

时间:2017-01-20 12:43:35

标签: c# performance neo4j

我现在使用的代码非常慢,每秒大约有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环境中。

SimpleNode类

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);

Cypher代码

CLI

2 个答案:

答案 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})
...