我有一个带有> 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.iterate
和apoc.periodic.commit
,但前者尝试先将整个表读入内存然后进行迭代,而后者则一遍又一遍地重复相同的查询#39;在这个用例中工作。
oracle表是分区的,我可以应用WHERE过滤器一次加载一个分区,但是,某些分区仍然包含的数据多于内存中的数据。
我不能成为第一个有这个问题的人,可以吗?
提前致谢。
答案 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})