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

时间:2013-09-16 14:37:28

标签: neo4j

有没有办法在Cypher中导出整个Neo4J数据库,导致Cypher命令的ASCII文件可用于空Neo4J数据库以重新创建原始数据库?由于Neo4J正在快速发展,我担心使用内置的备份功能(企业版)。

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

4 个答案:

答案 0 :(得分:27)

从Neo4j 2.0开始,neo4j-shell中有一个dump command来执行此操作。您可以转储特定查询或整个数据库的结果。通过在启动neo4j-shell时将dump命令作为参数传递,您可以将输出重定向到file以创建“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会话&amp;数据库

usr@term: db1/bin/neo4j-sh -path db1/data/graph.db/ -c dump | db2/bin/neo4j-shell -path db2/data/graph.db/

警告经纪人

使用科学记数法导出双打和浮点数存在一些问题,neo4j-shell无法在导入时再次解释(SOgithub)并且在转义时存在一些问题{{ 1}}(github)。我认为这些都已解决,因此如果您遇到麻烦,可能需要查看最近的版本。

最后还有一个我认为尚未解决的问题。最近的模式已包含在转储中,因此也会导出"quoted strings"create index语句。但是,所有导出的语句都在输出中的同一个事务中构建,neo4j不允许您​​在同一事务中创建模式和数据。因此,如果将转储直接传递到另一个shell会话以重新创建图形,则可能会遇到

create constraint

通过重定向到文件并在最后一个模式语句之后手动添加> ; ConstraintViolationException: Cannot perform data updates in a transaction that has performed schema updates. neo4j-sh (?)$ commit Failed to commit, transaction rolled back commit,可以轻松解决此问题。一定要把它们放在一个新的行上,它应该看起来像

begin

或者您可以动态编辑neo4j-shell的输出并将其添加到那里,例如,如果您以编程方式转储而不想手动编辑。在osx上我使用了sed这样

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

这会在每个模式语句之后添加一个提交,这超出了必要的范围(可以将所有模式语句一起提交),但是嘿,它可以工作。

答案 1 :(得分:7)

这可以解决您的问题:

./neo4j-shell -c dump > export_data.cypher

-c选项告诉neo4j-shell我们正在传递一个neo4j shell命令,并且我们希望输出到bash-shell中的stdout(在neo4-shell之外)。然后,我们可以将输出传递给任何转储文件,在这种情况下为export_data.cypher(在运行上述命令的同一目录中自动创建)。

不推荐:

./neo4j-shell
$dump

使用上面的代码将所有cypher语句打印到shell中的stdout,你可以很容易地将其输出,所以除非它非常小,否则它不会那么有用。

注意:正如@jjaderberg在他的回答中指出的那样,没有任何条件的dump命令会导出整个图的所有Cypher语句。

答案 2 :(得分:1)

使用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'

答案 3 :(得分:0)

在sed命令中创建索引语句之后;必须添加符号才能正常运行。

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

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