如何在docker中更新或導入neo4j數據?
(1)背景:
我嘗試了4.4.9和5.19.0版本的Neo4j社區版,基于他們的鏡像創建容器后,需要導入我準備好的csv文件或dump文件,因為數據量非常大,所以采用neo4j-admin工具導入方案。
(2)遇到的問題:
neo4j-admin工具需要使Neo4j處于停止狀態,當進入容器后,執行了neo4j stop指令后,容器會自動退出!查詢運行的docker容器,發現容器已經停止運行了…然后曾經的3.X版本是可以停止后,保持在容器中操作的。
不停止neo4j進行數據導入,就只有load CSV方式了,但是我的數據量有幾百萬,load csv想都不敢想…
(3)原因:
(4)可能的解決辦法
我試過上面的5,無效,然后又在網上找了一通,發現談這個問題的都很少,始終沒找到一個可好用有效的辦法。
(6)最終解決辦法
找個這篇博客,嘗試了一下,發現有用:
neo4j 數據遷移簡單操作
我再結合我的實踐說一下我的理解和分析:
- docker版本的Neo4j,特別是用到了5.X的,neo4j stop這個指令就基本上不能用了,用了就停止容器,還怎么執行neo4j-admin呢?所以只能考慮在容器未運行的狀態下進行數據遷移;
- 容器停止狀態下,dump和csv都無法導入,準確說來,什么導入方式都不可用,但是還有一種最簡單純粹的方法:就是復制已經導入好的數據庫數據,替換容器的空數據庫數據,即用數據復制的方式
數據復制的具體方法(可用)
1.首先你的Neo4容器(稱為A)它在創建時是有外掛路徑的,至少要掛載data路徑(存放數據庫文件)
docker run -d --name neo4j-5.19 -p 7474:7474 -p 7687:7687 -v /data/neo4j/data:/data -v /data/neo4j/logs:/logs -v /data/neo4j/conf:/var/lib/neo4j/conf -v /data/neo4j/import:/var/lib/neo4j/import --env NEO4J_AUTH=neo4j/neo4j 可用的鏡像版本
- 在你的電腦,win或linux都可以,再搞一個Neo4j(稱為B,就是正常的安裝包,不是容器),基于它完成數據導入:
(1)刪除兩個目錄:data/databases/neo4j,data/transactions/neo4j
(2)切換到Neo4j目錄下的bin路徑:cd bin
(3)執行neo4j-admin進行數據導入,5.X版本的參考如下:
neo4j-admin database import full --nodes=import/nodes_series.csv --nodes=import/nodes_part_fused.csv --relationships=import/relation_series2part_fused.csv --skip-bad-relationships
此時data/databases/neo4j,data/transactions/neo4j兩個路徑下的數據會重新生成,即導入的數據。
3.復制B的data/databases/neo4j,data/transactions/neo4j到A對應的路徑下進行替換(替換前,可以先刪除A掛載路徑下的data/databases/neo4j,data/transactions/neo4j)。
4.啟動A,可以發現A原本沒數據的,現有有了數據了。如此,達成曲線救國。
特別注意:A和B的版本必須一模一樣,如此B的導入數據在A中可以正常使用!
上面給的是B的neo4j-admin導入方式,實際上其它方式,在容器外都是可用的哈。
附錄:Neo4j數據導入方式
Neo4j導入數據的方式有:
- 使用LOAD CSV導入數據
- 使用APOC導入數據
- 使用編程語言(Java,python,js,C#,Go)導入數據
- 使用neo4j-admin工具導入數據
- 使用應用導入數據
- 使用ETL工具導入數據
詳細可參考:
Neo4j導入數據的5種方式詳解配圖
個人經驗:
(1)小數據集(如幾百、幾千條)可以用load CSV方式,最簡單,無需停止Neo4j,可以在線導入,最大缺點就是慢,且導入數據有上限(好像是1W條)
(2)大量數據(如十萬、百萬級),用neo4j-admin工具導入,百萬級實體和關系導入,只需要秒級或幾分鐘級,缺點:必須基于空數據庫,且neo4j處于未運行狀態。