2015-07-20 30 views
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)" 
^ 

是否有可能以这种方式建立的关系,大量现有的节点之间,还是我需要采取不同的方法?

回答

3

内存不足异常是正常的,因为它会尝试立即全部提交,因为您没有提供它,我假设java堆设置被设置为默认值(512米)。然而

可以,批次样分页的过程中,只有我更愿意用MERGE而不是制造在这种情况下:每一批,直到你达到650K更新节点后

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

修改SKIP和LIMIT 。

+0

根据您的可用内存,您可能可以使用更高的限制。 –

+0

这有帮助,谢谢。顺便说一句,你只需要修改SKIP并保持LIMIT不变。 – Alex

+0

是的确的限制可以是恒定的 –