我的本地neo4j数据库遇到问题。我试图使用官方的C#neo4j驱动程序插入大约100.000个节点和380.000个关系。在大多数情况下,数据导入大约需要23秒(对我来说很好)。但是,有时(每3次!)导入卡住了。这意味着我发送了一个创建新关系的请求(通过http,请参见下面的Wireshark屏幕截图),但是我没有从数据库中得到响应(一段时间后,我的应用程序遇到超时)。当我尝试插入新关系时,总是会发生这种情况。创建新节点似乎很好。奇怪的是,有时导入成功完成,而不会在约23秒内卡住!
卡住的查询如下:
string query = "UNWIND {relations} AS relation " +
$"MATCH (source:label1), (target:label2) " +
$"WHERE source.ID = relation.ID AND target.ID = relation.ID " +
$"CREATE (source)-[:newRelation]->(target)";
return ExecuteQuery(client, query, new Dictionary<string, object> { { "relations", ParameterSerializer.ToDictionary(relationInfos) } });
这是创建不会卡住的新节点的查询:
string query = "UNWIND {nodes} AS node " +
$"CREATE (n:label1) " +
"SET n = node";
return ExecuteQuery(client, query, new Dictionary<string, object> { { "nodes", ParameterSerializer.ToDictionary(elements) } });
我总是一次处理1000个节点和关系。我摆弄了不同的堆和页面缓存大小,但似乎对我的问题没有任何影响。如果您查看第二个屏幕截图,则看起来内存大小还是足够的。我也尝试使用Bolt协议而不是http。问题仍然存在。
您是否有任何解释导致此现象的原因?还是您有一些想法可以尝试解决这个问题?
非常感谢您的帮助,
丹尼尔
其他信息:
更新
我有一些新闻。在我的代码中进行了一些更改之后,数据库不再卡住了。处理所有数据只需要一点时间。
但是,奇怪的是,我插入的第一批(大约1000个关系)花费的时间比其余的要长得多。第一次执行“关系”查询时,它花费的时间要比下一个查询长得多(大约三倍)。
有什么解释或某种方法可以避免这种情况?