2017-09-14 2 views
1

Ich fange gerade mit Neo4j an und ich kämpfe ein bisschen auf dem folling Fall. In Anbetracht der zeigt dieses Diagramm:Neo4j cypher alle Knoten von Kindern zurückgeben

graph

Als „theo“ Ich will die Liste der anderen Benutzernamen zurückzukehren, die auch Glossare verwalten können. Wenn Sie Mitglied einer übergeordneten Gruppe sind, sollten Sie dieselben Berechtigungen wie Ihre Kinder erhalten.

Zum Beispiel sollten wir für "theo" Sara und Bob zurückgeben, da sara Mitglied von PoleManager ist, einem Elternteil der ProjectManager-Gruppe. Bob ist Mitglied der ProjectManager-Gruppe, die berechtigt ist, Glossare zu verwalten.

Bisher habe ich die folgende Abfrage aber nicht zurück sara als Kandidat:

MATCH (me:User{name:"theo"})-[:MEMBER_OF]->(g:Group), (g)-[:CAN_MANAGE]->(Asset{name:"Glossaries"}), (users:User)-[:MEMBER_OF]->(g) RETURN me.name AS Me, collect(users.name) AS Users UNION MATCH (me:User{name:"theo"})-[:MEMBER_OF]->(Group)<-[:CHILD_OF*]-(children:Group), (children)-[:CAN_MANAGE]->(Asset{name:"Glossaries"}), (users:User)-[:MEMBER_OF]->(children) RETURN me.name AS Me, collect(users.name) AS Users

Ich bin auch zu einem besseren Ideen offen diese Grafik darzustellen.

Antwort

1

Die zweite Hälfte der Abfrage ist fast richtig:

MATCH p = (me:User{name:$Me})-[:MEMBER_OF]->()<-[:CHILD_OF*0..]-()-[:CAN_MANAGE]->(:Asset{name:"Glossaries"}) 
UNWIND nodes(p)[1..-1] as group 
MATCH (users:User)-[:MEMBER_OF]->(group) 
RETURN $Me, collect(users.name) AS Users 

Wenn Sie aus dem fangen: User namens „theo“, dann sollte es genug sein, um die Namenseingabe zu parametrieren, und gibt den Namen Parameter in der RETURN, anstatt auf den Knoten zuzugreifen, wie oben.

Ich frage mich auch, ob die Übereinstimmung von Theo ist wirklich notwendig, da es scheint, wie alles, was Sie wollen, sind Benutzer, die Mitglieder von Gruppen sind, die Glossare verwalten können. Wenn ja, können Sie den Theo Teil aus der Abfrage entfernen:

MATCH (users)-[:MEMBER_OF]->(group)<-[:CHILD_OF*0..]-()-[:CAN_MANAGE]->(:Asset{name:"Glossaries"}) 
RETURN $name collect(users.name) AS Users 

Für diese, entfernte ich die Etiketten für Benutzer und Gruppen, aber Sie können dies nur tun, wenn Ihre Grafikstruktur ist ausreichend gut definiert, dass die Beziehungen, die hier vorhanden sind, können nur verbunden werden mit: Benutzer und: Gruppenknoten. Wenn durch diese Beziehungen auch andere Arten von Knoten verbunden werden können, müssen Sie die Bezeichnungen "Benutzer" und "Gruppe" wieder hinzufügen.

+0

Ich habe falsch die '[: CHILD_OF *]' wie ich, obwohl die '*' würden mit "0" übereinstimmen, aber es scheint es nicht :( –

+0

Eigentlich @InverseFalcon die erste Abfrage, die nützlich ist zu wissen " was sind die Benutzer Theo kann Glossare verwalten von "funktioniert nicht. Es gibt nur mir' [bob] '. Irgendeine Idee warum? –

+0

Ja, ein Fehler in meiner Abfrage. Ich habe es nur behoben, sehen, ob das für Sie arbeiten wird. – InverseFalcon

Verwandte Themen