Neo4j关系创建在导入期间被卡住

时间:2018-10-24 09:48:37

标签: neo4j

我的本​​地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。问题仍然存在。

您是否有任何解释导致此现象的原因?还是您有一些想法可以尝试解决这个问题?

非常感谢您的帮助,

丹尼尔

其他信息:

  • neo4j在分配了4个CPU核心和6GB RAM的Window 10 VM上运行
  • neo4j桌面版本:3.2.10
  • neo4j服务器版本:3.4.9(社区)
  • neo4j C#驱动程序版本:1.7.0
  • 配置:
    • dbms.memory.heap.initial_size = 4G
    • dbms.memory.heap.max_size = 4G
    • dbms.memory.pagecache.size = 1G

这是电线上的样子: Wireshark Screenshot

这是VM的工作负载: enter image description here


更新

我有一些新闻。在我的代码中进行了一些更改之后,数据库不再卡住了。处理所有数据只需要一点时间。

但是,奇怪的是,我插入的第一批(大约1000个关系)花费的时间比其余的要长得多。第一次执行“关系”查询时,它花费的时间要比下一个查询长得多(大约三倍)。

有什么解释或某种方法可以避免这种情况?

0 个答案:

没有答案