Neo4j家族树递归查询如何同时获取节点及关联ParentChild关系
Neo4j家族树查询保留关联关系的修改方案
你现有查询只返回路径两端节点的原因是没有捕获完整匹配路径,仅提取了首尾的ancestor和desc节点,修改方式有以下几种,可按你的使用习惯选择:
方案1:直接返回完整匹配路径(最简单)
直接将匹配到的整条路径作为返回值,路径对象天然包含该路径上的所有节点和节点间的ParentChild关系:
MATCH path = (ancestor:Person {name: '<persons name>'})-[:ParentChild*1..]->(desc:Person) RETURN path
你可以从返回的path对象中直接调用nodes()方法获取所有人员节点,调用relationships()方法获取所有关联关系。
方案2:返回类关系型结构的父子对(适配你的关系数据库开发习惯)
如果需要和你之前用parent_id关联的逻辑对齐,可以把所有父子关系展开为行级结果,每一行对应一组父子关联:
MATCH path = (ancestor:Person {name: '<persons name>'})-[:ParentChild*1..]->(desc:Person) UNWIND relationships(path) AS rel WITH DISTINCT rel, startNode(rel) AS parent, endNode(rel) AS child RETURN parent.id AS parent_id, parent AS parent_info, child.id AS child_id, child AS child_info
你可以直接遍历返回结果,给每个人员对象设置parent_id属性,后续的遍历逻辑和你之前在关系型数据库中的实现完全一致。
方案3:一次性返回全量节点和全量关系集合
如果需要一次性拿到所有涉及的人员和所有关联关系两个独立集合,可以用下面的写法:
MATCH path = (ancestor:Person {name: '<persons name>'})-[:ParentChild*1..]->(desc:Person) // 提取所有去重人员节点 UNWIND nodes(path) AS person WITH collect(DISTINCT person) AS all_persons, path // 提取所有去重关联关系 UNWIND relationships(path) AS rel WITH all_persons, collect(DISTINCT rel) AS all_relations RETURN all_persons, all_relations
返回结果中all_persons是包含起始祖先和所有后代的全量人员列表,all_relations是这些人员之间所有的ParentChild关系列表,你可以基于这两个集合自行构建关联结构。
内容的提问来源于stack exchange,提问作者Will Harrison
相关产品推荐
相关产品推荐

