2017-10-07 7 views
1

J'essaie d'afficher un réseau dans le navigateur neo4j. J'ai un graphique où les noeuds sont Person et il y a deux types de relations MANAGED et FRIENDS.Comment retourner des nœuds liés à un ensemble de nœuds mais pas les uns aux autres

Étant donné une personne initiale avec id '123' je peux trouver toutes les personnes récursive gérées par eux, comme si

MATCH (p:Person { person_id:"123" })-[r:MANAGES *0..100]->(managed:Person) 
RETURN managed,r 

Ce que je veux faire est maintenant pour afficher toutes ces personnes et tous les géré flèches mais en plus, afficher toutes les personnes qui ont une relation FRIENDS avec les personnes managed et les flèches friends. Cependant, je ne veux pas montrer la flèche FRIENDS entre les personnes dans managed à d'autres personnes dans managed même s'il existe une relation FRIENDS.

Certains pseudo-code non fonctionnel pourrait être

MATCH (p:Person { person_id:"123" })-[m:MANAGES *0..100]->(managed:Person)-[f:FRIENDS]-(friend:Person) 
RETURN managed,m, f if friend not in managed, friend if friend not in managed 

Répondre

0

Vous devez utiliser COLLECT pour condenser vos résultats dans les listes afin que vous pouvez exécuter un filtre sur eux. (functions)

MATCH (p:Person { person_id:"123" })-[m:MANAGES *0..100]->(managed:Person)-[f:FRIENDS]-(friend:Person) 
// m is already a list because *..100, so need to unpack it to consolidate repeated values 
UNWIND m as ms 
WITH COLLECT(DISTINCT p) as p, COLLECT(DISTINCT ms) as m, COLLECT(DISTINCT managed) as managed, COLLECT(DISTINCT f) as f, COLLECT(DISTINCT friend) as friend 
RETURN managed, m, FILTER(r in f WHERE NOT r in m) as f, FILTER(n in friend WHERE NOT n in managed) as friend 

Vous pouvez utiliser UNWIND avec des filtres pour obtenir les lignes arrière, mais cela prendra un peu de travail supplémentaire et rendre les données de retour plus (parce que, par exemple, p sera retourné numéro de ligne de temps).