2017-09-14 2 views
1

Je débute avec Neo4j et je me bats un peu sur le cas. Étant donné le graphique suivant:Chiffre Neo4j pour retourner tous les noeuds des enfants

graph

Comme « theo », je veux retourner la liste des autres noms d'utilisateurs qui peuvent également gérer glossaires. Être membre d'un groupe parent devrait vous donner accès aux mêmes autorisations que vos enfants. Par exemple, pour "theo", nous devrions retourner sara et bob car sara est membre de PoleManager qui est un parent du groupe ProjectManager. Bob est membre du groupe ProjectManager qui a l'autorisation de gérer les glossaires.

Jusqu'à présent, j'ai la requête suivante mais il ne retourne pas sara comme candidat:

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

Je suis aussi ouvert à de meilleures idées pour représenter ce graphique.

Répondre

1

La seconde moitié de la requête est presque droite:

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 

Si vous commencez à partir du: Utilisateur nommé « theo », alors il devrait être suffisant pour paramétrer l'entrée du nom, et retourne le nom paramètre dans le retour au lieu d'y accéder sur le nœud, comme ci-dessus.

Je me demande également si la correspondance de Theo est vraiment nécessaire, car il semble que tout ce que vous voulez, ce sont des utilisateurs membres de groupes qui peuvent gérer des glossaires. Si oui, vous pouvez enlever la partie Theo de votre recherche:

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

Pour celui-ci, je l'ai enlevé les étiquettes pour les utilisateurs et le groupe, mais vous ne pouvez le faire si votre structure graphique est assez bien défini que la Les relations présentes ici ne peuvent se connecter qu'à: Utilisateur et: Nœuds de groupe. Si d'autres types de nœuds peuvent également être connectés par ces relations, vous devez ajouter les étiquettes: Utilisateur et: Groupe.

+0

Je me suis trompé le '[: CHILD_OF *]' comme je si le '*' correspondrait '0' aussi bien mais il semble qu'il ne fait pas :( –

+0

En fait @InverseFalcon la première requête, qui est utile de savoir" quels sont les utilisateurs Theo peut gérer les glossaires de "ne fonctionne pas.Il me renvoie seulement [bob]'. Une idée pourquoi? –

+0

Yep, une faille dans ma requête.Je viens de le réparer, voir si cela va fonctionner pour vous. – InverseFalcon