最近用 Neo4j 进行了数据导入导出,在此整理一下导入导出时遇到的问题,以及对应的解决方案。

0. 导入导出方法

导出 neo4j 数据库方法:neo4j-admin dump --database=数据库名字 --to=数据库位置。例如 neo4j-admin dump --database=ontology8 --to=/var/lib/neo4j/a

导入 neo4j 数据库方法:neo4j-admin load --from=数据库位置 --database=数据库名字。例如 neo4j-admin load --from=/var/lib/neo4j/data/databases/onto --database=onto

1. 导出时问题:The database is in use.

1.1 问题描述

遇到这种问题,一般原因是要导出的数据库是当前运行的 neo4j 的主数据库,因此无法进行导出。

网上的一般方案是,通过 neo4j stop 命令停止运行。

然而,这个方案在我这里并不能行得通。虽然通过 neo4j stop 命令停止了 neo4j 服务,同时通过 neo4j status 检查服务器状态也是 stop,但是仍然无法正常导出数据库,依然显示 The database is in use.

1.2 解决方案

对此,我的解决方案是:首先停掉 neo4j 服务。如果像我一样用的是 docker,就需要先停掉 docker 容器,方法是 docker stop 容器ID

随后,需要修改对应的 neo4j 配置文件。在 docker 容器中对应的位置是:/var/lib/neo4j/conf/neo4j.config。可以通过 docker cp 容器ID:内部环境config文件位置 环境位置 将配置文件拷出来,修改后再通过 docker cp 外部环境config文件位置 容器ID:内部环境config文件位置 将 config 文件导进去。

修改文件时,要将里面的主数据库进行调整,使得主数据库不再是要导出的数据库。

修改文件并导入后,再通过 docker start 容器ID 启动容器。随后再通过 neo4j-admin dump --database=数据库名字 --to=数据库位置 方法就能导出数据库。

2. 导入时问题:Database already exists

2.1 问题描述

导入数据库时会发现,无法导入数据,显示 Database already exists。去数据库文件夹下,也确实发现了和要导入的数据库一样名字的数据库,但是里面没有真正的数据。

这个问题出现的原因是,在导入数据库前,先修改了 config 文件,并设置了和要导入的数据库一样的名字作为主数据库。这时,neo4j 就会自动创建同名数据库,导致最后就无法导入数据。

2.2 解决方案

解决方案就是,先不要修改 config 文件,或者让主数据库的名字和要导入的数据库的名字不一样。随后,再导入数据库。最后再修改 config 文件,修改主数据库对应的名字为导入的数据库的名字,这时就可以看到导进去的数据了。