如何在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处于未运行状态。