如何将大规模数据导入Neo4j

如何将大规模数据导入Neo4j

项目需要基于Neo4j开发,由于数据量较大(数千万节点),因此对当前数据插入的方法进行了分析和对比。

常见数据插入方式概览

Neo4j Version Language Driver
Community 3.0.2 Python neo4j-driver 1.0.0

目前主要有以下几种数据插入方式:

  1. Cypher CREATE 语句,为每一条数据写一个CREATE
  2. Cypher LOAD CSV 语句,将数据转成CSV格式,通过LOAD CSV读取数据。
  3. 官方提供的Java API —— Batch Inserter
  4. 大牛编写的 Batch Import 工具
  5. 官方提供的 neo4j-import 工具

这些工具有什么不同呢?速度如何?适用的场景分别是什么?我这里根据我个人理解,粗略地给出了一个结果:

  CREATE语句 LOAD CSV语句 Batch Inserter Batch Import Neo4j-import
适用场景 1 ~ 1w nodes 1w ~ 10 w nodes 千万以上 nodes 千万以上 nodes 千万以上 nodes
速度 很慢 (1000 nodes/s) 一般 (5000 nodes/s) 非常快 (数万 nodes/s) 非常快 (数万 nodes/s) 非常快 (数万 nodes/s)
优点 使用方便,可实时插入。 使用方便,可以加载本地/远程CSV;可实时插入。 速度相比于前两个,有数量级的提升 基于Batch Inserter,可以直接运行编译好的jar包;可以在已存在的数据库中导入数据 官方出品,比Batch Import占用更少的资源
缺点 速度慢 需要将数据转换成CSV 需要转成CSV;只能在JAVA中使用;且插入时必须停止neo4j 需要转成CSV;必须停止neo4j 需要转成CSV;必须停止neo4j只能生成新的数据库,而不能在已存在的数据库中插入数据。

速度测试

下面是我自己做的一些性能测试:

1. CREATE 语句

这里每1000条进行一次Transaction提交

  
  
  1. CREATE (:label {property1:value, property2:value, property3:value} )
11.5w nodes 18.5w nodes
100 s 160 s

2. LOAD CSV 语句

  
  
  1. using periodic commit 1000
  2. load csv from "file:///fscapture_screencapture_syscall.csv" as line
  3. create (:label {a:line[1], b:line[2], c:line[3], d:line[4], e:line[5], f:line[6], g:line[7], h:line[8], i:line[9], j:line[10]})

这里使用了语句USING PERIODIC COMMIT 1000,使得每1000行作为一次Transaction提交。

11.5w nodes 18.5w nodes
21 s 39 s

3. Batch Inserter、Batch Import、Neo4j-import

我只测试了Neo4j-import,没有测试Batch Inserter和Batch Import,但是我估计他们的内部实现差不多,速度也处于一个数量级别上,因此这里就一概而论了。

neo4j-import需要在Neo4j所在服务器执行,因此服务器的资源影响数据导入的性能,我这里为JVM分配了16G的heap资源,确保性能达到最好。

  
  
  1. sudo ./bin/neo4j-import --into graph.db --nodes:label path_to_csv.csv
11.5w nodes 18.5w nodes 150w nodes + 1431w edges 3113w nodes + 7793w edges
3.4 s 3.8 s 26.5 s 3 m 48 s

结论

  1. 如果项目刚开始,想要将大量数据导入数据库,Neo4j-import是最好的选择。
  2. 如果数据库已经投入使用,并且可以容忍Neo4j关闭一段时间,那么Batch Import是最好的选择,当然如果你想自己实现,那么你应该选择Batch Inserter
  3. 如果数据库已经投入使用,且不能容忍Neo4j的临时关闭,那么LOAD CSV是最好的选择。
  4. 最后,如果只是想插入少量的数据,且不怎么在乎实时性,那么请直接看Cypher语言。

其它的Tips

  1. 在LOAD CSV前面加上USING PERIODIC COMMIT 1000,1000表示每1000行的数据进行一次Transaction提交,提升性能。
  2. 建立index可以使得查询性能得到巨大提升。如果不建立index,则需要对每个node的每一个属性进行遍历,所以比较慢。 并且index建立之后,新加入的数据都会自动编入到index中。 注意index是建立在label上的,不是在node上,所以一个node有多个label,需要对每一个label都建立index。

2016 年 06 月 03 日

  • 15
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值