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

如何通过Neo4j .NET Driver获取根节点n跳的节点及关系?

如何查询Neo4j根节点指定跳数范围内的节点及关联关系?

我需要查询Neo4j图中根节点指定跳数范围内的节点及其之间的关系,目前用apoc.neighbors.byhop能获取节点,但拿不到节点间的关系信息。

举个例子,我有如下图结构:

merge (p1:Person {label:"A"})
merge (p2:Person {label:"B1"})
merge (p3:Person {label:"B2"})
merge (p4:Person {label:"C"})
merge (p1)-[:Knows]->(p2)
merge (p1)-[:Knows]->(p3)
merge (p2)-[:Knows]->(p4)

我想获取从A出发,3跳范围内的节点及路径(比如A→B1→C、A→B2这些路径),但之前用的查询只能返回节点:

match (p:Person {label:"A"})
call apoc.neighbors.byhop(p, "Knows", 3) 
yield nodes 
return nodes

返回结果只有节点,没有关系:

[
   [
      {
         "identity":11,
         "labels":[
            "Person"
         ],
         "properties":{
            "label":"B1"
         }
      },
      {
         "identity":12,
         "labels":[
            "Person"
         ],
         "properties":{
            "label":"B2"
         }
      }
   ],
   [
      {
         "identity":0,
         "labels":[
            "Person"
         ],
         "properties":{
            "label":"C"
         }
      }
   ]
]

我是通过Neo4j的.NET Driver进行交互的,请问该怎么修改查询,才能拿到包含关系的路径信息?


解决方案

方法1:使用APOC路径扩展函数获取完整路径

apoc.neighbors.byhop仅返回节点集合,若需路径和关系,可使用apoc.path.expandConfig获取指定跳数内的所有路径:

MATCH (p:Person {label:"A"})
CALL apoc.path.expandConfig(p, {
  relationshipFilter: "Knows>",
  maxLevel: 3,
  bfs: true
}) YIELD path
RETURN path

如果需要按跳数分组展示路径,可结合length(path)实现:

MATCH (p:Person {label:"A"})
CALL apoc.path.expandConfig(p, {
  relationshipFilter: "Knows>",
  maxLevel: 3,
  bfs: true
}) YIELD path
RETURN length(path) AS hopCount, collect(path) AS paths

方法2:使用原生Cypher匹配路径

无需依赖APOC的话,直接用原生Cypher的可变长度关系匹配即可:

MATCH path = (p:Person {label:"A"})-[:Knows*1..3]->()
RETURN path

同样支持按跳数分组:

MATCH path = (p:Person {label:"A"})-[:Knows*1..3]->()
RETURN length(path) AS hopCount, collect(path) AS paths

.NET Driver中解析结果

通过.NET Driver获取路径后,可将IPath对象解析为节点和关系集合:

var result = await session.RunAsync(@"
    MATCH path = (p:Person {label:""A""})-[:Knows*1..3]->()
    RETURN path
");

await foreach (var record in result)
{
    var path = record["path"].As<IPath>();
    var nodes = path.Nodes.Select(n => n.Properties);
    var relationships = path.Relationships.Select(r => new { r.Type, r.Properties });
    // 自定义节点和关系的处理逻辑
}

内容的提问来源于stack exchange,提问作者Dr. Strangelove

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:24:32