Лучший способ удалить все узлы и отношения в Cypher
Каков наилучший способ очистки графика от всех узлов и связей через Cypher?
В http://neo4j.com/docs/stable/query-delete.html#delete-delete-a-node-and-connected-relationships пример
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r
имеет примечание:
Этот запрос не предназначен для удаления больших объемов данных
Итак, лучше ли следующее?
MATCH ()-[r]-() DELETE r
и
MATCH (n) DELETE n
Или есть ли другой способ, который лучше для больших графов?
Ответы
Ответ 1
Как вы уже упоминали, самый простой способ - остановить Neo4j, отбросить папку data/graph.db
и перезагрузить ее.
Удаление большого графика через Cypher будет всегда медленнее, но все же выполнимо, если вы используете правильный размер транзакции для предотвращения проблем с памятью (помните, что транзакция сначала создается в памяти, прежде чем они будут зафиксированы). Обычно 50-100 тыс. Атомных операций - хорошая идея. Вы можете добавить ограничение в оператор удаления для управления размерами tx и сообщить, сколько узлов было удалено. Перезапустите этот оператор, пока не вернется значение 0:
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
WITH n,r LIMIT 50000
DELETE n,r
RETURN count(n) as deletedNodesCount
Ответ 2
Согласно официальному документу здесь:
MATCH (n)
DETACH DELETE n
но также сказано This query isnt for deleting large amounts of data
. так что лучше использовать с ограничением.
match (n)
with n limit 10000
DETACH DELETE n;
Ответ 3
Написал этот маленький script, добавил его в мою папку NEO/bin.
Протестировано в сообществе v3.0.6
#!/bin/sh
echo Stopping neo4j
./neo4j stop
echo Erasing ALL data
rm -rf ../data/databases/graph.db
./neo4j start
echo Done
Я использую его, когда мои нагрузки LOAD CSV являются дрянной.
Надеюсь, что это поможет
Ответ 4
optional match (n)-[p:owner_real_estate_relation]->() with n,p LIMIT 1000 delete p
В тестовом прогоне удалены отношения 50000, завершенные после 589 мс.