Neo4j 是否以密码格式(ASCII文本)导出整个数据库?

Neo4j 是否以密码格式(ASCII文本)导出整个数据库?,neo4j,Neo4j,是否有办法在Cypher中导出整个Neo4J数据库,从而生成一个可用于空Neo4J数据库的Cypher命令ASCII文件,以重新创建原始数据库?由于Neo4J正在经历如此快速的开发,我担心使用内置的备份功能(企业版) 例如,使用Oracle,您可以使用SQL*和DML/DDL命令导出整个数据库,这非常有用。从Neo4j 2.0开始,Neo4j shell中就有一个这样做的工具。您可以转储特定查询或整个数据库的结果。通过在启动neo4j shell时将dump命令作为参数传递,可以将输出重定向到文

是否有办法在Cypher中导出整个Neo4J数据库,从而生成一个可用于空Neo4J数据库的Cypher命令ASCII文件,以重新创建原始数据库?由于Neo4J正在经历如此快速的开发,我担心使用内置的备份功能(企业版)


例如,使用Oracle,您可以使用SQL*和DML/DDL命令导出整个数据库,这非常有用。

从Neo4j 2.0开始,Neo4j shell中就有一个这样做的工具。您可以转储特定查询或整个数据库的结果。通过在启动neo4j shell时将dump命令作为参数传递,可以将输出重定向到文件以生成“cypher创建脚本”,或重定向到另一个neo4j shell会话,在不同的数据库中重新创建全部或部分图形

展平并转储查询结果

neo4j-sh$ dump MATCH (n:StackOverflow:Question {questionId:18830686})<-[:ANSWERS]-(answer)<-[:WRITES]-(user) RETURN *;
通过管道将转储传输到另一个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在导入(,)时无法再次解释这些问题,并且在转义
“引号字符串”
()时出现了一些问题。我认为这两个问题都已解决,因此如果您遇到问题,您可能希望查看最近的版本

最后还有一个问题我认为还没有解决。最近,转储中包含了模式,因此也导出了
create index
create 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
通过重定向到一个文件并在最后一个schema语句后手动添加
commit
begin
,可以很容易地解决这个问题。一定要把它们放在一条新的线上,看起来应该是这样的

...
create index on :`Person`(`name`)
commit
begin
create (_0:`Person` {`name`:"Paul"})
...
或者,您可以动态编辑Neo4JShell的输出并将其添加到其中,例如,如果您以编程方式转储,并且不希望手动编辑。在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/

这会在每个schema语句之后添加一个commit,这比需要的要多(可以将所有schema语句一起提交),但是,它可以工作。

这应该可以解决您的问题:

./neo4j-shell -c dump > export_data.cypher
-c
选项告诉neo4j shell我们正在传递一个neo4j shell命令,并且希望输出到bash shell中的stdout(在neo4shell之外)。然后,我们可以通过管道将输出传输到任何转储文件,该文件在本例中为
export\u data.cypher
(在运行上述命令的同一目录中自动创建)

不建议:

./neo4j-shell
$dump
使用上面的方法将所有的cypher语句打印到shell中的stdout中,您无法轻松地将其导出,因此除非它非常小,否则它就没有多大用处


注意:@jjaderberg在他的回答中指出,dump命令不带任何条件地导出整个图形的所有Cypher语句。

使用
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)
解决方案是将密码转储中的两个大事务分解为单独的指令。下面是执行此操作的脚本:

然后,您可以导入、解析警告和错误(如果有)的输出:

cat dump_converted.cql | neo4j-shell | grep -E 'WARNING:|Unknown\ command'

在sed命令中的createindex语句之后;必须添加符号才能正常运行

■ 屏幕输出 sed-E在.*/&\'$;'\'$'上的/create(索引|约束)\ncommit'\'$'\nbegin/'/data/backup/170715_045727.cypher

■ 文件输出
sed-i-E在.*/&\'$;'\'$'上的/create(索引|约束)\ncommit'\'$'\nbegin/'/data/backup/170715_045727_2.cypher

我应该将此命令粘贴到哪里
usr@term:bin/neo4j sh-c dump>/backup/$(日期+%y%m%d\uh%m%S”)。您的答案中是否有密码?我正在使用Windows7。感谢来自Neo4j安装目录。如果您在Windows中,请将上面的命令更改为
Neo4jShell.bat-c dump>。
(不要复制)usr@term:")。有没有办法使用docker映像来实现这一点?如果您有数据库文件夹,则可以使用以下命令在没有主机的情况下导出neo4j数据库:neo4j shell-path/var/lib/neo4j/data/databases/graph.db-c dump>export_data.cypher-v。它将在当前目录中创建名为“export_data.cypher”的文件。希望能有帮助。
cat dump_converted.cql | neo4j-shell | grep -E 'WARNING:|Unknown\ command'