编辑当发生事务性错误时,似乎锁(大多数/仅?)保持锁定状态。我必须重新启动数据库才能再次工作,但它没有主动处理任何事情(没有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个简单节点?
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}";
}
}