CypherでNeo4Jデータベース全体をエクスポートして、元のデータベースを再作成するために空のNeo4Jデータベースで使用できるCypherコマンドのASCIIファイルを作成する方法はありますか?急速に開発が進んでいるため、(エンタープライズ版の)組み込みのバックアップ機能の使用について心配しています。
たとえば、Oracleを使用すると、SQL * PLUS DML/DDLコマンドでデータベース全体をエクスポートできるため、便利です。
Neo4j 2.0以降、これを行う dumpコマンド がneo4j-Shellにあります。特定のクエリまたはデータベース全体の結果をダンプできます。 neo4j-Shellの起動時にdumpコマンドを引数として渡すことにより、出力をファイルにリダイレクトして「暗号作成スクリプト」を作成したり、別のデータベースにグラフのすべてまたは一部を再作成する別の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
ダンプを別のシェルセッションとデータベースにパイプする
usr@term: db1/bin/neo4j-sh -path db1/data/graph.db/ -c dump | db2/bin/neo4j-Shell -path db2/data/graph.db/
警告エンプター
Doubleとfloatが科学表記法でエクスポートされるときにいくつかの問題がありましたが、neo4j-Shellはインポート時に再度解釈できませんでした( [〜#〜] so [〜#〜] 、 github )そしてエスケープでいくつかの問題がありました"quoted strings"
( github )。これらは両方とも解決されたと思いますので、問題が発生した場合は、最近のビルドをチェックしてください。
そして最後に、まだ解決されていないと思う1つの問題があります。最近スキーマがダンプに含まれたので、create index
およびcreate constraint
ステートメントもエクスポートされます。ただし、エクスポートされたすべてのステートメントは、出力の1つの同じトランザクションでフレーム化され、neo4jでは、同じトランザクションでスキーマとデータを作成できません。したがって、ダンプを別のシェルセッションに直接パイプしてグラフを再作成すると、次のようになります。
> ;
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コマンドを渡していること、および出力を(neo4-Shellの外で)stdoutに要求することを通知します。次に、出力を任意のダンプファイル(この場合はexport_data.cypher
)にパイプ処理できます(上記のコマンドを実行したのと同じディレクトリに自動的に作成されます)。
非推奨:
./neo4j-Shell
$dump
上記を使用すると、すべての暗号文がシェル内のstdoutに出力され、簡単にパイプアウトできないため、非常に小さいものでない限り、あまり役に立ちません。
注:@jjaderbergが回答で指摘したように、条件なしのdumpコマンドは、グラフ全体のすべてのCypherステートメントをエクスポートします。
neo4j-Shell -c dump > dump.cypher
を使用してダンプします
次に、neo4j-Shell -v -file dump.cypher
を使用してインポートを試みることができますが、hugeダンプの場合、neo4jが大量のデータをアップロードできないときに例外に遭遇する可能性があります1つのトランザクションで。次のようになります。
at org.neo4j.cypher.internal.frontend.v2_3.bottomUp$BottomUpRewriter.apply(Rewritable.scala:159)
解決策は、サイファーダンプの2つの大きなトランザクションを中断して、命令を分離することです。これを行うスクリプトは次のとおりです。
https://Gist.github.com/garmoshka-mo/f27c1884bc1851ebf7b23bf4137095f9
次に、インポートして、警告やエラーがないか出力を解析できます。
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。サイファー
■ファイル出力sed -i -E 's/create(index | constraint)on。* /&\' $ ';' '\' $ '\ ncommit' '\' $ '\ nbegin /'/data/backup/170715_045727_2.cypher