【问题标题】:Cypher Query: Related Nodes Distinct密码查询:相关节点不同
【发布时间】:2019-11-06 15:28:04
【问题描述】:

我正在尝试编写一个查询以返回与“IMMEDIATE_FAMILY_MEMBER”相关的所有相关节点

这是我目前的查询

MATCH (f:NaturalPerson)-[r:IMMEDIATE_FAMILY_MEMBER*1..6]-(t)
WHERE f.Name="Jacob"
RETURN f AS fromNode, t AS toNode, r AS Metadata

最初我认为它工作得很好,但是一旦我添加了孩子 Thuthukile(父母 Jacob 和 Nkosazana),我就会得到“重复”的结果。

此时查询将返回一对相关节点和所有被遍历以将它们链接在一起的关系(即元数据)。

如何更改此查询,以便返回一对不同的节点,它们之间具有最短路径(所有关系)。

作为一个额外的问题,是否可以为关系本身的标签指定一个或。即,相同的查询但还包括 :KNOWS 关系

编辑:

cybersams 的回答是正确的,我做了一个小改动来得到我想要的结果。

我的最终查询是这样的

MATCH (f:NaturalPerson)-[r:IMMEDIATE_FAMILY_MEMBER*..6]-(t)
WHERE f.Name="Jacob" AND t.Name<>"Jacob"
WITH f, t, r
ORDER BY SIZE(r)
RETURN f AS fromNode, t AS toNode, COLLECT(r)[0] AS Metadata

我需要排除“来自人”作为目的地,因为我对返回父级的最短路径不感兴趣

【问题讨论】:

  • 您得到了“重复”的结果,因为您的查询实际上是从 Jacob 请求最多 6 个跃点的所有不同路径。以 Thuthkile 为例,Jacob 有两条不同的路径,JacobThuthkile。
  • 谢谢@Lju,我直观地理解了我只是不明白如何使用collect来解决问题的部分

标签: neo4j cypher


【解决方案1】:

旁白:为什么是NaturalPerson?数据库中是否也有“不自然”的人?

这应该可行:

MATCH (f:NaturalPerson)-[r:IMMEDIATE_FAMILY_MEMBER*..6]-(t)
WHERE f.Name="Jacob"
WITH f, t, r
ORDER BY SIZE(r)
RETURN f AS fromNode, t AS toNode, COLLECT(r)[0] AS Metadata

查询按找到的路径的长度排序,使用aggregating function COLLECT 获取给定一对ft 值的所有r 路径的列表,并使用每个列表中的第一个(即最短的)路径。

【讨论】:

  • 谢谢,现在我必须通过 Neo4jClient 来解决这个问题 :) BTW NaturalPerson 在系统中具有意义,它是分配给法人实体的术语 (en.wikipedia.org/wiki/Natural_person)
  • 知道我现在如何让这个查询遵循一组允许的关系。即相同的查询但也允许它通过“CLOSE_ASSOCIATE”和“IMMEDIATE_FAMILY_MEMBER”而不是“BUSINESS_ASSOCIATE”链接节点?
猜你喜欢
  • 1970-01-01
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多