递归遍历家谱的密码查询?

Cypher query to recursively traverse family tree?

使用 Cypher 查询图形数据库,我试图从起始节点沿着树向上走一段不确定的距离,并且 return 每个节点都有关于该节点关系的信息。

例如,以家谱为例:

我想从“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))

给我

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

你要的是匹配variable length relationships

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)) 

有多种打印树的方法,其中大部分依赖于@Vivick 描述的可变长度遍历。如果你想在自己的行上打印每个关系和 intermediate/leaf 节点,你可以这样做:

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 简洁地执行此任务;大多数图形数据库都有类似的实现。

最终通过与我的目标建立联系,然后使用 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. 和return节点的id、名称、关系集合和这些关系目标的集合

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