我正在尝试在neo4j浏览器中显示网络。
我有一个节点为Person
的图表,有两种类型的关系MANAGED
和FRIENDS
。
鉴于身份'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
答案 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将返回行次数)。