Neo4j图数据库高级应用系列 / 服务器扩展指南 (3.3) - 搜索子图

​​​​​1. 定义

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

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

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

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

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

2. 应用

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

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

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

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

 

3. 过程调用接口

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

 

 

 

 

过程接口

 

 

CALL apoc.path.subgraphNodes(
   startNode Node/list,
   { maxLevel,
     relationshipFilter,
     labelFilter,
     bfs:true,
     filterStartNode:true,
     limit:-1,
     optional:false,
     endNodes,
     terminatorNodes,
     sequence,
     beginSequenceAtStart:true
   }
) YIELD node
 

 

 

 

 

过程接口

 

 

CALL apoc.path.subgraphAll(
   startNode Node/list,
   { maxLevel,
     relationshipFilter,
     labelFilter,
     bfs:true,
     filterStartNode:true,
     limit:-1,
     optional:false,
     endNodes,
     terminatorNodes,
     sequence,
     beginSequenceAtStart:true
   }
) YIELD nodes,relationships
 

参数名

类型

缺省值

可为空?

说明

startNode

LONG - 节点id,或者节点列表

遍历的起始节点。

{configuration}

配置选项列表

NULL

具体配置项参见下面的说明。

maxDepth

INTEGER

-1

最大遍历层次数。-1表示不限制,直到不再有可遍历的路径为止。

relationshipFilter

字符串

NULL

关系过滤器规则,参见3.2.2

labelFilter

字符串

NULL

标签过滤器规则,参见3.2.1

bfs

布尔值

false

true – 宽度优先遍历

false – 深度优先遍历

filterStartNode

布尔值

false

是否过对起始节点应用过滤规则。

limit

正整数

-1

返回路径的数目上限。

optional

布尔值

false

true – 如果没有找到复合条件的路径,返回NULL值的序列;

false – 如果没有找到复合条件的路径,则不返回。

endNodes

节点列表

NULL

遍历终止节点列表。

terminatorNodes

节点列表

NULL

终止节点列表,参见3.2.1。

sequence

字符串

NULL

节点和标签过滤规则序列,参见3.2.3。指定sequence规则后labelFilter和relationshipFilter的内容会被忽略。

beginSequenceAtStart

布尔值

true

是否对起始节点应用sequence中定义的规则。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4. 示例

 

 

C
Y
P
H
E
R

 

 

 

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

 

 

C
Y
P
H
E
R

 

 

 

// 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(r).name AS fromNode,
       endNode(r).name AS toNode,
       type(r) AS relType

 

 



重要技巧

  
        搜索图中某节点的k-度邻居,也可以用下面的Cypher:

       
        MATCH (n:Node) -[*..k]- () RETURN nodes(path)

       
         Cypher会返回所有长度为k的路径,在图中存在环、超级节点或者节点之间存在多个关系时,这会是一个非常消耗资源的操作,因为需要计算大量重复节点和关系构成的路径。

        apoc.path.subgraphNodes()可以更高效地返回k-度邻居。
 

---- 待续 ----

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

你可能感兴趣的:(Neo4j高级应用技术专题,APOC,图数据库,Neo4j技术交流,Cypher,Neo4j教程,Neo4j)