Cypher で Neo4J データベース全体をエクスポートし、元のデータベースを再作成するために空の Neo4J データベースで使用できる Cypher コマンドの ASCII ファイルを生成する方法はありますか? Neo4J は急速に発展しているため、(エンタープライズ版の) 組み込みのバックアップ機能を使用することについて心配しています。
たとえば、Oracle では、データベース全体を SQL*PLUS DML/DDL コマンドでエクスポートできるので便利です。
Cypher で Neo4J データベース全体をエクスポートし、元のデータベースを再作成するために空の Neo4J データベースで使用できる Cypher コマンドの ASCII ファイルを生成する方法はありますか? Neo4J は急速に発展しているため、(エンタープライズ版の) 組み込みのバックアップ機能を使用することについて心配しています。
たとえば、Oracle では、データベース全体を SQL*PLUS DML/DDL コマンドでエクスポートできるので便利です。
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 *;
データベース全体をファイルにダンプする
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
andを手動で追加することで、これを簡単に回避できます。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
options は、neo4j シェル コマンドを渡していること、および出力を bash-shell の stdout (neo4-shell の外部) に出力することを neo4j-shell に伝えます。次に、出力を任意のダンプ ファイルにパイプできます。export_data.cypher
この場合、このファイルは (上記のコマンドを実行したディレクトリと同じディレクトリに自動的に作成されます)。
非推奨:
./neo4j-shell
$dump
上記を使用すると、簡単にパイプアウトできないシェル内の stdout にすべての cypher ステートメントが出力されるため、非常に小さい場合を除き、あまり役に立ちません。
注: @jjaderberg が彼の回答で指摘したように、条件を指定せずに dump コマンドを実行すると、グラフ全体のすべての Cypher ステートメントがエクスポートされます。
を使用してダンプしますneo4j-shell -c dump > dump.cypher
次に、を使用してインポートを試みることができますneo4j-shell -v -file dump.cypher
が、巨大なダンプの場合、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'