有没有办法在Cypher中导出整个Neo4J数据库,从而产生Cypher命令的ASCII文件,可以在空的Neo4J数据库上使用它来重新创建原始数据库?由于Neo4J正在经历如此快速的发展,我担心使用内置的备份功能(企业版).
例如,使用Oracle,您可以在SQL*PLUS DML/DDL命令中导出整个数据库,这可能很有用.
jja*_*erg 27
从Neo4j 2.0开始,neo4j-shell中有一个dump命令可以执行此操作.您可以转储特定查询或整个数据库的结果.通过在启动neo4j-shell时将dump命令作为参数传递,您可以将输出重定向到文件以创建"cypher create script"或另一个neo4j-shell会话重新创建另一个数据库中的全部或部分图形.
展平并转储查询结果
neo4j-sh$ dump MATCH (n:StackOverflow:Question {questionId:18830686})<-[:ANSWERS]-(answer)<-[:WRITES]-(user) RETURN *;
Run Code Online (Sandbox Code Playgroud)
将整个数据库转储到文件中
usr@term: bin/neo4j-sh -c dump > ./backup/$(date +"%y%m%d_%H%M%S").cypher
Run Code Online (Sandbox Code Playgroud)
将转储管道传输到另一个shell会话和数据库
usr@term: db1/bin/neo4j-sh -path db1/data/graph.db/ -c dump | db2/bin/neo4j-shell -path db2/data/graph.db/
Run Code Online (Sandbox Code Playgroud)
买者自负
有一些问题,双重和浮动以科学记数法导出,neo4j-shell无法在导入时再次解释(SO,github),并且在转义时存在一些问题"quoted strings"(github).我认为这些都已解决,所以如果您遇到麻烦,可能需要查看最近的版本.
最后还有一个我认为尚未解决的问题.最近被列入转储这样的架构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
Run Code Online (Sandbox Code Playgroud)
通过重定向到文件并手动添加commit并begin在最后一个模式语句之后,可以轻松解决此问题.一定要把它们放在一个新的线上,看起来应该是这样的
...
create index on :`Person`(`name`)
commit
begin
create (_0:`Person` {`name`:"Paul"})
...
Run Code Online (Sandbox Code Playgroud)
或者您可以动态编辑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/
Run Code Online (Sandbox Code Playgroud)
这会在每个模式语句之后添加一个提交,这超出了必要的范围(可以将所有模式语句一起提交),但是嘿,它可以工作.
这应该可以解决您的问题:
./neo4j-shell -c dump > export_data.cypher
Run Code Online (Sandbox Code Playgroud)
-coptions告诉neo4j-shell我们正在传递一个neo4j shell命令,并且我们希望输出到bash-shell中的stdout(在neo4-shell之外).然后,我们可以将输出传递给任何转储文件,export_data.cypher在这种情况下(在运行上述命令的同一目录中自动创建).
不建议:
./neo4j-shell
$dump
Run Code Online (Sandbox Code Playgroud)
使用上面的命令将所有cypher语句打印到shell内部的stdout,这些语句不能轻易地输出,所以除非它非常小,否则它不是那么有用.
注意:正如@jjaderberg在他的回答中指出的那样,dump命令没有任何条件导出整个图的所有Cypher语句.
| 归档时间: |
|
| 查看次数: |
15433 次 |
| 最近记录: |