2014-09-04 7 views
6

Ho le seguenti due tipi di nodi:Ottenere i nodi che non hanno certo rapporto (Cypher/Neo4j)

c:City {name: 'blah'} 
s:Course {title: 'whatever', city: 'New York'} 

Guardando per creare questa:

(s)-[:offered_in]->(c) 

Sto cercando di ottenere tutti i corsi che NON sono legati alle città e creano il rapporto con la città (la città viene creata se non esiste). Tuttavia, il problema è che il mio set di dati è di circa 5 milioni di nodi e qualsiasi query che faccio timeout (a meno che non lo faccia in incrementi di 10k).

... qualcuno ha qualche consiglio?

EDIT:

Ecco una domanda per i lavori sto correndo ora (che deve essere fatto in 10k pezzi (di milioni) perché ci vuole qualche minuto in quanto è crea città, se doesn. 't esiste):

match (j:Job) 
where not has(j.merged) and has(j.city) 
WITH j 
LIMIT 10000 
MERGE (c:City {name: j.city}) 
WITH j, c 
MERGE (j)-[:in]->(c) 
SET j.merged = 1 
return count(j) 

(per ora non sanno di un buon modo per filtrare quelle già abbinati, in modo da cercare di farlo contrassegnando con custom 'fuse' attributo che ho già un indice su)

+0

Puoi condividere ciò che stai attualmente cercando? – JohnMark13

+0

Non penso che questo possa essere risolto senza più contesto (e facendo corrispondere la tua domanda al tuo aggiornamento, presumo job == course e in == offered_in). Stai operando su dati esistenti o si tratta di un'importazione in blocco? Potresti dirci qualcosa sulla configurazione del tuo sistema? Invece di "unire" puoi usare WHERE NOT (j) - [: in] ->(). – JohnMark13

+0

Stai vedendo il timeout attraverso l'interfaccia del browser? –

risposta

2

500000 è una fiera f ew nodi e sulla tua altra domanda hai suggerito che il 90% era senza la relazione che vuoi creare qui, quindi ci vorrà un po 'di tempo. Senza una maggiore conoscenza del sistema (spec, impostazione neo, ambiente di programmazione), e quando si esegue questa (su vecchi dati o inserto) questa è solo un'ipotesi migliore a una soluzione più ordinato:

MATCH (j:Job) 
WHERE NOT (j)-[:IN]->() AND HAS(j.city) 
MERGE (c:City {name: j.city}) 
MERGE (j)-[:IN]->(c) 
return count(j) 

Ovviamente si può aggiungi i tuoi limiti indietro come richiesto.

+0

Sono 5.000.000 nodi. per qualche motivo la query che ho avuto (e questa) produce tonnellate di città duplicate ... Mi sono arreso e ho appena scritto uno script python per farlo manualmente in piccoli blocchi. ci vorrà per sempre, ma sembra mantenere l'unicità e fa ciò di cui ho bisogno. Su una nota correlata, ho provato a giocare anche con "CREATE UNIQUE" (dato che questo dovrebbe garantire l'unicità dei pezzi), ma continuava a dirmi "pattern non associato" o che non dovrebbe essere usato modo (o qualcosa del genere), quindi non ha mai funzionato. – Diaspar

+1

Quali indici hai definito e stavi utilizzando le due istruzioni di unione come sopra? Una fusione singola ('MERGE (j) - [: IN] -> (c: City {nome: j.city})') produrrebbe duplicati a causa del modello non associato non associato. Potresti aggiornare la tua domanda con ulteriori informazioni (cosa hai provato e cosa è fallito) in quanto dovrebbe essere possibile! – JohnMark13