1

使用 Cypher 查询图形数据库时,我试图从起始节点向上走一棵树的无限距离,并返回每个节点以及有关该节点关系的信息。

例如,以家谱为例:

在此处输入图像描述

我想从“James”(节点 id 4)开始,并得到一个响应,其中包含每个节点的行以及定义该节点关系的边缘数据。

如果我这样做:

MATCH (p:Person)<-[r:Related]-(p2:Person)
WHERE id(p)=4
RETURN p, r, p2

我明白了

在此处输入图像描述

为了摆脱重复的数据,我可以收集一些结果,例如:

MATCH (p:Person)<-[r:Related]-(p2:Person)
WHERE id(p)=4
RETURN id(p), p, collect(r.relationship), collect(id(p2))

给我

在此处输入图像描述

但我仍然只有初始节点。我如何扩展它以包含树上每个节点的这种格式(或类似格式)的行,包括叶节点?

4

3 回答 3

1

有多种打印树的方法,其中大多数依赖于@Vivick 描述的可变长度遍历。如果您想在自己的行上打印每个关系和中间/叶节点,您可以执行以下操作:

MATCH (p:Person)<-[r:Related*]-(p2:Person)
WHERE id(p)=4
WITH collect(r) AS rels, collect(p2) AS nodes
UNWIND rels AS rel UNWIND nodes 
AS node RETURN rel, node

您可能还想使用遍历算法来完成此操作。在 RedisGraph 中,这个任务可以用algo.BFS;简洁地执行。大多数图形数据库都有类似的实现。

于 2020-11-16T19:12:46.153 回答
0

你想要的是匹配可变长度关系

MATCH (p:Person)<-[r:Related*1..]-(p2:Person)
WHERE id(p)=4 AND id(p) <> id(p2)
RETURN id(p), p, collect(r.relationship), collect(id(p2)) 
于 2020-11-15T22:26:09.943 回答
0

最终通过将所有连接到我的目标,然后收集关系信息来完成它optional match

match (p:Person)<-[*0..]-(p2) 
where id(p)=0
optional match (p2)<-[r]-(p3)
return id(p2), p2.name, collect(r.relationship), collect(id(p3))

这个查询将(我认为......仍在解决这个问题):

  1. 让所有节点以任意距离连接
  2. 到我的目标节点。
  3. 可以选择寻找每个人的关系
  4. 并返回节点的 id、名称和关系集合以及这些关系目标的集合

这给了我一个很好的结果,每个节点只有一行,我需要关于该节点的所有信息以及该节点与其他节点的关系。

在此处输入图像描述

于 2020-11-21T19:24:06.873 回答