2017-03-24 2 views
1

Je commence avec Neo4j et essaye de regrouper des nœuds qui ont des relations les uns avec les autres.Neo4j - Nœuds de groupe basés sur des relations

L'ensemble de données est la suivante:

create (user1 {name:'user1'}), (user2 {name:'user2'}), (user3 {name:'user3'}), (user4 {name:'user4'}), (user5 {name:'user5'}), (user6 {name:'user6'}), 
(user1)-[:SHARE_WITH]->(user2), 
(user1)-[:SHARE_WITH]->(user3), 
(user1)-[:SHARE_WITH]->(user4), 
(user2)-[:SHARE_WITH]->(user4), 
(user5)-[:SHARE_WITH]->(user6) 

Le résultat que je vise:

group1: [user1, user2, user3, user4] 
group2: [user5, user6] 

Le meilleur que je suis en mesure de le faire jusqu'à présent est

MATCH (s)-[:SHARE_WITH]->(d) RETURN s.name, collect(d.name) 

Qui renvoie

user1 [user4, user3, user2] 
user2 [user4] 
user5 [user6] 

Toute aide appréciée :)

+0

qu'est-ce MATCH (s) - [: SHARE_WITH] - (d) RETOUR s.name, recueillir (d.name) retour? – binariedMe

+0

@binariedMe, cela retourne toutes les relations indépendamment de la direction, mais la sortie n'est pas plus utile pour moi. Merci quand même – nicobrsc

Répondre

3

En théorie des graphes, ces sous-ensembles de noeuds sont appelés Clique: every two distinct vertices in the clique are adjacent. Et le chiffrement pour trouver de tels sous-ensembles est inefficace.

Mais vous pouvez utiliser la procédure apoc.algo.cliques de la bibliothèque des procédures et des fonctions utilisateur appelé APOC:

CALL apoc.algo.cliques(2) YIELD clique 
RETURN EXTRACT(n in clique | n.name) 
+0

Merci @ stdob--, cela aide définitivement. Il renvoie cependant des cliques séparées pour '[user1, user2, user4]' et '[user1, user3]'. Je serai probablement capable de l'utiliser pour obtenir ce que je veux, mais avez-vous d'autres suggestions pour agréger ces cliques en utilisant seulement cypher/apoc/...? – nicobrsc