2013-02-04 3 views
11

Ho cercato per eseguire la query come raccomandato nel gruppo Neo4j Google e in altre fonti on-line:Eliminazione di tutti i nodi e le relazioni in Neo4j utilizzando cifra supera lo spazio di heap

AVVIO n = node (*) PARTITA n - [r?] -() WHERE ID (n)> 0 DELETE n, r;

per eliminare tutti i nodi e le relazioni tra i test. Quando lo faccio dalla console, esaurisco lo spazio dell'heap java. Quando faccio ciò da python (usando il newish graph_db.clear(), che appare usa la stessa query), ottengo un "SystemError: None" che, presumo, è lo stesso errore di java heap space. Ho un database con nodi 500k, solo 5k relazioni e 7M proprietà. Sono in esecuzione su un laptop Mac (10.6.8) con 8 GB di RAM usando neo4j-1.8.1. Immagino di essere un po 'sorpreso che cancellare i nodi (praticamente senza relazioni, quindi sottotitoli molto piccoli) superi lo spazio dell'heap java, ma sono piuttosto ingenuo su come funziona neo4j. Qualche suggerimento su come andare avanti è apprezzato. So che rm -rf nella directory dei dati e partire da zero funzionerà, ma ho pensato che potrebbe esserci una soluzione meno drastica.

[cross-postato a Neo4j gruppi google]

+0

Paging dopo un WITH è ancora più comodo e ragionevole: 'START n = node (*) MATCH n- [r?] -() CON n, r LIMIT 10000 DELETE n, r; ' –

+0

@MichaelHunger non dovrebbe essere:' START n = nodo (*) WITH n LIMIT 10000 MATCH n- [r?] -() DELETE n, r; '? – joewhite86

risposta

3

A partire da Neo4j 2.3.3, è stato introdotto un nuovo modo di rimuovere nodo e relazione. Vedi 2.3.3 Docs.

Per esempio, si potrebbe fare:

MATCH(n) DETACH DELETE n; 
+0

Questo funziona per piccoli set di dati, ma ha fatto esplodere il mio spazio Java Heap su un grande database – fiat

18

La dichiarazione di Cypher sopra fa sì che tutti i nodi (oltre il nodo principale con ID 0) creare un'istanza prima della cancellazione in una singola transazione. Questo consuma troppa memoria quando viene eseguita con nodi 500k.

cercare di limitare il numero di nodi per cancellare a qualcosa intorno a 10k-50k, come ad esempio:

START n = node(*) 
MATCH n-[r?]-() 
WHERE (ID(n)>0 AND ID(n)<10000) 
DELETE n, r; 

START n = node(*) 
MATCH n-[r?]-() 
WHERE (ID(n)>0 AND ID(n)<20000) 
DELETE n, r; 

ecc

Tuttavia, non c'è niente di sbagliato con la rimozione di tutta la directory del database, è bene pratica.

+1

Sì, +1 sulla rimozione della cartella del database. –

+0

Avrei dovuto pensare di limitare il numero di nodi nell'eliminazione. Grazie per il suggerimento. Chiaramente, però, la strada da percorrere sembra essere la rimozione della directory del database. – seandavi

+5

Il punto interrogativo non è più utilizzato per motivi opzionali. Nelle versioni recenti di Neo4j è necessario modificare la clausola di corrispondenza per: OPTIONAL MATCH n- [r] -() – IsidroGH

7

Il punto interrogativo non funziona più. Utilizza la corrispondenza facoltativa ... di seguito dovrebbe funzionare.

   START n = node(*) 
       OPTIONAL MATCH n-[r]-() 
       WHERE (ID(n)>0 AND ID(n)<10000) 
       DELETE n, r; 
+1

+1 per questo. otterrai un "Punto interrogativo non più utilizzato per motivi opzionali - usa OPTIONAL MATCH invece" nell'esempio sopra. –

9

Secondo la documentazione Neo4j, l'eliminazione di un isa grafico fatto attraverso:

MATCH (n) 
OPTIONAL MATCH (n)-[r]-() 
DELETE n,r; 

Per evitare l'errore spazio java heap, ho conbined questo codice con LIMIT:

MATCH (n) 
OPTIONAL MATCH (n)-[r]-() 
WITH n,r LIMIT 100000 DELETE n,r; 

Funziona per ridurre il numero di nodi e, infine, consente di utilizzare il primo codice, consigliato e più generale.

0

Si potrebbe aumentare lo spazio di heap nei vostri neo4j proprietà e abilitare il registro gc e guardare il sorgere lo spazio di heap se davvero vicino al limite superiore. La dimensione della cache della pagina deve essere ridotta o aumentata in base alla dimensione iniziale. ... ridurre/aumentare e controllare l'effetto sul tempo di caricamento. neo4j è affamato di memoria ... ha bisogno di una dimensione di heap più grande che puoi ottenere.