2015-07-26 27 views
7

Pytam o bazę danych Neo4j, która przechowuje drabinki podłogowe. Przykładem zapytania jest:Ograniczająca liczba węzłów

MATCH (s:STOREYVERTEX) <-- (room0: LIVING) 
MATCH (s) <-- (room1: DINING) 
MATCH (s) <-- (room2: KITCHEN) 
MATCH (room0) - [edge0: DOOR] -> (room2) 
MATCH (room2) - [edge1: DOOR] -> (room1) 
RETURN s 

Teraz to zwraca wszystkie wykresy, które mają subgraph odpowiadający ograniczeniom. Chciałbym w jakiś sposób ograniczyć liczbę węzłów, które ma wykres wyników, więc dla danego przykładu chciałbym uzyskać tylko wykresy, które mają dokładnie 3 węzły, wszystkie typu ROOM.

Czy istnieje sposób, aby to zrobić w Cypher?

Edit: Coś jak to nie działa:

MATCH (s:STOREYVERTEX) <-- (rooms:ROOM) 
WITH s, count(distinct(rooms)) as numberOfRooms 
WHERE numberOfRooms = 3 
MATCH (s) <-- (room1: DINING) 
MATCH (s) <-- (room2: KITCHEN) 
MATCH (room0) - [edge0: DOOR] -> (room2) 
MATCH (room2) - [edge1: DOOR] -> (room1) 
RETURN s 
+0

spróbuj użyć semantycznie sensowne typy relacji w zapytaniu. –

+0

Czy teraz jest w porządku? – Banana

Odpowiedz

0

Co ostatecznie rozwiązać mój problem był następujący:

MATCH (s:STOREYVERTEX) <-- (rooms) 
WITH s, count(distinct(rooms)) as numberOfRooms 
WHERE numberOfRooms = 3 
MATCH (s) <-- (room1: KITCHEN) 
MATCH (s) <-- (room2: DINING) 
RETURN s 
3

Tak, można to zrobić w następujący sposób:

MATCH (s:STOREYVERTEX) <-- (rooms:ROOM) 
WITH s, count(distinct(rooms)) as numberOfRooms 
WHERE numberOfRooms = 3 
RETURN s; 

To właśnie sprawdza ile odrębne różne pokoje są podłączone do STOREYVERTEX i zwraca tylko wartości s, gdzie wynosi 3.

Nie określono, co to jest DOOR st uff było w twoim zapytaniu, ale powinieneś być w stanie zmodyfikować to zapytanie stąd, aby dostać się tam, gdzie chcesz iść.

+0

Tak, właśnie skopiowałem całe zapytanie z mojej aplikacji, ale w tym konkretnym pytaniu DOOR nie jest tak naprawdę trafny. Wielkie dzięki! :) – Banana

+0

Hmm, po namyśle, nie jestem pewien, czy to rozwiązanie dla mnie. Nie wszystkie węzły to POKOJE. Trochę zmieniłem zapytanie w pytaniu - czy w takim zapytaniu wciąż można ograniczyć wyniki tylko do wykresu z trzema węzłami, niezależnie od ich typu? – Banana

+0

Wystarczy usunąć etykietę ROOM. – FrobberOfBits

1

Najpierw możesz oznaczyć wszystkie pokoje jako ROOM. Więc podczas tworzenia nowego, na przykład węzeł kuchenny byś go oznaczyć zarówno kuchnia i pokój:

CREATE (a:KITCHEN:ROOM {...}) 

Teraz można dodać etykiety do istniejących węzłów tak:

MATCH (room:Kitchen) SET room :ROOM return room 

Congratz, teraz wszystkie twoje kuchenne węzły to także węzły pokojowe!

Pozwala to traktować ten węzeł jako kuchnię, gdy potrzebujesz kuchni lub jako ogólnego pokoju, kiedy jest to potrzebne. Jeśli tak, że dla wszystkich istotnych węzłów (dzienny, wyżywienia, ...) można wtedy zrobić coś takiego:

MATCH (s:STOREYVERTEX)-[r]-(room: ROOM) 
    WITH s, count(r) as rel_count 
    WHERE rel_count = 3 
    RETURN s 

będzie to powrót węzły „s” z 3 relacji (nie ważne jaki typ rel is) do dowolnego węzła z etykietą ROOM.