2017-10-07 63 views
1

我想在neo4j浏览器中显示一个网络。如何返回节点相关的一组节点,但不是彼此

我有一个图,其中节点是Person,并且存在两种类型的关系MANAGEDFRIENDS

给出一个初始的人ID为'123'我可以找到所有他们递归管理的人,像这样

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

我想现在要做的是显示所有这些人,所有的管理的箭头,但此外,还会显示与managed人和friends箭头之间的关系为FRIENDS的所有人。但是我不想在managed中的人与managed中的其他人之间显示FRIENDS箭头,即使存在FRIENDS关系。

一些非功能性的伪代码可能是

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 

回答

0

您需要使用到付凝结的结果转换成列表,这样就可以在上面运行的过滤器。 (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 

你可以用悠闲地一些过滤器,以获得行回来,但这需要一些额外的工作,使返回的数据更大(因为,例如,对将要返回的时间的行数)。

相关问题