1、概述 路径扩展过程(Path Expanding)是从指定的一个或一组起始节点开始,根据过滤规则沿着特定关系依次访问其他相连节点的过程。该过程迭代执行,直到没有更多相连节点或者预设的结束条件满足时终止。路径扩展可以看作是图的遍历(Graph Traversal)的一种实现方式。
2、应用 在Cypher中也可以实现图的遍历。APOC的路径扩展过程除了调用方法不一样以外,还具有下面的优势: 1) 更加多样的遍历方式。 2) 更加细粒度的遍历过程控制。 3) 更好的执行性能。 4) 可扩展性更好。
3、过程接口
CALL apoc.path.expand( startNode <id>|Node, relationshipFilter, labelFilter, minDepth, maxDepth ) YIELD path AS <identifier>
参数名 类型 缺省值 可为空? 说明 startNode LONG - 节点id,或者Node - 节点对象 无 否 遍历的起始节点 relationshipFilter 关系过滤器规则 NULL 是 参见3.2.2 labelFilter 标签过滤器规则 NULL 是 参见3.2.1 minDepth INTERGER 0 是 最小遍历层次数。 maxDepth INTEGER -1 是 最大遍历层次数。-1表示不限制,直到不再有可遍历的路径为止。
4、示例数据 (注意:因为在线文本编辑器的原因,下面查询中文本的引号不能正确显示,请做必要的替换后执行)
// 3.3A 创建三国人物关系图
CREATE (n1:人物
:皇帝
:文臣
:武将
{name: ‘刘备’})
-[:兄长]-> (n2:人物
:武将
{name: ‘关羽’}),
(n2) -[:兄长]-> (n3:人物
:武将
{name: ‘张飞’}),
(n1) -[:兄长]-> (n3),
(n1) -[:主公]-> (n4:人物
:武将
{name: ‘赵云’}),
(n1) -[:父子]-> (n5:人物
:皇帝
:文臣
{name: ‘刘禅’}),
(n1) -[:主公]-> (n6:人物
:文臣
{name: ‘诸葛亮’}),
(n5) -[:主公]-> (n4),
(n5) -[:主公]-> (n6),
(a1:朝代
{name:‘蜀汉’}) -[:对手]-> (a2:朝代
{name:‘曹魏’}),
(a3:朝代
{name:‘西晋’}) -[:取代]-> (a2),
(m1:人物
:文臣
{name: ‘曹操’})
-[:父子]-> (m2:人物
:文臣
:皇帝
{name: ‘曹丕’}),
(m1) -[:父子]-> (m3:人物
:文臣
{name: ‘曹植’}),
(m2) -[:兄长]-> (m3),
(m1) -[:主公]-> (m4:人物
:文臣
{name: ‘司马懿’}),
(m4) -[:父子]-> (m5:人物
:文臣
{name: ‘司马昭’}),
(m5) -[:父子]-> (m6:人物
:文臣
:皇帝
{name: ‘司马炎’}),
(n1) -[:建立{year:221}]-> (a1),
(m2) -[:建立{year:220}]-> (a2),
(m6) -[:建立{year:266}]-> (a3)
运行上面的Cypher查询会得到以下三国人物关系图:
5、样例查询
// 3.3(1) 调用基本路径扩展过程,从“蜀汉”节点出发遍历图。 // 参数:- startNode:代表“蜀汉”的节点 // - relationshipFilter: NULL // - labelFilter: NULL // - minLevel: 0 // - maxLevel: -1,遍历直到返回能够到达的所有路径 // 返回结果:所有170条路径、15个节点、19个关系。 MATCH (n:朝代{name:‘蜀汉’}) CALL apoc.path.expand(n,NULL,NULL,0,-1) YIELD path RETURN path
// 3.3(2) 调用基本路径扩展过程,从“蜀汉”节点出发遍历图。 // 参数:- startNode:代表“蜀汉”的节点 // - relationshipFilter: NULL // - labelFilter: -朝代,即遍历到其他“朝代”节点终止。 // - minLevel: 0 // - maxLevel: -1,遍历直到返回能够到达的所有路径 // 返回结果:蜀汉的所有人物。 MATCH (n:朝代{name:‘蜀汉’}) CALL apoc.path.expand(n,NULL,’-朝代’,0,-1) YIELD path RETURN path
// 3.3(3) 调用基本路径扩展过程,从“蜀汉”节点出发遍历图。 // 参数:- startNode:代表“蜀汉”的节点 // - relationshipFilter: NULL // - labelFilter: +皇帝|朝代 // - minLevel: 0 // - maxLevel: -1,遍历直到返回能够到达的所有路径 // 返回结果:三国时期的所有朝代及其皇帝。 MATCH (n:朝代{name:‘蜀汉’}) CALL apoc.path.expand(n,NULL, ‘+皇帝|朝代’,0,-1) YIELD path RETURN path
---- 待续 ---- (下篇:3.2 可配置的路径扩展过程)
(原著:Neo4j官方技术支持 @graphway 俞方桦老师)