1
我是Neo4J的新手,我想尝试一下从MySQL导出的一些数据。我有社区版运行neo4j console
,并且我使用neo4j-shell
命令行客户端输入命令。创建大量关系时内存不足
我有2个的CSV文件,我用它来创建两种类型的节点,具体如下:
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);
这给了我大约65万更新节点,21000000个事实节点。
一旦指标处于联机状态,我尝试创建节点之间的关系,具体如下:
MATCH (a:Update)
WITH a
MATCH (b:Fact{update_id:a.update_id})
CREATE (b)-[:FROM]->(a)
这将失败,并OutOfMemoryError
。我相信这是因为Neo4J在完成之前不会提交事务,而是将其保存在内存中。
我能做些什么来防止这种情况发生?我看了一下USING PERIODIC COMMIT
但看来这读取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)"
^
是否有可能以这种方式建立的关系,大量现有的节点之间,还是我需要采取不同的方法?
根据您的可用内存,您可能可以使用更高的限制。 –
这有帮助,谢谢。顺便说一句,你只需要修改SKIP并保持LIMIT不变。 – Alex
是的确的限制可以是恒定的 –