Neo4j 创建大量关系时内存不足

Neo4j 创建大量关系时内存不足,neo4j,cypher,Neo4j,Cypher,我是Neo4J新手,我想在从MySQL导出的一些数据上试用它。我使用neo4j控制台运行社区版,并使用neo4j shell命令行客户端输入命令 我有2个CSV文件,用于创建2种类型的节点,如下所示: USING PERIODIC COMMIT LOAD CSV WITH HEADERS FROM "file:/tmp/updates.csv" AS row CREATE (:Update {update_id: row.id, update_type: row.update_type, cus

我是Neo4J新手,我想在从MySQL导出的一些数据上试用它。我使用
neo4j控制台
运行社区版,并使用
neo4j shell
命令行客户端输入命令

我有2个CSV文件,用于创建2种类型的节点,如下所示:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/tmp/updates.csv" AS row
CREATE (:Update {update_id: row.id, update_type: row.update_type, customer_name: row.customer_name, .... });

CREATE INDEX ON :Update(update_id);

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/tmp/facts.csv" AS row
CREATE (:Fact {update_id: row.update_id, status: row.status, ..... }); 

CREATE INDEX ON :Fact(update_id);
MATCH (a:Update)
WITH a
MATCH (b:Fact{update_id:a.update_id})
CREATE (b)-[:FROM]->(a)
这为我提供了大约650000个更新节点和21000000个事实节点

一旦索引联机,我将尝试在节点之间创建关系,如下所示:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/tmp/updates.csv" AS row
CREATE (:Update {update_id: row.id, update_type: row.update_type, customer_name: row.customer_name, .... });

CREATE INDEX ON :Update(update_id);

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/tmp/facts.csv" AS row
CREATE (:Fact {update_id: row.update_id, status: row.status, ..... }); 

CREATE INDEX ON :Fact(update_id);
MATCH (a:Update)
WITH a
MATCH (b:Fact{update_id:a.update_id})
CREATE (b)-[:FROM]->(a)
此操作失败,出现
OutOfMemoryError
。我认为这是因为Neo4J在事务完成之前不会提交事务,并将其保存在内存中

我能做些什么来防止这种情况?我已经阅读了有关使用定期提交的
,但这似乎只在读取CSV时有用,因为在我的情况下它不起作用:

neo4j-sh (?)$ USING PERIODIC COMMIT
> MATCH (a:Update)
> WITH a
> MATCH (b:Fact{update_id:a.update_id})
> CREATE (b)-[:FROM]->(a);
QueryExecutionKernelException: Invalid input 'M': expected whitespace, comment, an integer or LoadCSVQuery (line 2, column 1 (offset: 22))
"MATCH (a:Update)"
 ^

有没有可能以这种方式在大量现有节点之间创建关系,或者我需要采取不同的方法?

内存不足异常是正常的,因为它会尝试一次提交所有节点,而您没有提供它,我假设java堆设置设置为默认值(512m)

但是,您可以使用分页方式批处理流程,但在这种情况下,我更喜欢使用合并而不是创建:

MATCH (a:Update)
WITH a
SKIP 0
LIMIT 50000
MATCH (b:Fact{update_id:a.update_id})
MERGE (b)-[:FROM]->(a)

在每个批处理后修改跳过和限制,直到达到650k更新节点。

根据可用内存,您可能可以使用更高的限制。这很有帮助,谢谢。顺便说一句,你只需要修改跳过和保持限制不变。嗨,我有同样的问题,但我需要在5个节点之间创建8个关系。我不认为上述与跳过限制的匹配对于使用批处理创建这么多关系是最佳的。有什么建议可以更有效地做到这一点吗?提前谢谢@迈克尔亨格