如何返回与一组节点相关但不与彼此相关的节点

时间:2017-10-07 03:55:07

标签: neo4j cypher graph-databases

我正在尝试在neo4j浏览器中显示网络。

我有一个节点为Person的图表,有两种类型的关系MANAGEDFRIENDS

鉴于身份'123'的初始人,我可以找到由他们递归管理的所有人,如此

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

我现在要做的是显示所有这些人和所有管理箭头,此外,显示与FRIENDS人和{managed人有friends关系的所有人{1}}箭头。但是,即使存在FRIENDS关系,我也不希望managed中的人与managed中的其他人之间显示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

1 个答案:

答案 0 :(得分:0)

您需要使用COLLECT将结果压缩到列表中,以便您可以对它们运行FILTER。 (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

您可以使用UNWIND和一些过滤器来获取行,但这将需要一些额外的工作并使返回数据更大(因为,例如,p将返回行次数)。