2013-09-16 5 views
23

Gibt es eine Möglichkeit, eine komplette Neo4J-Datenbank in Cypher zu exportieren, was zu einer ASCII-Datei der Cypher-Befehle führt, die in einer leeren Neo4J-Datenbank verwendet werden kann, um die ursprüngliche Datenbank neu zu erstellen? Da Neo4J so schnell entwickelt wird, mache ich mir Sorgen über die integrierte Backup-Funktionalität (der Enterprise-Version).Gesamte Datenbank im Cypher-Format (ASCII-Text) exportieren?

Zum Beispiel, mit Oracle, können Sie die gesamte Datenbank in SQL * PLUS DML/DDL-Befehle exportieren, was nützlich sein kann.

Antwort

26

Ab Neo4j 2.0 gibt es eine dump command in neo4j-Shell, die dies tut. Sie können die Ergebnisse einer bestimmten Abfrage oder der gesamten Datenbank ausgeben. Durch das Übergeben des Dump-Befehls als Argument beim Starten von neo4j-shell können Sie die Ausgabe in eine Datei umleiten, um ein "cypher create script" oder eine andere neo4j-Shell-Sitzung zu erstellen, die alle oder Teile des Graphen in einer anderen Datenbank neu erstellt.

Flatten und Dump die Ergebnisse einer Abfrage

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

gesamte Datenbank zu einer

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

Rohr die Dump in einem anderen Shell-Sitzung & Datenbank

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

Caveat emptor

Es gab einige Probleme mit Doppel- und Schwimmer in der wissenschaftlichen Schreibweise exportiert, die Neo4j-Shell nicht wieder auf Import interpretieren könnte (SO, github) und es gab einige Probleme mit "quoted strings" Flucht (github) . Ich denke, dass beide gelöst sind. Wenn Sie Probleme haben, sollten Sie sich vielleicht einen kürzlichen Build ansehen.

Und schließlich gibt es ein Problem, von dem ich glaube, dass es noch nicht gelöst ist. Kürzlich wurde das Schema in den Speicherauszug aufgenommen, so dass create index und create constraint Anweisungen ebenfalls exportiert werden. Alle exportierten Anweisungen werden jedoch in ein und derselben Transaktion in der Ausgabe eingerahmt und neo4j lässt Sie kein Schema und Daten in derselben Transaktion erstellen. Also, wenn Sie Rohr direkt die Dump in einer anderen Shell-Sitzung um die Grafik zu erstellen, sind Sie wahrscheinlich in

> ; 
ConstraintViolationException: Cannot perform data updates in a transaction that has performed schema updates. 
neo4j-sh (?)$ commit 
Failed to commit, transaction rolled back 

läuft Es ist einfach, dies zu umgehen, indem in eine Datei umleiten und die manuellen Hinzufügen commit und begin nach dem letzten Schemaanweisung. Seien Sie sicher, dass sie sich auf eine neue Zeile zu setzen, sollte es so etwas wie

... 
create index on :`Person`(`name`) 
commit 
begin 
create (_0:`Person` {`name`:"Paul"}) 
... 

suchen Sie können auch die Ausgabe von Neo4j-Shell on the fly bearbeiten und dort hinzufügen, zum Beispiel, wenn Sie programmatisch und don Dump‘ Ich möchte manuell bearbeiten. Auf osx haben benutzte ich wie so 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/ 

ein nach jedem Schema Erklärung verpflichten Dies fügt, die mehr als das, was notwendig ist, (könnten alle Schema Aussagen zusammen begehen), aber hey, es funktioniert.

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

-c Optionen erzählt die Neo4j-Shell, die wir Leiten eines Neo4j Shell-Befehl, und dass wir die Ausgabe auf stdout (außerhalb der NEO4-Schale) in der Bash wollen:

+0

Wo soll ich diesen Befehl 'usr @ term: bin/neo4j-sh -c dump> einfügen? ./backup/$(date +"% y% m% d_% H% M% S "). cypher" aus Ihrer Antwort? Ich benutze Windows 7. Danke –

+0

Von Neo4j Installationsverzeichnis. Wenn Sie sich in Windows befinden, ändern Sie den obigen Befehl in 'Neo4jShell.bat -c dump> ...' (kopieren Sie nicht "usr @ term:"). –

+0

Gibt es eine Möglichkeit, dies mit dem Docker-Image zu erreichen? – yucer

7

Dies sollte Ihr Problem lösen -Schale. Wir können dann die Ausgabe an eine beliebige Dump-Datei pipen, die in diesem Fall export_data.cypher ist (automatisch erstellt in demselben Verzeichnis, in dem Sie den obigen Befehl ausgeführt haben).

Nicht empfohlen:

./neo4j-shell 
$dump 

Unter Verwendung der obigen druckt alle Chiffre-Anweisungen innerhalb der Schale stdout, die Sie nicht können Pfeife aus leicht, so ist es nicht so nützlich, wenn es sehr klein ist.

Hinweis: Wie @jjaderberg in seiner Antwort darauf hingewiesen hat, exportiert der Befehl dump ohne Bedingungen alle Cypher-Anweisungen für den gesamten Graphen.

0

es Dump neo4j-shell -c dump > dump.cypher

Dann verwenden Sie versuchen, es neo4j-shell -v -file dump.cypher verwenden zu importieren, aber für riesige Dumps Sie Ausnahmen treffen können, wenn Neo4j nicht in der Lage eine Menge Daten in einer einzigen Transaktion zu laden. Es kann wie folgt aussehen:

Die Lösung wird sein, zwei große Transaktionen in cypher dump zu trennen, um Anweisungen zu trennen. Hier ist Skript, es zu tun:

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

Dann können Sie importieren, Parsing-Ausgang für Warnung und Fehler, falls vorhanden:

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

Nach der Index-Anweisung in dem sed Befehl erstellen; Symbol muss für den normalen Betrieb hinzugefügt werden.

■ Bildschirmausgabe sed -e 's/erstellen (Index | Einschränkung) auf */& \.' $ '' '\' $ '\ Ncommit' '\' $ '\ nBegin /'/data /backup/170715_045727.cypher

■ Dateiausgabe sed -i -E 's/erstellen (Index | Einschränkung) auf */& \.' $ '' '\' $ '\ ncommit' '\' $ '\ nbegin /' /data/backup/170715_045727_2.cypher

Verwandte Themen