1. 定义
搜素子图的过程使用与路径扩展类似的方法从指定节点出发、沿着特定关系类型遍历,并返回能够到达的所有节点和关系。
APOC提供两种搜素子图的过程:
- subgraphNodes():仅返回可以到达的节点;
- subgraphAll():返回节点和关系。
与路径扩展过程expand和expandConfig不同的是,上述两个过程不返回所有的路径。
2. 应用
搜索子图的过程不会遍历所有可能的路径(即节点和边的所有可能序列),因此在执行效率和成本方面都优于路径扩展过程。适用的场景包括:
-
寻找节点的k-度邻居(k-nearest neighbours);
-
判断节点之间是否连通;
-
对图进行划分子图的操作。
3. 过程调用接口
subgraphNodes()和subgraphAll()的调用接口完全一样,唯一的区别是返回结果不一样:subgraphNodes()返回节点列表,而subgraphAll()返回节点和关系列表。
- 示例
// 3.5(1) 搜索子图,从“蜀汉”节点出发寻找2-度邻居。
// 参数:- startNode:代表“蜀汉”的节点
// - relationshipFilter: NULL
// - labelFilter: NULL
// - maxLevel: 2,遍历直到返回能够到达的所有的节点
// 返回结果:10个节点
MATCH (n:朝代{name:‘蜀汉’})
CALL apoc.path.subgraphNodes(n,
{ relationshipFilter: NULL,
labelFilter: NULL,
maxLevel: 2})
YIELD node
RETURN node
// 3.5(2) 搜索子图,从“蜀汉”节点出发寻找2-度邻居。
// 参数:- startNode:代表“蜀汉”的节点
// - relationshipFilter: NULL
// - labelFilter: NULL
// - maxLevel: 2,遍历直到返回能够到达的所有的节点和关系
// 返回结果:10个节点、12个关系,提取关系的开始和结束节点
MATCH (n:朝代{name:‘蜀汉’})
CALL apoc.path.subgraphAll(n,
{ relationshipFilter: NULL,
labelFilter: NULL,
maxLevel: 2})
YIELD nodes, relationships
UNWIND relationships AS r
RETURN startNode®.name AS fromNode, endNode®.name AS toNode, type® AS relType
---- 待续 ----
(下篇:搜索最小生成树)
(原著:Neo4j官方技术支持 @graphway 俞方桦老师)