密码查询:相关节点不同

时间:2019-11-06 15:28:04

标签: neo4j cypher

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

Graph

这是我到目前为止的查询

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

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

1 个答案:

答案 0 :(得分: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获取给定r对的所有f路径的列表,并t值,并使用每个列表中的第一个(即最短的)路径。