Neo4j:批量加载到内存中

时间:2018-04-03 22:14:20

标签: neo4j cypher

我有一个大型事务节点(300万行)和非常少的内存(8GB内存)。我已经使用Periodic Commit创建了事务节点,现在我想在帐户节点和事务节点之间创建关系。

这就是我正在使用的:

MATCH (tx:Transaction),(a:Account)
WHERE tx.tx_id = a.tx_id
CREATE (a)-[:HAS_TRANS]->(tx)

但是,它耗尽内存,因为它在创建关系之前首先将整个事务数据加载到内存中。

理想情况下,我想在内存中加载10000条记录,创建关系,清理内存,然后为下一条10000条记录创建关系。

我知道我们可以在定期提交时创建事务表时创建关系。但是,如果有任何其他解决方案,我很好奇。

1 个答案:

答案 0 :(得分:1)

您可以重写查询,以查找与HAS_TRANS标记的节点之间没有Account关系的前10k个交易。

MATCH (tx:Transaction)
WHERE NOT (:Account)-[:HAS_TRANS]->(tx)
WITH tx
LIMIT 10000
MATCH (a:Account)
WHERE tx.tx_id = a.tx_id
CREATE (a)-[:HAS_TRANS]->(tx)

确保在Transaction(tx_id)和Account(tx_id)上有索引。

在完成之前迭代密码批次的最佳方法可能是使用apoc.periodic.iterate

你可以尝试这样的事情。

CALL apoc.periodic.iterate(
  "MATCH (tx:Transaction)
   WHERE NOT (:Account)-[:HAS_TRANS]->(tx)
   WITH tx
   MATCH (a:Account)
   WHERE tx.tx_id = a.tx_id
   RETURN tx, a",
  "CREATE (a)-[:HAS_TRANS]->(tx)",
  {batchSize:10000, parallel:true}
)

另一种方法是编写一个小脚本并多次调用cypher。