項目需要基於Neo4j開發,由於數據量較大(數千萬節點),因此對當前數據插入的方法進行了分析和對比。
常見數據插入方式概覽
<table><thead>目前主要有以下幾種數據插入方式:
Cypher CREATE 語句,為每一條數據寫一個CREATE
Cypher LOAD CSV 語句,將數據轉成CSV格式,通過LOAD CSV讀取數據。
官方提供的Java API —— Batch Inserter
大牛編寫的 Batch Import 工具
官方提供的 neo4j-import 工具
這些工具有什麼不同呢?速度如何?適用的場景分別是什麼?我這裡根據我個人理解,粗略地給出了一個結果:
<table><thead>速度測試
下面是我自己做的一些性能測試:
1. CREATE 語句
這裡每1000條進行一次Transaction提交
<code>CREATE (:label {property1:value, property2:value, property3:value})/<code>
2. LOAD CSV 語句
<code>using periodic commit 1000/<code>
<code>load csv from"file:///fscapture_screencapture_syscall.csv"as line/<code>
<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>3. Batch Inserter、Batch Import、Neo4j-import
我只測試了Neo4j-import,沒有測試Batch Inserter和Batch Import,但是我估計他們的內部實現差不多,速度也處於一個數量級別上,因此這裡就一概而論了。
neo4j-import需要在Neo4j所在服務器執行,因此服務器的資源影響數據導入的性能,我這裡為JVM分配了16G的heap資源,確保性能達到最好。
<code>sudo ./bin/neo4j-import--into graph.db --nodes:label path_to_csv.csv/<code>
結論
如果項目剛開始,想要將大量數據導入數據庫,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。
閱讀更多 每天記錄精彩視頻 的文章