Neo4j圖數據庫高級應用系列 / 服務器擴展指南 (3.1) - 基本路徑擴展過程

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 可配置的路徑擴展過程)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章