Neo4j在批量导入时崩溃

时间:2014-12-12 08:15:12

标签: neo4j

我导入的节点都是一个Merge和关系创建语句的一部分,但Neo4j正在崩溃StackOverflowExceptions或" ERROR(-v用于扩展信息):         错误解组返回标头;嵌套异常是:         java.net.SocketException:软件导致连接中止:recv失败"

我承认我的方法可能有问题,但我有一些(A)节点与类型(B)的节点有~8,000个关系,而(B)节点与其他(A)节点有~7,000个关系。

我基本上有一个大的MERGE语句创建(A)& (B)具有CREATE UNIQUE的节点,该节点完成最后创建的所有关系。我将所有这些Cypher存储在一个文件中并通过Neo4jShell导入它。

示例:

MERGE (foo:A { id:'blah'})
MERGE (bar:B {id:'blah2'})
MERGE (bar2:B1 {id:'blah3'})
MERGE (bar3:B3 {id:'blah3'})
MERGE (foo2:A1 {id:'blah4'})
... // thousands more of these
CREATE UNIQUE foo-[:x]->bar,  bar-[:y]->foo2, // hundreds more of these

有更好的方法吗?我试图避免创建所有Merge语句,然后匹配每个语句以在另一个查询中创建关系。我在两种方式上的导入性能都很慢。将每个合并拆分为一个事务是很慢的(对于60K,节点/关系,导入2小时)。目前的方法崩溃neo4j

当前的一个大合并/创建独特方法适用于第一个大插入,但在此之后当下一个大插入使用5000个节点和8000个关系时失败。这是第一次大合并的结果:

Nodes created: 756
Relationships created: 933
Properties set: 5633
Labels added: 756
15101 ms

我使用的是带有8GB RAM的Windows 7机器。在我的neo4j.wrapper中,我使用:

wrapper.java.initmemory=512
wrapper.java.maxmemory=2048

1 个答案:

答案 0 :(得分:2)

有三件事可能会有所帮助:

  1. 如果你真的不需要合并,你应该只使用一个创建。创建更有效率,因为它不必检查现有关系

  2. 确保您的索引正确

  3. 您现在拥有一大笔交易中的所有内容。您说明了在1个事务中使用每个语句的替代方法。两者都不适合你。但是,您可以进行每次100个语句的交易。这种方法应该比每个事务的1个语句更快,并且仍然使用比将所有内容放在一个大事务中更少的内存