【问题标题】:Cypher Query - return nodes of a tier 2 relationship that are related to 2 or more indirect nodesCypher 查询 - 返回与 2 个或更多间接节点相关的第 2 层关系的节点
【发布时间】:2017-10-19 17:24:29
【问题描述】:

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

我正在尝试返回第二层节点与 2 个或更多第一层节点相关的所有节点,但仅返回第一层节点不同的节点。因此,在示例图片中,我想返回灰色节点 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 

这似乎确实有效,因为它过滤掉了只有一个链接到绿色节点的粉色节点,但是我不知道如何只返回相关绿色节点不是同一个节点的粉色节点

更新

当向 collect 添加一个 distinct 并完全删除 where 子句时,我得到一个完全不同的图表,但它实际上更接近我想要显示的

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

这是我的密码 - 我不确定为什么 collect(distinct 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

【问题讨论】:

  • 但在您的示例中,所有红色节点的绿色节点都相同,每个红色节点的两个关系都相同...无论如何,尝试在您的集合中放置一个不同的子句,这样:@ 987654327@
  • 问题的措辞与您真正想要的不符。
  • 问题中的红色节点实际上更像粉红色。让我们等待 OP 弄清楚这一点。
  • 为了清楚起见编辑了我原来的问题
  • “我不确定为什么 collect(distinct m) 在这种情况下不起作用?”它不起作用,因为您在 WITH 子句中留下了变量 r,因此它将分别聚合在每个 r 上。

标签: neo4j cypher


【解决方案1】:

collect (docs) 使用DISTINCT 关键字:

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

【讨论】:

  • 我相信您的解决方案是正确的答案。但是,在我看来,问题中提供的问题描述与描述的输出不匹配。你同意吗?
  • 我同意问题中的颜色是关闭的。
  • 就是这个!非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多