【问题标题】:Export whole database in Cypher format (ASCII text)?以密码格式(ASCII 文本)导出整个数据库?
【发布时间】:2013-09-20 18:15:06
【问题描述】:

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

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

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    从 Neo4j 2.0 开始,neo4j-shell 中有一个 dump command 可以执行此操作。您可以转储特定查询或整个数据库的结果。通过在启动 neo4j-shell 时将转储命令作为参数传递,您可以将输出重定向到文件以创建“密码创建脚本”或另一个 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 在导入时无法再次解释(SOgithub)并且转义 "quoted strings"(@987654324)存在一些问题@)。我认为这些都已解决,因此如果您遇到问题,您可能需要查看最近的构建。

    最后还有一个我认为还没有解决的问题。最近模式包含在转储中,因此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 &gt; ./backup/$(date +"%y%m%d_%H%M%S").cypher 粘贴到哪里?我使用的是 Windows 7。谢谢
    • 从 Neo4j 安装目录。如果您在 Windows 中,请将上面的命令更改为 Neo4jShell.bat -c dump &gt; ...(不要复制“usr@term:”)。
    • 有没有办法使用 docker 镜像来实现这一点?
    • 如果您有数据库文件夹,您可以在没有主机的情况下导出 neo4j 数据库,使用以下命令:neo4j-shell -path /var/lib/neo4j/data/databases/graph.db -c dump > export_data.cypher -v 它将在您的当前目录中创建名为“export_data.cypher”的文件。希望对您有所帮助。
    【解决方案2】:

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

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

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

    不推荐:

    ./neo4j-shell
    $dump
    

    使用上面的方法将所有密码语句打印到 shell 内的 stdout 中,你不能轻易地输出,所以除非它非常小,否则它不是很有用。

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

    【讨论】:

      【解决方案3】:

      使用neo4j-shell -c dump &gt; dump.cypher转储它

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

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

      解决方案是将密码转储中的两个大事务分解为单独的指令。这是执行此操作的脚本:

      https://gist.github.com/garmoshka-mo/f27c1884bc1851ebf7b23bf4137095f9

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

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

      【讨论】:

        【解决方案4】:

        在 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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-31
          • 2021-04-01
          • 2020-03-16
          • 2018-12-24
          • 1970-01-01
          • 2011-11-21
          • 2021-08-17
          • 2013-03-04
          相关资源
          最近更新 更多