neo4j periodic commit apoc.load.jdbc

时间:2016-12-23 18:55:39

标签: neo4j

我有一个带有> 200M行的oracle表,我希望使用apoc.load.jdbc加载到neo4j。如何在不耗尽记忆的情况下完成这项工作。基本上我想执行相当于

USING PERIODIC COMMIT  
CALL apoc.load.jdbc('alias','table_name') yield row  
MATCH (r:Result {result_id:row.RESULT_ID})   
MATCH (g:Gene   {gene_id  :row.ENTITY_ID})  
create (r)-[:EXP {expression_level:row.EXPRESSION_LEVEL}]->(g)

但是,USING PERIODIC COMMIT似乎只与LOAD CSV一起使用,并在我使用apoc.load.jdbc

进行尝试时出现以下错误
  

无效输入' c:预期的空格,注释或LoadCSVQuery(第2行,第1列(偏移量:30))   "调用apoc.load.jdbc(' oasis_whs',' neo4j_exp')产生行"

我已经查看了apoc.periodic.iterateapoc.periodic.commit,但前者尝试先将整个表读入内存然后进行迭代,而后者则一遍又一遍地重复相同的查询#39;在这个用例中工作。

oracle表是分区的,我可以应用WHERE过滤器一次加载一个分区,但是,某些分区仍然包含的数据多于内存中的数据。

我不能成为第一个有这个问题的人,可以吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

可能有点晚了,但对于其他人来说,我遇到了同样的问题,大量查询会导致我的机器被杀,并且使用apoc.period.iterate会有很大帮助。您可以使用批量大小来查看适合您的方法。 retries参数将重新运行任何失败的批处理(可能在失败的部分完成之前需要运行查询的另一部分)。

CALL apoc.periodic.iterate('CALL apoc.load.jdbc('alias','table_name') yield row',
'
MATCH (r:Result {result_id:row.RESULT_ID})   
MATCH (g:Gene   {gene_id  :row.ENTITY_ID})  
create (r)-[:EXP {expression_level:row.EXPRESSION_LEVEL}]->(g)', {batchSize:10000, iterateList:true, parallel:true, retries:20})