1. 程式人生 > >大規模資料匯入Neo4j

大規模資料匯入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