Подтвердить что ты не робот

Экспортировать всю базу данных в формате Cypher (текст ASCII)?

Есть ли способ экспортировать всю базу данных Neo4J в Cypher, в результате чего создается файл ASCII команд Cypher, который можно использовать в пустой базе данных Neo4J для воссоздания исходной базы данных? Поскольку Neo4J находится в таком быстром развитии, я беспокоюсь об использовании встроенных функций резервного копирования (корпоративной версии).

Например, с Oracle вы можете экспортировать всю базу данных в SQL * PLUS DML/DDL-команды, которые могут быть полезны.

4b9b3361

Ответ 1

Как и в Neo4j 2.0, в neo4j-shell есть команда dump. Вы можете сбросить результаты конкретного запроса или всей базы данных. Передавая команду dump в качестве аргумента при запуске neo4j-shell, вы можете перенаправить вывод в файл, чтобы создать "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/

Предостережение emptor

Были некоторые проблемы с удвоением и поплавками, экспортируемыми в научной нотации, которые neo4j-shell не смог интерпретировать снова при импорте (fooobar.com/questions/227731/..., github) и возникли некоторые проблемы с экранированием "quoted strings" (github). Я думаю, что они оба разрешены, поэтому, если у вас есть проблемы, вы можете проверить недавнюю сборку.

И, наконец, есть одна проблема, о которой я пока не думаю. Недавно схема была включена в дамп, поэтому create index и create constraint также экспортируются. Однако все экспортированные операторы создаются в одной и той же транзакции на выходе, а 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/

Это добавляет фиксацию после каждой инструкции схемы, которая больше, чем необходимо (может передавать все инструкции схемы вместе), но эй, она работает.

Ответ 2

Это должно решить вашу проблему:

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

-c указывает команде neo4j-shell, что мы передаем команду оболочки neo4j, и хотим, чтобы выход был выведен на stdout (вне оболочки neo4) в bash -shell. Затем мы можем передать вывод в любой файл дампа, который в этом случае export_data.cypher (создается автоматически в том же каталоге, в котором вы выполняли указанную выше команду).

Не рекомендуется:

./neo4j-shell
$dump

Используя вышеприведенные операции, все инструкции cypher в stdout внутри оболочки, которые вы не можете легко проложить, поэтому это не так полезно, если оно не очень мало.

Примечание. Как отметил @jjaderberg в своем ответе, команда дампа без каких-либо условий экспортирует все операторы Cypher для всего графика.

Ответ 3

Дамп с помощью neo4j-shell -c dump > dump.cypher

Затем вы можете попробовать импортировать его с помощью neo4j-shell -v -file dump.cypher, но для огромных дампов вы можете встретить исключения, когда neo4j не может загрузить много данных в одну транзакцию. Это может выглядеть так:

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

Решение состоит в том, чтобы разбить две большие транзакции в дампе cypher для разделения инструкций. Для этого выполните script:

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

Затем вы можете импортировать, анализировать выходные данные для предупреждения и ошибок, если таковые имеются:

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

Ответ 4

После создания оператора индекса в команде sed; Символ должен быть добавлен для нормальной работы.

■ Выход на экран sed -E '/create (index | constraint) on. */& \' $';' '\' $'\ncommit' '\' $'\nbegin/'/data/backup/170715_045727.cypher

■ Выход файла sed -i -E/create (index | constraint) on. */&\'$'; ''\'$'\ncommit ''\'$'\nbegin/'/data/backup/170715_045727_2. Шифр