有没有一种方法可以通过Cypher导出整个Neo4J数据库,生成一个包含Cypher命令的ASCII文件,该文件可以用于创建原始数据库的空Neo4J数据库? 由于Neo4J正在快速发展,我担心使用内置备份功能(企业版)。
例如,在Oracle中,您可以导出SQL*PLUS DML / DDL命令的整个数据库,这可能很有用。
有没有一种方法可以通过Cypher导出整个Neo4J数据库,生成一个包含Cypher命令的ASCII文件,该文件可以用于创建原始数据库的空Neo4J数据库? 由于Neo4J正在快速发展,我担心使用内置备份功能(企业版)。
例如,在Oracle中,您可以导出SQL*PLUS DML / DDL命令的整个数据库,这可能很有用。
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
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 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
您可以通过重定向到文件并在最后一个模式语句之后手动添加commit
和begin
来解决这个问题。请确保将它们放在新的一行上,应该看起来像这样:
...
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/
./neo4j-shell -c dump > export_data.cypher
-c
选项告诉neo4j-shell,我们正在传递neo4j shell命令,并且我们希望将输出发送到标准输出(stdout)(在bash-shell之外)。然后我们可以将输出导入任何转储文件,此处为export_data.cypher
(在运行上述命令的同一目录中自动创建)。
不推荐这样做:
./neo4j-shell
$dump
使用 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命令中的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
usr@term: bin/neo4j-sh -c dump > ./backup/$(date +"%y%m%d_%H%M%S").cypher
粘贴到哪里?我正在使用Windows 7。谢谢。 - Daniel Krizianneo4j-shell -path /var/lib/neo4j/data/databases/graph.db -c dump > export_data.cypher -v
它将在当前目录下创建名为“export_data.cypher”的文件。希望能对您有所帮助。 - Jaymin Gajjar