Neo4J技术问询:如何查找从起始节点到首个指定标签节点的所有路径
解决从指定节点出发到首个目标标签节点的路径查询问题
需求回顾
从标签为A的节点A1出发,遍历所有路径,当遇到首个标签为A的节点时停止遍历,返回这些完整路径。示例连接关系:
A1>B1>B2>A2>B6>A6
A1>A4>A5
A1>B3>A3>B8>A7
预期输出:
A1>B1>B2>A2
A1>A4
A1>B3>A3
解决方案(Neo4j Cypher 查询)
1. 导入示例测试数据(可选)
执行以下Cypher语句创建示例节点和关系:
// 创建节点 CREATE (a1:A {name: 'A1'}), (b1:B {name: 'B1'}), (b2:B {name: 'B2'}), (a2:A {name: 'A2'}), (b6:B {name: 'B6'}), (a6:A {name: 'A6'}), (a4:A {name: 'A4'}), (a5:A {name: 'A5'}), (b3:B {name: 'B3'}), (a3:A {name: 'A3'}), (b8:B {name: 'B8'}), (a7:A {name: 'A7'}); // 创建关系 CREATE (a1)-[:NEXT]->(b1), (b1)-[:NEXT]->(b2), (b2)-[:NEXT]->(a2), (a2)-[:NEXT]->(b6), (b6)-[:NEXT]->(a6), (a1)-[:NEXT]->(a4), (a4)-[:NEXT]->(a5), (a1)-[:NEXT]->(b3), (b3)-[:NEXT]->(a3), (a3)-[:NEXT]->(b8), (b8)-[:NEXT]->(a7);
2. 核心查询语句
执行以下Cypher查询,直接返回符合要求的路径字符串:
MATCH path = (start:A {name: 'A1'})-[:*]->(end:A) // 确保路径中间节点均为B标签,无其他A节点 WHERE ALL(node IN nodes(path)[1..-1] WHERE node:B) // 确保终点是路径中第一个非起点的A节点,排除后续延伸的A节点路径 AND NOT EXISTS( (start)-[:*]->(middle:A)-[:*]->(end) WHERE middle <> start AND middle <> end ) // 将路径节点拼接为指定格式的字符串 RETURN reduce(str = start.name, node IN nodes(path)[1..] | str + '>' + node.name) AS path
查询逻辑说明
MATCH path = (start:A {name: 'A1'})-[:*]->(end:A):匹配从A1到任意A标签节点的所有路径。ALL(node IN nodes(path)[1..-1] WHERE node:B):过滤掉路径中间包含A标签节点的情况,保证起点和终点之间只有B节点。NOT EXISTS(...):确保不存在介于起点和终点之间的其他A节点,保证终点是路径中遇到的第一个A节点(除起点外)。reduce(...):将路径中的节点名称拼接为节点1>节点2>...的字符串格式,匹配预期输出样式。
测试结果
执行上述查询后,将返回预期的三条路径:
A1>B1>B2>A2 A1>A4 A1>B3>A3
内容的提问来源于stack exchange,提问作者Moaz
相关产品推荐
相关产品推荐

