Cypher Query - 返回与2个或更多间接节点

时间:2017-10-19 17:24:30

标签: neo4j cypher

不确定如何最好地说出这一点 - 在下图中

neo

我试图返回第二层节点与第一层节点中的两个或更多节点相关的所有节点,但仅返回第一层节点不同的节点。因此,在示例图片中,我想要返回灰色节点660082,绿色节点110258以及所有粉红色节点&与之相关的关系。例如,我不想看到粉红色节点与同一个绿色节点有2个关系的绿色节点。到目前为止,我的密码看起来像这样

MATCH (i:IFB_Flagged)-[r]->(m:Matters)<-[r2]-(ie:Indirect_Entity)
WITH i, ie,r, collect(m) AS overlap 
WHERE size(overlap) > 1 and i.id = '660082'
RETURN i, ie, overlap 

这看起来有效,因为它过滤掉只有一个绿色节点链接的粉红色节点,但我无法弄清楚如何仅返回相关绿色节点不是同一节点的粉红色节点< / p>

更新

在收集和添加时添加一个独特的完全删除where子句我得到一个完全不同的图表,但它实际上更接近我想要展示的neo2

我仍然希望看到与多个绿色节点相关的所有粉红色节点 - 但是我不希望看到仅与一个绿色节点相关的粉红色节点(屏幕左下角的6个粉红色节点)

这是我的Cypher - 我不确定为什么收集(不同的m)在这种情况下不起作用?

MATCH (i:IFB_Flagged)-[r]->(m:Matters)<-[r2]-(ie:Indirect_Entity) 
WITH i, ie,r, collect(distinct m) AS overlap 
WHERE i.id = '385886' 
RETURN i, ie, overlap limit 20

1 个答案:

答案 0 :(得分:2)

使用DISTINCTdocs)的collect关键字:

  

DISTINCT运算符与聚合一起使用。它用于在通过聚合函数运行它们之前使所有值唯一。

此外,您可以在id子句中移动MATCH的检查以简洁。

更新。试试这个。

MATCH (i:IFB_Flagged)-[r]->(m:Matters)<-[r2]-(ie:Indirect_Entity) 
WHERE i.id = '385886'
WITH i, ie, collect(distinct m) AS overlap 
WHERE size(overlap) > 1
RETURN i, ie, overlap
LIMIT 20