Neo4j--导入大规模数据
参考链接:https://blog.csdn.net/xingxiupaioxue/article/details/71747284
一、目前主要有以下几种数据插入方式:
Cypher CREATE 语句,为每一条数据写一个CREATE
Cypher LOAD CSV 语句,将数据转成CSV格式,通过LOAD CSV读取数据:
http://neo4j.com/developer/guide-import-csv/#_load_csv_for_medium_sized_datasets
官方提供的Java API —— Batch Inserter:
http://neo4j.com/docs/java-reference/current/javadocs/org/neo4j/unsafe/batchinsert/BatchInserter.html
大牛编写的 Batch Import 工具:
https://github.com/jexp/batch-import/blob/2.3/readme.md
官方提供的 neo4j-import 工具:
http://neo4j.com/developer/guide-import-csv/#_super_fast_batch_importer_for_huge_datasets

二、速度测试
1、CREATE 语句
这里每1000条进行一次Transaction提交
CREATE (:label {property1:value, property2:value, property3:value} )
| 11.5w nodes | 18.5w nodes |
|---|---|
| 100 s | 160 s |
2、LOAD CSV 语句
using periodic commit 1000 load csv from "file:///fscapture_screencapture_syscall.csv" as line 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资源,确保性能达到最好。
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 |
三、结论
如果项目刚开始,想要将大量数据导入数据库,Neo4j-import是最好的选择。
如果数据库已经投入使用,并且可以容忍Neo4j关闭一段时间,那么Batch Import是最好的选择,当然如果你想自己实现,那么你应该选择Batch Inserter
如果数据库已经投入使用,且不能容忍Neo4j的临时关闭,那么LOAD CSV是最好的选择。
最后,如果只是想插入少量的数据,且不怎么在乎实时性,那么请直接看Cypher语言。
四、其它的Tips
在LOAD CSV前面加上USING PERIODIC COMMIT 1000,1000表示每1000行的数据进行一次Transaction提交,提升性能。
建立index可以使得查询性能得到巨大提升。如果不建立index,则需要对每个node的每一个属性进行遍历,所以比较慢。 并且index建立之后,新加入的数据都会自动编入到index中。 注意index是建立在label上的,不是在node上,所以一个node有多个label,需要对每一个label都建立index。
浙公网安备 33010602011771号