如何通过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
相关产品推荐
相关产品推荐

