我有一个大型事务节点(300万行)和非常少的内存(8GB内存)。我已经使用Periodic Commit创建了事务节点,现在我想在帐户节点和事务节点之间创建关系。
这就是我正在使用的:
MATCH (tx:Transaction),(a:Account)
WHERE tx.tx_id = a.tx_id
CREATE (a)-[:HAS_TRANS]->(tx)
但是,它耗尽内存,因为它在创建关系之前首先将整个事务数据加载到内存中。
理想情况下,我想在内存中加载10000条记录,创建关系,清理内存,然后为下一条10000条记录创建关系。
我知道我们可以在定期提交时创建事务表时创建关系。但是,如果有任何其他解决方案,我很好奇。
答案 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。