web-dev-qa-db-fra.com

Exporter toute la base de données au format Cypher (texte ASCII)?

Existe-t-il un moyen d’exporter une base de données Neo4J entière dans Cypher, ce qui donne un fichier ASCII des commandes Cypher, qui pourrait être utilisé sur une base de données Neo4J vide pour recréer la base de données originale? Étant donné que Neo4J connaît actuellement un développement aussi rapide, je crains d’utiliser la fonctionnalité de sauvegarde intégrée (de la version entreprise).

Par exemple, avec Oracle, vous pouvez exporter la base de données complète sous forme de commandes SQL * PLUS DML/DDL, ce qui peut être utile.

23
Phil

Depuis Neo4j 2.0, il existe une commande dump dans neo4j-Shell qui le fait. Vous pouvez vider les résultats d'une requête spécifique ou de la base de données entière. En passant la commande dump en tant qu'argument lors du démarrage de neo4j-Shell, vous pouvez rediriger la sortie vers un fichier afin de créer un script de création de chiffrement ou une autre session neo4j-Shell recréant tout ou partie du graphique dans une base de données différente.

Aplatir et vider les résultats d'une requête

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

Vider toute la base de données dans un fichier

usr@term: bin/neo4j-sh -c dump > ./backup/$(date +"%y%m%d_%H%M%S").cypher

Pipe le dump vers une autre session Shell et base de données

usr@term: db1/bin/neo4j-sh -path db1/data/graph.db/ -c dump | db2/bin/neo4j-Shell -path db2/data/graph.db/

Caveat emptor

Il y avait quelques problèmes avec les doubles et les flottants exportés en notation scientifique, que neo4j-Shell ne pouvait pas interpréter à nouveau lors de l'importation ( SO , github ) et quelques problèmes avec l'échappement de "quoted strings" ( github ). Je pense que ces deux problèmes sont résolus, donc si vous rencontrez des difficultés, vous pouvez consulter une version récente.

Et enfin, il y a un problème qui, à mon avis, n'est pas encore résolu. Récemment, le schéma a été inclus dans le vidage; les instructions create index et create constraint sont également exportées. Cependant, toutes les instructions exportées sont encadrées dans une même transaction dans la sortie et neo4j ne vous permet pas de créer un schéma et des données dans la même transaction. Donc, si vous dirigez le vidage directement vers une autre session Shell pour recréer le graphique, vous risquez de rencontrer 

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

Il est facile de contourner ce problème en redirigeant vers un fichier et en ajoutant manuellement commit et begin après la dernière instruction du schéma. Assurez-vous de les mettre chacun sur une nouvelle ligne, cela devrait ressembler à quelque chose comme

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

Vous pouvez également éditer la sortie de neo4j-Shell à la volée et l’ajouter, par exemple si vous effectuez un dump par programme et que vous ne souhaitez pas éditer manuellement. Sur osx j'ai utilisé sed comme si

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/

Cela ajoute une validation après chaque instruction de schéma, ce qui est plus que nécessaire (vous pouvez commettre toutes les instructions de schéma ensemble), mais bon, cela fonctionne.

27
jjaderberg

Cela devrait résoudre votre problème:

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

-c options indique au neo4j-Shell que nous passons une commande neo4j Shell et que nous voulons que la sortie soit affichée sur stdout (en dehors de neo4-Shell) dans le bash-Shell. Nous pouvons ensuite diriger la sortie vers n’importe quel fichier de vidage qui est dans ce cas export_data.cypher (créé automatiquement dans le même répertoire que celui où vous avez exécuté la commande ci-dessus).

Non recommandé:

./neo4j-Shell
$dump

L'utilisation de ce qui précède imprime toutes les instructions de chiffrement sur la sortie standard du shell, ce que vous ne pouvez pas canaliser facilement. Ce n'est donc pas très utile, à moins d'être très petit.

Remarque: Comme @jjaderberg l'a souligné dans sa réponse, la commande dump sans aucune condition exporte toutes les instructions Cypher pour le graphique entier.

7
Pranjal Mittal

Dump le en utilisant neo4j-Shell -c dump > dump.cypher

Ensuite, vous pouvez essayer de l’importer en utilisant neo4j-Shell -v -file dump.cypher, mais pour huge dumps, vous pouvez rencontrer des exceptions, lorsque neo4j ne peut pas télécharger beaucoup de données en une seule transaction. Cela peut ressembler à:

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

La solution consistera à casser deux grosses transactions dans le chiffrement en instructions séparées. Voici le script pour le faire:

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

Ensuite, vous pouvez importer, en analysant la sortie des avertissements et des erreurs éventuelles:

cat dump_converted.cql | neo4j-Shell | grep -E 'WARNING:|Unknown\ command'
1
Dan Key

Après l'instruction create index dans la commande sed; Le symbole doit être ajouté pour un fonctionnement normal.

■ La sortie à l'écran Sed -E '/ create (index | contrainte) sur. */& \' $ ';' '\' $ '\ Ncommit' '\' $ '\ nbegin /'/data /backup/170715_045727.cypher

■ La sortie du fichier Sed -i -E -E/create (index | contrainte) sur. */&\'$'; ''\'$'\Ncommit ''\'$'\nbegin/' /data/backup/170715_045727_2.cypher

0
herlock-1979