Quel est le meilleur moyen de nettoyer le graphique de tous les nœuds et relations via Cypher?
Sur http://neo4j.com/docs/stable/query-delete.html#delete-delete-a-node-and-connected-relationships l'exemple
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r
a la note:
Cette requête ne concerne pas la suppression de grandes quantités de données.
Alors, la suite est-elle meilleure?
MATCH ()-[r]-() DELETE r
et
MATCH (n) DELETE n
Ou y a-t-il un autre moyen qui est préférable pour les grands graphiques?
Comme vous l'avez dit, le moyen le plus simple consiste à arrêter Neo4j, à supprimer le dossier data/graph.db
et à le redémarrer.
La suppression d'un graphique de grande taille via Cypher sera toujours plus lente mais toujours réalisable si vous utilisez une taille de transaction appropriée pour éviter les problèmes de mémoire (rappelez-vous que les transactions sont d'abord créées en mémoire avant d'être validées). En règle générale, une opération atomique de 50 à 100 000 $ est une bonne idée. Vous pouvez ajouter une limite à votre instruction de suppression pour contrôler les tailles de tx et indiquer le nombre de nœuds supprimés. Relancez cette instruction jusqu'à ce qu'une valeur de 0 soit renvoyée:
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
WITH n,r LIMIT 50000
DELETE n,r
RETURN count(n) as deletedNodesCount
Selon le document officiel ici :
MATCH (n)
DETACH DELETE n
mais il a également dit This query isn’t for deleting large amounts of data
. il vaut donc mieux utiliser avec limite.
match (n)
with n limit 10000
DETACH DELETE n;
A écrit ce petit script, l'a ajouté dans mon dossier NEO/bin.
Testé sur la communauté v3.0.6
#!/bin/sh
echo Stopping neo4j
./neo4j stop
echo Erasing ALL data
rm -rf ../data/databases/graph.db
./neo4j start
echo Done
Je l'utilise quand mes importations LOAD CSV sont de mauvaise qualité.
J'espère que ça aide
optional match (n)-[p:owner_real_estate_relation]->() with n,p LIMIT 1000 delete p
En exécution de test, 50000 relations supprimées, complétées après 589 ms.