在Neo4j中递归查找指定节点的所有父节点直至ROOT节点
Cypher查询:递归查找节点至ROOT根节点的所有父节点
要实现给定节点X,递归向上遍历所有父节点直到找到type属性为ROOT的根节点(父层级最多10层),可以用Cypher的可变长度路径匹配来实现,以下是具体方案:
核心查询模板
MATCH path = (target)-[:PARENT*1..10]->(root) WHERE target.<标识属性> = '<目标节点值>' AND root.type = 'ROOT' UNWIND nodes(path)[1..-1] AS parentNode RETURN DISTINCT parentNode
关键部分说明
(target)-[:PARENT*1..10]->(root):匹配从目标节点到ROOT节点的父路径,*1..10限定路径长度为1到10,对应最多10层父节点nodes(path)[1..-1]:提取路径中除目标节点和ROOT节点外的所有父节点,若需要包含ROOT节点,可去掉..-1UNWIND+DISTINCT:处理图中存在环时可能出现的重复父节点
示例验证
示例1:查找标签为TYPE2:X3的节点父节点
假设节点用label和name作为标识,查询语句:
MATCH path = (target:TYPE2 {name: 'X3'})-[:PARENT*1..10]->(root) WHERE root.type = 'ROOT' UNWIND nodes(path)[1..-1] AS parentNode RETURN parentNode.label + ':' + parentNode.name AS parent
返回结果:
parent ------- TYPE1:T1 TYPE2:X1
示例2:查找TYPE2:X4的节点父节点
查询语句:
MATCH path = (target:TYPE2 {name: 'X4'})-[:PARENT*1..10]->(root) WHERE root.type = 'ROOT' UNWIND nodes(path)[1..-1] AS parentNode RETURN parentNode.label + ':' + parentNode.name AS parent
返回结果:
parent ------- TYPE1:T1 TYPE2:X1 TYPE2:X2 TYPE1:T2
内容的提问来源于stack exchange,提问作者utkarsh31
相关产品推荐
相关产品推荐

