参考:https://my.oschina.net/zlb1992/blog/918243
https://blog.csdn.net/weixin_37947156/article/details/77442926
官方文档:https://neo4j.com/blog/loading-sql-neo4j-like-magic/
https://neo4j.com/developer/guide-importing-data-and-etl/
常见数据导入方式概览
(1) Cypher create 语句,为每一条数据写一个create
(2) Cypher load csv 语句,将数据转成CSV格式,通过LOAD CSV读取数据。
(3) 官方提供的neo4j-import工具,未来将被neo4j-adminimport代替
(4) 官方提供的Java API BatchInserter
(5) 大牛编写的 batch-import 工具
(6) neo4j-apocload.csv +apoc.load.relationship
(7) 针对实际业务场景,定制化开发
这些工具有什么不同呢?速度如何?适用的场景分别是什么?
create语句 | load csv语句 | neo4j-import | BatchInster | batch-import | apoc | |
适用场景
| 初始化导入 增量更新
| 初始化导入
| 初始化导入
| 初始化导入 增量更新(有限制)
| 增量更新 | |
导入速度 | 很慢1000/s | 数k /s | 数w/s | 数w/s | 数w/s | 数k/s |
实际测试 | 无 | 9.5k/s (节点+关系) | 12w/s (节点+关系) | 1w/s (节点+关系) | 1w/s (节点+关系) | 4k/s(1亿数据上增量更新) 1w/s(百万数据上增量更新) |
优点 | 1.使用方便 2.可实时插入 | 1.官方ETL工具 2.可以加载本地/远程CSV 3.可实时插入 | 1.官方工具 2.占用资源少 | 1.官方API | 1.可以增量更新 2.基于BatchInserter | 1.官方ETL工具 2.可以增量更新 3.支持在线导入 4.支持动态传Label RelationShip |
缺点 | 1.速度慢 2.处理数据,拼CQL复杂 | 1.导入速度较慢 2.不能动态传Label RelationShip | 1.需要脱机导入 停止Neo4j数据库 2.只能用于初始化导入 | 1.需要脱机导入 停止Neo4j数据库 2.需要在JAVA环境中使用
| 1.需要脱机导入 停止Neo4j数据库 | 1.速度一般 |
注释:本次测试使用的id(不是Neo4j id)类型是String,为uuid,如果同一Label下数据不超过2^32,可以用int类型
结论
根据实际情况选用最好的方式
(1) neo4j-import导入速度快,但是要求是空库,导入时要停止neo4j,也就是脱机导入,而且你要提前处理好数据,数据最好不要有重复,如果有重复,可以导入时跳过,然后根据bad.log来查看或者修正这部分数据
(2) batch-import可以增量导入,但是要求导入时停止neo4j数据库(脱机导入),而且增量更新的数据不会和库里存在的数据对比,所以要求数据全是新的,否则会出现重复数据
(3) load csv比较通用,而且可以在neo4j数据库运行时导入,但是导入速度相对较慢,要提前整理好数据,而且不能动态创建 Label RelationShip
(4) apoc挺好用的,可以动态创建Label、RelationShip,但是速度一般
结论2:
如果项目刚开始,想要将大量数据导入数据库,Neo4j-import是最好的选择。
如果数据库已经投入使用,并且可以容忍Neo4j关闭一段时间,那么Batch Import是最好的选择,当然如果你想自己实现,那么你应该选择Batch Inserter
如果数据库已经投入使用,且不能容忍Neo4j的临时关闭,那么LOAD CSV是最好的选择。
最后,如果只是想插入少量的数据,且不怎么在乎实时性,那么请直接看Cypher语言。