Neo4j 3.3.9/3.5如何批量删除百万级Cypher关系且不造成数据库停滞
Neo4j 3.3.9/3.5 大数量关系批量删除实现方案
针对单事务删除近90万匹配关系导致的数据库停滞、内存占用过高问题,上述版本配套的APOC工具包提供了成熟的批处理拆分存储过程,无需手动编写事务循环,即可实现低负载的批量删除操作。
核心可用能力
可直接使用apoc.periodic.iterate存储过程完成拆分删除,该过程在3.3、3.5版本的APOC组件中已稳定可用,核心逻辑是自动把全量匹配的数据集按设定大小拆分为独立的小事务依次提交,每批执行完成后自动释放内存、缩短锁持有时间,不会造成数据库长时间阻塞。
适配当前查询场景的可直接执行代码
CALL apoc.periodic.iterate( // 匹配数据的拉取逻辑,与原有查询完全一致 "CALL apoc.index.relationships('TO','context:(1a2fbd10-7a50-11ea-bb71-25dd29c6e321)') yield rel return distinct rel", // 单批数据的执行逻辑 "DELETE rel", { batchSize: 5000, iterateList: true, parallel: false, retries: 3 } ) YIELD batches, totalOperations RETURN batches, totalOperations;
参数说明与版本适配注意事项
batchSize:单事务处理的关系数量,可根据服务器内存调整,建议初始值设置为2000-5000,不要直接设置过高值导致单批内存占用过载parallel:关系删除场景建议关闭并行模式,避免出现锁竞争冲突retries:遇到瞬时锁冲突时自动重试的次数,设置为3即可覆盖绝大多数日常业务的阻塞场景- 整个流程不会一次性把全量90万条关系加载到内存,执行过程中每个小事务提交后立即释放对应资源,对数据库正常读写请求的阻塞影响降到最低
- 3.3.9版本需要配套安装3.3.x序列的APOC组件,从APOC 3.3.0.4版本开始,
apoc.periodic.iterate已支持当前使用的全文索引关系检索逻辑,无需额外改造原有匹配查询语句
内容的提问来源于stack exchange,提问作者Aerodynamika
相关产品推荐
相关产品推荐

