大規模資料匯入Neo4j
阿新 • • 發佈:2018-11-10
如何將大規模資料匯入Neo4j
專案需要基於Neo4j開發,由於資料量較大(數千萬節點),因此對當前資料插入的方法進行了分析和對比。
常見資料插入方式概覽
Neo4j Version | Language Driver |
---|---|
Community 3.0.2 | Python neo4j-driver 1.0.0 |
目前主要有以下幾種資料插入方式:
- Cypher CREATE 語句,為每一條資料寫一個CREATE
- Cypher LOAD CSV 語句,將資料轉成CSV格式,通過LOAD CSV讀取資料。
- 官方提供的Java API —— Batch Inserter
- 大牛編寫的 Batch Import 工具
- 官方提供的 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提交
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。
2016