2015-07-26 13 views
7

Ich frage eine Neo4j-Datenbank ab, die Gebäude-Floorpans speichert. Ein Beispiel für eine Abfrage ist:Begrenzte Anzahl der Knoten

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 

Nun ist diese alle Graphen zurückgibt, die einen Untergraphen entsprechend den Einschränkungen haben. Ich möchte irgendwie die Anzahl der Knoten begrenzen, die das Ergebnisdiagramm hat, also möchte ich für das gegebene Beispiel nur die Graphen erhalten, die genau 3 Knoten haben, alle vom Typ ROOM.

Gibt es eine Möglichkeit, dies in Cypher zu tun?

Edit: So etwas funktioniert nicht:

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

bitte semantisch sinnvolle Beziehung-Typen in Ihrer Abfrage zu verwenden versuchen. –

+0

Ist es jetzt in Ordnung? – Banana

Antwort

0

Was schließlich mein Problem gelöst war:

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

Ja, können Sie das tun, wie folgt aus:

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

Dieses nur überprüft, wie viele verschiedene verschiedenen Räumen eine verbunden sind STOREYVERTEX, und gibt nur die s Werte zurück, wo das ist 3.

Sie haben nicht angegeben, was die DOOR st In deiner Anfrage ging es um uff, aber du solltest in der Lage sein, diese Abfrage von hier aus zu ändern, um dorthin zu gelangen, wo du hin willst.

+0

Ja, ich habe nur die ganze Abfrage von meiner App kopiert, aber in dieser speziellen Frage ist DOOR nicht wirklich relevant. Vielen Dank! :) – Banana

+0

Hmm, auf den zweiten Gedanken, ich bin mir nicht sicher, dass dies eine Lösung für mich ist. Nicht alle Knoten sind ROOMs. Ich habe die Abfrage ein wenig in der Frage bearbeitet - ist es in einer solchen Abfrage noch möglich, die Ergebnisse so zu beschränken, dass sie nur mit 3 Knoten grafisch dargestellt werden, unabhängig von ihrem Typ? – Banana

+0

Entfernen Sie einfach die ROOM-Beschriftung. – FrobberOfBits

1

Zuerst könnten Sie alle Räume als, gut, ROOM bezeichnen. Also, wenn Sie ein neues erstellen, zum Beispiel Küchen Knoten würden Sie es bezeichnen sowohl Küche und Zimmer:

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

Vorerst Sie die Etiketten an den vorhandenen Knoten wie folgt hinzufügen:

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

Congratz, jetzt sind alle deine Küchenknoten auch Raumknoten!

Damit können Sie diesen Knoten als Küche behandeln, wenn Sie Küchen benötigen, oder als allgemeiner Raum, wenn Sie diese benötigen. Wenn Sie das tun, für relevante alle Knoten (Wohnzimmer, Esszimmer, ...) Sie dann wie etwas tun könnten:

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

Dies wird der Knoten zurückkehrt ‚s‘ mit 3 Beziehungen (egal, was der rel Typ ist) an jeden Knoten mit der Bezeichnung ROOM.

Verwandte Themen