2013-09-16 18 views
23

Neo4Jデータベース全体をCypherでエクスポートして、空のNeo4Jデータベースで元のデータベースを再作成できるCypherコマンドのASCIIファイルを作成する方法はありますか? Neo4Jはこのような急速な発展を遂げているので、(エンタープライズ版の)組み込みバックアップ機能の使用について心配しています。データベース全体をCypher形式(ASCIIテキスト)でエクスポートしますか?

たとえば、Oracleでは、データベース全体をSQL * PLUSのDML/DDLコマンドでエクスポートできますが、これを使用すると便利です。

答えて

26

neo4j 2.0以降では、これを行うneo4jシェルにdump commandがあります。特定のクエリまたはデータベース全体の結果をダンプできます。 neo4j-shellを起動するときに引数としてdumpコマンドを渡すことで、出力をファイルにリダイレクトして 'cypher create script'を作成するか、別のデータベースのグラフのすべてまたは一部を再作成する別のneo4j-shellセッションにすることができます。

フラット化し、クエリの結果をダンプ

neo4j-sh$ dump MATCH (n:StackOverflow:Question {questionId:18830686})<-[:ANSWERS]-(answer)<-[:WRITES]-(user) RETURN *; 

ファイルにデータベース全体をダンプ

[email protected]: bin/neo4j-sh -c dump > ./backup/$(date +"%y%m%d_%H%M%S").cypher 

パイプ別のシェルセッションにダンプ&データベース

[email protected]: db1/bin/neo4j-sh -path db1/data/graph.db/ -c dump | db2/bin/neo4j-shell -path db2/data/graph.db/ 

警告買い手

あり、いくつかの問題は、ダブルスと一緒にいたとのNeo4j-シェルはインポート(SOgithub)で再び解釈できなかった、科学的表記法で輸出されて浮遊し"quoted strings"github)をエスケープしていくつかの問題がありました。これらは両方とも解決されていると思いますので、問題がある場合は、最近のビルドをチェックしてみてください。

最後に、まだ解決されていないと思う1つの問題があります。最近ではスキーマがダンプに含まれていたので、create indexcreate constraintもエクスポートされています。しかし、エクスポートされたすべてのステートメントは、出力内で同じトランザクションで囲まれており、neo4jは同じトランザクション内でスキーマとデータを作成することはできません。別のシェルセッションに直接ダンプは、グラフを再作成するためにあなたのパイプであれば、あなたは

> ; 
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-シェルからの出力を編集して、例えば、そこにそれを追加することができます手動で編集する必要はありません。 OSXで私はそう

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/ 

のようにsedを使用していた。この追加コミット(一緒にすべてのスキーマ文をコミットできる)必要ですが、ちょっと、それはどのような作品よりも、各スキーマ文の後に。

+0

「usr @ term:bin/neo4j-sh -c dump> ./backup/$(date+ "%y%あなたの答えから「cypher」を選択してください。私はWindows 7を使用しています。ありがとう –

+0

Neo4jインストールディレクトリから。 Windowsの場合は、上記のコマンドを 'Neo4jShell.bat -c dump> ...'に変更します( "usr @ term:"はコピーしないでください)。 –

+0

ドッカー画像を使ってこれを達成する方法はありますか?あなたは次のコマンドを使用してデータベースフォルダを持っている場合 – yucer

7

この問題を解決する必要があります。

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

-cオプション我々はbashで(neo4シェル外)のNeo4jのシェルコマンドを渡し、我々は標準出力に出力したいとしているのNeo4jシェルに指示します-シェル。この場合、ダンプファイルexport_data.cypher(上記のコマンドを実行したのと同じディレクトリに自動的に作成されます)に出力をパイプすることができます。上記印刷物あなたが簡単にパイプアウトすることはできませんシェル内部標準出力へのCYPHERステートメントを使用して

./neo4j-shell 
$dump 

を、それが非常に小さい場合を除き、それはそれほど有用ではありません。

推奨しません。

注:@jjaderbergが答えて指摘したように、dumpコマンドを条件なしで使用すると、グラフ全体のすべてのCypher文がエクスポートされます。

0

次にあなたがneo4j-shell -v -file dump.cypherを使用して、それをインポートしようとするが、巨大ためのNeo4jできないが、1つのトランザクションで大量のデータをアップロードするときに、例外を満たすことができるダンプすることができますneo4j-shell -c dump > dump.cypher

を使用して、それをダンプします。

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

解決策は、サイファーダンプで2つの大きなトランザクションを分割して命令を分割することです。

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

が次にインポートすることができ、警告やエラーの出力を解析、もしあれば:ここでそれを行うためのスクリプトがあるsedコマンドでは、CREATE INDEXステートメントの後

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

。シンボルは通常の操作のために追加する必要があります。 ';' '\' $ '\ ncommit' '\' $ '\ nbegin /' /データ| '上*/& \ sの作成/(制約インデックス)' $ -E sedの

■画面出力 ファイル出力■/backup/170715_045727.cypher

のsed -i -Eの作成/(インデックス|制約)上*/& \。 '$ ';' '\' $ '\ ncommit' '\' $ '\ nbegin /' /data/backup/170715_045727_2.cypher

関連する問題