导入

时间:2017-01-20 09:31:50

标签: c# asp.net neo4j locking neo4jclient

编辑当发生事务性错误时,似乎锁(大多数/仅?)保持锁定状态。我必须重新启动数据库才能再次工作,但它没有主动处理任何事情(没有CPU / RAM / HDD活动)。

环境

我有一个ASP.NET应用程序,它使用Neo4jClient NuGet包与Neo4j数据库通信。我有 N SimpleNode对象需要插入,其中 N 可以是100到50.000之间的任何内容。 M 边缘还有其他对象需要插入,其中 M 可以是100到1.000.000。

代码

使用普通插入进行插入太慢,8.000个节点大约需要80秒,使用以下代码:

Client.Cypher
   .Unwind(sublist, "node")
   .Merge("(n:Node { label: node.label })")
   .OnCreate()
   .Set("n = node")
   .ExecuteWithoutResults();

因此我使用导入CSV功能,代码如下:

        using (var sw = new StreamWriter(File.OpenWrite("temp.csv")))
        {
            sw.Write(SimpleNodeModel.Header + "\n");
            foreach (var simpleNodeModel in nodes)
            {
                sw.Write(simpleNodeModel.ToCSVWithoutID() + "\n");
            }
        }
        var f = new FileInfo("temp.csv");

        Client.Cypher
            .LoadCsv(new Uri("file://" + f.FullName), "csvNode", true)
            .Merge("(n:Node {label:csvNode.label, source:csvNode.source})")
            .ExecuteWithoutResults();

虽然仍然很慢,但这是一种改进。

问题

问题是neo4j客户端锁定了CSV文件(而不是C#或我自己的代码)。我想覆盖临时.CSV文件,以便磁盘不会填满,或者在使用后删除它们。现在这是不可能的,因为进程锁定它们并且我不能使用它们。这也意味着运行此代码两次会导致程序崩溃,因为它无法第二次写入文件。

节点已插入并且正常显示,因此它不会继续处理它们。在经历了一些未知且差异很大的时间后,文件确实似乎已解锁。

问题

如何阻止neo4j客户端在使用后长时间锁定文件?为什么这么长时间锁定它们?另一个问题:在C#中有更好的方法吗?我知道java导入程序,但我希望我的工具留在asp.net环境中。必须可以在2秒内在C#中插入8.000个简单节点?

SimpleNode类

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}";
    }
}

0 个答案:

没有答案