如何將大規模數據導入Neo4j

項目需要基於Neo4j開發,由於數據量較大(數千萬節點),因此對當前數據插入的方法進行了分析和對比。

常見數據插入方式概覽

<table><thead>Neo4j VersionLanguage Driver/<thead><tbody>Community 3.0.2Python neo4j-driver 1.0.0/<tbody>/<table>

目前主要有以下幾種數據插入方式:

  1. Cypher CREATE 語句,為每一條數據寫一個CREATE

  2. Cypher LOAD CSV 語句,將數據轉成CSV格式,通過LOAD CSV讀取數據。

  3. 官方提供的Java API —— Batch Inserter

  4. 大牛編寫的 Batch Import 工具

  5. 官方提供的 neo4j-import 工具

這些工具有什麼不同呢?速度如何?適用的場景分別是什麼?我這裡根據我個人理解,粗略地給出了一個結果:

<table><thead>
CREATE語句LOAD CSV語句Batch InserterBatch ImportNeo4j-import/<thead><tbody>適用場景1 ~ 1w nodes1w ~ 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只能生成新的數據庫,而不能在已存在的數據庫中插入數據。
/<tbody>/<table>

速度測試

下面是我自己做的一些性能測試:

1. CREATE 語句

這裡每1000條進行一次Transaction提交

  1. <code>CREATE (:label {property1:value, property2:value, property3:value})/<code>

<table><thead>11.5w nodes18.5w nodes/<thead><tbody>100 s160 s/<tbody>/<table>

2. LOAD CSV 語句

  1. <code>using periodic commit 1000/<code>

  2. <code>load csv from"file:///fscapture_screencapture_syscall.csv"as line/<code>

  3. <code>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]})/<code>

這裡使用了語句USING PERIODIC COMMIT 1000,使得每1000行作為一次Transaction提交。

<table><thead>11.5w nodes18.5w nodes/<thead><tbody>21 s39 s/<tbody>/<table>

3. Batch Inserter、Batch Import、Neo4j-import

我只測試了Neo4j-import,沒有測試Batch Inserter和Batch Import,但是我估計他們的內部實現差不多,速度也處於一個數量級別上,因此這裡就一概而論了。

neo4j-import需要在Neo4j所在服務器執行,因此服務器的資源影響數據導入的性能,我這裡為JVM分配了16G的heap資源,確保性能達到最好。

  1. <code>sudo ./bin/neo4j-import--into graph.db --nodes:label path_to_csv.csv/<code>

<table><thead>11.5w nodes18.5w nodes150w nodes + 1431w edges3113w nodes + 7793w edges/<thead><tbody>3.4 s3.8 s
26.5 s3 m 48 s/<tbody>/<table>

結論

  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。

如何將大規模數據導入Neo4j

如何將大規模數據導入Neo4j


分享到:


相關文章: