精华 Neo4j图数据库高级应用系列 / 服务器扩展指南 (3.3) - 搜索子图
发布于 5 年前 作者 pangguoming 1812 次浏览 来自 分享

​​​​​1. 定义

搜素子图的过程使用与路径扩展类似的方法从指定节点出发、沿着特定关系类型遍历,并返回能够到达的所有节点和关系。

APOC提供两种搜素子图的过程:

- subgraphNodes():仅返回可以到达的节点;

- subgraphAll():返回节点和关系。

与路径扩展过程expand和expandConfig不同的是,上述两个过程不返回所有的路径。

2. 应用

搜索子图的过程不会遍历所有可能的路径(即节点和边的所有可能序列),因此在执行效率和成本方面都优于路径扩展过程。适用的场景包括:

  • 寻找节点的k-度邻居(k-nearest neighbours);

  • 判断节点之间是否连通;

  • 对图进行划分子图的操作。

3. 过程调用接口

subgraphNodes()和subgraphAll()的调用接口完全一样,唯一的区别是返回结果不一样:subgraphNodes()返回节点列表,而subgraphAll()返回节点和关系列表。

image.png

image.png

image.png

  1. 示例

// 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

image.png

---- 待续 ----

(下篇:搜索最小生成树)

(原著:Neo4j官方技术支持 @graphway 俞方桦老师)

回到顶部