You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于D.name合并路径的Neo4j子图生成查询需求

问题:按D节点合并A到D的指定路径子图

现有图结构

(a1:A) -> (b1:B) -> (c1:C) -> (d1:D)
   \                          /
     - -> (x1:X) - -> (y1:Y)

(a2:A) -> (b2:B) -> (c2:C) -> (d2:D)

(a3:A) -> (x3:X) -> (y3:Y) -> (d3:D)

关注的路径规则

仅匹配以下两种A到D的路径:

match p1=((:A)-->(:B)-->(:C)->(:D))
return p1

match p2=((:A)-->(:X)-->(:Y)->(:D))
return p2

上述查询会返回4条路径:

a1-b1-c1-d1
a1-x1-y1-d1
a2-b2-c2-d2
a3-x3-y3-d3

期望结果

按D节点的name属性合并路径,每行对应一个子图,包含该子图中所有唯一节点和关系;同一D节点的多条路径需合并到同一个子图中,具体如下:

  • row1: 节点(a1, b1, c1, d1, x1, y1),关系(a1→b1, b1→c1, c1→d1, a1→x1, x1→y1, y1→d1)
  • row2: 节点(a2, b2, c2, d2),关系(a2→b2, b2→c2, c2→d2)
  • row3: 节点(a3, x3, y3, d3),关系(a3→x3, x3→y3, y3→d3)

测试数据构建语句

merge (a1:A{name: 'a1'})
merge (b1:B{name: 'b1'})
merge (c1:C{name: 'c1'})
merge (d1:D{name: 'd1'})
merge (x1:X{name: 'x1'})
merge (y1:Y{name: 'y1'})

merge (a2:A{name: 'a2'})
merge (b2:B{name: 'b2'})
merge (c2:C{name: 'c2'})
merge (d2:D{name: 'd2'})

merge (a3:A{name: 'a3'})
merge (x3:X{name: 'x3'})
merge (y3:Y{name: 'y3'})
merge (d3:D{name: 'd3'})

merge(a1)-[:TESTS]->(b1)
merge(b1)-[:TESTS]->(c1)
merge(c1)-[:TESTS]->(d1)
merge(a1)-[:TESTS]->(x1)
merge(x1)-[:TESTS]->(y1)
merge(y1)-[:TESTS]->(d1)

merge(a2)-[:TESTS]->(b2)
merge(b2)-[:TESTS]->(c2)
merge(c2)-[:TESTS]->(d2)

merge(a3)-[:TESTS]->(x3)
merge(x3)-[:TESTS]->(y3)
merge(y3)-[:TESTS]->(d3)

解决方案查询语句

// 匹配两种目标路径,同时提取路径的终点D节点
MATCH p = (:A)-[:TESTS*]->(:D)
WHERE 
  // 匹配A→B→C→D的路径
  (nodes(p)[0]:A AND nodes(p)[1]:B AND nodes(p)[2]:C AND nodes(p)[3]:D) OR
  // 匹配A→X→Y→D的路径
  (nodes(p)[0]:A AND nodes(p)[1]:X AND nodes(p)[2]:Y AND nodes(p)[3]:D)
WITH 
  last(nodes(p)) AS dNode,  // 取路径的D节点
  nodes(p) AS pathNodes,    // 提取当前路径的所有节点
  relationships(p) AS pathRels  // 提取当前路径的所有关系
// 按D节点的name分组,聚合所有节点和关系并去重
WITH 
  dNode.name AS dName,
  apoc.coll.toSet(flatten(collect(pathNodes))) AS subgraphNodes,
  apoc.coll.toSet(flatten(collect(pathRels))) AS subgraphRels
// 返回结果,可根据需求调整输出格式
RETURN 
  subgraphNodes,
  subgraphRels

逻辑说明

  1. 路径匹配:通过MATCH匹配A到D的路径,并用WHERE过滤出仅符合两种指定结构的路径(确保只保留A→B→C→D和A→X→Y→D这两类路径)。
  2. 分组聚合:按D节点的name属性分组,使用collect收集所有对应路径的节点和关系,再通过flatten扁平化集合,最后用apoc.coll.toSet去重,得到每个子图的唯一节点和关系集合。
  3. 结果返回:输出每个子图的节点集合和关系集合,每行对应一个D节点的合并子图。

注:该查询依赖APOC库的apoc.coll.toSet函数,如果你的Neo4j未安装APOC,也可以用DISTINCT结合UNWIND实现去重,替换聚合部分的语句如下:

WITH 
  dNode.name AS dName,
  collect(pathNodes) AS allNodes,
  collect(pathRels) AS allRels
UNWIND flatten(allNodes) AS node
WITH dName, COLLECT(DISTINCT node) AS subgraphNodes, allRels
UNWIND flatten(allRels) AS rel
WITH dName, subgraphNodes, COLLECT(DISTINCT rel) AS subgraphRels
RETURN subgraphNodes, subgraphRels

内容的提问来源于stack exchange,提问作者drdot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:15:46