2014-09-04 9 views
6

mam dwa następujące typy węzłów:Get węzły, które nie mają pewien związek (cypher/neo4j)

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

Patrząc do stworzenia tego:

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

próbuję dostać wszystkie kursy, które NIE są powiązane z miastami i tworzą związek z miastem (miasto powstaje, jeśli nie istnieje). Jednak problem polega na tym, że mój zbiór danych to około 5 milionów węzłów i każde zapytanie, które robię, przekracza limit czasu (chyba że robię to z przyrostem 10 000).

... ktoś ma jakieś rady?

EDIT:

Oto zapytanie do pracy używam teraz (to musi być zrobione w 10k kawałki (spośród milionów), ponieważ zajmuje kilka minut, jak to jest, gdy tworzy miasto nie robi. „t istnieje):

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) 

(na razie nie wiem o dobrym sposobem, aby odfiltrować te już dopasowane, więc stara się zrobić to oznaczając ją zwyczaju«połączone»atrybut, który mam już indeks on)

+0

Czy możesz podzielić się tym, czego aktualnie próbujesz? – JohnMark13

+0

Nie sądzę, aby można było odpowiedzieć na to pytanie bez większej ilości kontekstu (i dopasowania twojego pytania do aktualizacji, zakładam, że zadanie == kurs i w == Oferowane). Czy korzystasz z istniejących danych, czy jest to import zbiorczy? Czy możesz powiedzieć nam trochę o swojej konfiguracji systemu? Zamiast "scalonego" możesz użyć WHERE NOT (j) - [: in] ->(). – JohnMark13

+0

Czy widzisz limit czasu za pośrednictwem interfejsu przeglądarki? –

Odpowiedz

2

500000 jest godz ew innych węzłach i na twoje inne pytanie, które zasugerowałeś, że 90% było bez związku, który chcesz stworzyć tutaj, więc to zajmie trochę czasu. Bez większej wiedzy o systemie (SPEC, neo konfiguracji, środowisko programistyczne) i kiedy używasz tego (na starych danych lub na wkładce) jest to po prostu najlepszy przypuszczenie na porządniej rozwiązania:

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

Oczywiście można w razie potrzeby dodaj ograniczenia.

+0

To 500000 węzłów. z jakiegoś powodu zapytanie, które miałem (i ten) produkuje ton duplikatów miast ... Poddałem się i napisałem skrypt w języku Pythona, aby zrobić to ręcznie w małych porcjach. będzie trwało wiecznie, ale zdaje się utrzymywać wyjątkowość i robi to, czego potrzebuję. Na podobny temat próbowałem także grać z "CREATE UNIQUE" (ponieważ ma to gwarantować wyjątkowość kawałków), ale wciąż mówiło mi "niezwiązany wzór" lub że nie powinno się tego używać sposób (lub coś w tym stylu), więc nigdy tak nie działało. – Diaspar

+1

Jakie zdefiniowałeś indeksy i czy korzystałeś z dwóch powyższych instrukcji? Pojedyncze scalenie ('MERGE (j) - [: IN] -> (c: City {nazwa: j.city})') powodowałoby duplikaty ze względu na niedopasowany niezwiązany wzorzec. Czy mógłbyś zaktualizować swoje pytanie, dodając więcej informacji (co wypróbowałeś i czego nie udało się), ponieważ powinno to być całkiem możliwe! – JohnMark13

Powiązane problemy