以Cypher格式(ASCII文本)导出整个数据库?

27

有没有一种方法可以通过Cypher导出整个Neo4J数据库,生成一个包含Cypher命令的ASCII文件,该文件可以用于创建原始数据库的空Neo4J数据库? 由于Neo4J正在快速发展,我担心使用内置备份功能(企业版)。

例如,在Oracle中,您可以导出SQL*PLUS DML / DDL命令的整个数据库,这可能很有用。

4个回答

28
自 Neo4j 2.0 起,neo4j-shell 中有一个dump command可用于此操作。您可以转储特定查询或整个数据库的结果。通过在启动 neo4j-shell 时将 dump 命令作为参数传递,您可以将输出重定向到文件以创建“cypher create script”,或重新创建图形的所有或部分内容到不同的数据库中的另一个 neo4j-shell 会话中。
展平并转储查询结果。
neo4j-sh$ dump MATCH (n:StackOverflow:Question {questionId:18830686})<-[:ANSWERS]-(answer)<-[:WRITES]-(user) RETURN *;

将整个数据库转储到文件中
usr@term: bin/neo4j-sh -c dump > ./backup/$(date +"%y%m%d_%H%M%S").cypher

将转储导向另一个 shell 会话和数据库。
usr@term: db1/bin/neo4j-sh -path db1/data/graph.db/ -c dump | db2/bin/neo4j-shell -path db2/data/graph.db/

买方自负

在导出时,存在一些浮点数和双精度数以科学计数法导出的问题,neo4j-shell 在导入时无法再次解释 (SO, github),同时存在一些转义 "引用字符串" 的问题 (github)。我认为这两个问题都已解决,因此如果您遇到问题,可以尝试使用最新版本。

最后还有一个问题,我认为目前还没有解决。最近在转储中包含了模式,因此 create indexcreate constraint 语句也被导出。但是,所有导出的语句都在同一个事务中,而 neo4j 不允许在同一个事务中创建模式和数据。因此,如果您将转储直接导入到另一个 shell 会话中以重新创建图形,则可能会遇到

> ;
ConstraintViolationException: Cannot perform data updates in a transaction that has performed schema updates.
neo4j-sh (?)$ commit
Failed to commit, transaction rolled back

您可以通过重定向到文件并在最后一个模式语句之后手动添加commitbegin来解决这个问题。请确保将它们放在新的一行上,应该看起来像这样:

...
create index on :`Person`(`name`)
commit
begin
create (_0:`Person` {`name`:"Paul"})
...

在neo4j-shell上可以实时编辑输出内容并添加内容,例如,如果您以编程方式转储文件,不想手动编辑,则可以在此处添加。在osx上,我使用了如下的sed命令。

db1/bin/neo4j-shell -path db1/data/graph.db/ -c dump | sed -E 's/create (index|constraint) on .*/&\'$'\ncommit''\'$'\nbegin/' | db2/bin/neo4j-shell -path db2/data/graph.db/

这会在每个模式语句之后添加一个提交,这比必要的要多(可以一起提交所有模式语句),但是它能够正常工作。

我应该把这个命令usr@term: bin/neo4j-sh -c dump > ./backup/$(date +"%y%m%d_%H%M%S").cypher 粘贴到哪里?我正在使用Windows 7。谢谢。 - Daniel Krizian
从Neo4j安装目录开始。如果您使用的是Windows,则将上面的命令更改为“Neo4jShell.bat -c dump > ...”(不要复制“usr@term:”)。 - Nadjib Mami
1
有没有一种使用Docker镜像来实现这个的方法? - yucer
1
如果您有数据库文件夹,可以使用以下命令导出neo4j数据库而无需主机:neo4j-shell -path /var/lib/neo4j/data/databases/graph.db -c dump > export_data.cypher -v它将在当前目录下创建名为“export_data.cypher”的文件。希望能对您有所帮助。 - Jaymin Gajjar

9
这应该可以解决你的问题:
./neo4j-shell -c dump > export_data.cypher

-c选项告诉neo4j-shell,我们正在传递neo4j shell命令,并且我们希望将输出发送到标准输出(stdout)(在bash-shell之外)。然后我们可以将输出导入任何转储文件,此处为export_data.cypher(在运行上述命令的同一目录中自动创建)。

不推荐这样做:

./neo4j-shell
$dump

使用上述方法会将所有密码语句打印到shell的标准输出中,但很难直接导出,因此除非内容很少,否则并不是很有用。
注意:正如@jjaderberg在他的答案中指出的那样,没有任何条件的dump命令会导出整个图形的所有Cypher语句。

2

使用 neo4j-shell -c dump > dump.cypher 进行导出操作。

然后,您可以尝试使用 neo4j-shell -v -file dump.cypher 导入数据,但是对于大量的数据导入,您可能会遇到异常情况,因为neo4j无法在一个事务中上传大量数据。它可能看起来像:

at org.neo4j.cypher.internal.frontend.v2_3.bottomUp$BottomUpRewriter.apply(Rewritable.scala:159)

解决方案是将Cypher转储中的两个大事务拆分为单独的指令。以下是执行此操作的脚本: https://gist.github.com/garmoshka-mo/f27c1884bc1851ebf7b23bf4137095f9 然后,您可以导入并解析输出以查看警告和错误(如果有)。
cat dump_converted.cql | neo4j-shell | grep -E 'WARNING:|Unknown\ command'

0

在sed命令中的create index语句之后,必须添加符号以进行正常操作。

■ 屏幕输出 sed -E 's/create (index|constraint) on .*/&\'$';''\'$'\ncommit''\'$'\nbegin/' /data/backup/170715_045727.cypher

■ 文件输出 sed -i -E 's/create (index|constraint) on .*/&\'$';''\'$'\ncommit''\'$'\nbegin/' /data/backup/170715_045727_2.cypher


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接