深入學習Gremlin(2):邊的遍歷操作

第2期 Gremlin Steps:

out()in()both()outE()inE()bothE()outV()inV()bothV()otherV()

本系列文章的Gremlin示例均在HugeGraph圖數據庫上執行,環境搭建可參考準備Gremlin執行環境,本文示例均以其中的“TinkerPop關係圖”爲初始數據,如下圖所示:
init-data

上一期:深入學習Gremlin(1):圖基本概念與操作

邊遍歷概念

邊遍歷是指通過頂點來訪問與其有關聯邊的鄰接頂點(或者僅訪問鄰接邊),邊遍歷是圖數據庫與圖計算的核心。我們先以TinkerPop官網的例子來解釋一下邊遍歷的相關Steps:

vertex-steps

頂點爲基準的Steps(如上圖中的頂點“4”):

  • out(label): 根據指定的EdgeLabel來訪問頂點的OUT方向鄰接點(可以是零個EdgeLabel,代表所有類型邊;也可以一個或多個EdgeLabel,代表任意給定EdgeLabel的邊,下同)
  • in(label): 根據指定的EdgeLabel來訪問頂點的IN方向鄰接點
  • both(label): 根據指定的EdgeLabel來訪問頂點的雙向鄰接點
  • outE(label): 根據指定的EdgeLabel來訪問頂點的OUT方向鄰接邊
  • inE(label): 根據指定的EdgeLabel來訪問頂點的IN方向鄰接邊
  • bothE(label): 根據指定的EdgeLabel來訪問頂點的雙向鄰接邊

邊爲基準的Steps(如上圖中的邊“knows”):

  • outV(): 訪問邊的出頂點(注意:這裏是以邊爲基準,上述Step均以頂點爲基準),出頂點是指邊的起始頂點
  • inV(): 訪問邊的入頂點,入頂點是指邊的目標頂點,也就是箭頭指向的頂點
  • bothV(): 訪問邊的雙向頂點
  • otherV(): 訪問邊的夥伴頂點,即相對於基準頂點而言的另一端的頂點

實例講解

下面通過實例來深入理解每一個操作。

  1. Step out():訪問頂點的OUT方向鄰接點

    示例1:

    // 先查詢圖中所有的頂點
    // 然後訪問頂點的OUT方向鄰接點
    // 注意:out()的基準必須是頂點
    g.V().out()

    g.V().out()

    示例2:

    // 訪問某個頂點的OUT方向鄰接點
    // 注意'3:TinkerPop'是頂點的id
    // 該id是插入頂點時自動生成的
    g.V('3:TinkerPop').out()

    g.V(id).out()

    目前講解過的Gremlin Steps中,頂點的id可通過g.V()來獲取,也可通過即將講解的has()來獲取(根據屬性查詢頂點)。

    示例3:

    // 訪問某個頂點的OUT方向鄰接點
    // 且限制僅“define”類型的邊相連的頂點
    g.V('3:TinkerPop').out('define')

    g.V(id).out(label)

    動手比一比:

    g.V('3:TinkerPop').out()

    g.V('3:TinkerPop').out('define', 'contains')

  2. Step in():訪問頂點的IN方向鄰接點

    示例1:

    // 訪問某個頂點的IN方向鄰接點
    g.V('3:TinkerPop').in()

    g.V(id).in()

    示例2:

    // 訪問某個頂點的IN方向鄰接點
    // 且限制了關聯邊的類型
    g.V('3:TinkerPop').in('implements')

    g.V(id).in(label)

  3. Step both():訪問頂點的雙向鄰接點

    示例1:

    // 訪問某個頂點的雙向鄰接點
    g.V('3:TinkerPop').both()

    g.V(id).both()

    示例2:

    // 訪問某個頂點的雙向鄰接點
    // 且限制了關聯邊的類型
    g.V('3:TinkerPop').both('implements', 'define')

    g.V(id).both(label)

  4. Step outE(): 訪問頂點的OUT方向鄰接邊

    示例1:

    // 訪問某個頂點的OUT方向鄰接邊
    g.V('3:TinkerPop').outE()

    g.V(id).outE()

    示例2:

    // 訪問某個頂點的OUT方向鄰接邊
    // 且限制了關聯邊的類型
    g.V('3:TinkerPop').outE('define')

    g.V(id).outE(label)

  5. Step inE(): 訪問頂點的IN方向鄰接邊

    示例1:

    // 訪問某個頂點的IN方向鄰接邊
    g.V('3:TinkerPop').inE()

    g.V(id).inE()

    示例2:

    // 訪問某個頂點的IN方向鄰接邊
    // 且限制了關聯邊的類型
    g.V('3:TinkerPop').inE('implements')

    g.V(id).inE(label)

  6. Step bothE(): 訪問頂點的雙向鄰接邊

    示例1:

    // 訪問某個頂點的雙向鄰接邊
    g.V('3:TinkerPop').bothE()

    g.V(id).bothE()

    示例2:

    // 訪問某個頂點的雙向鄰接邊
    // 且限制了關聯邊的類型
    g.V('3:TinkerPop').bothE('define', 'implements')

    g.V(id).bothE(label)

  7. Step outV(): 訪問邊的出頂點

    示例1:

    // 訪問某個頂點的IN鄰接邊
    // 然後獲取邊的出頂點
    g.V('3:TinkerPop').inE().outV()

    g.V(id).inE().outV()

    一般情況下,inE().outV()等價於in()

    動手試一試:g.V('3:TinkerPop').outE().outV()

  8. Step inV(): 訪問邊的入頂點

    示例1:

    // 訪問某個頂點的OUT鄰接邊
    // 然後獲取邊的入頂點
    g.V('3:TinkerPop').outE().inV()

    g.V(id).outE().inV()

    一般情況下,outE().inV()等價於out()

    動手試一試:g.V('3:TinkerPop').inE().inV()

  9. Step bothV(): 訪問邊的雙向頂點

    示例1:

    // 訪問某個頂點的OUT鄰接邊
    // 然後獲取邊的雙向頂點
    g.V('3:TinkerPop').outE().bothV()

    g.V(id).outE().bothV()

    注意:bothV()會把源頂點也一起返回,因此只要源頂點有多少條出邊,結果集中就會出現多少次源頂點

  10. Step otherV() : 訪問邊的夥伴頂點

    示例1:

    // 訪問某個頂點的OUT鄰接邊
    // 然後獲取邊的夥伴頂點
    g.V('3:TinkerPop').outE().otherV()

    g.V(id).outE().otherV()

    一般情況下,outE().otherV()等價於out()inE().otherV()等價於in()

    示例2:

    // 訪問某個頂點的雙向鄰接邊
    // 然後獲取邊的夥伴頂點
    g.V('3:TinkerPop').bothE().otherV()

    g.V(id).bothE().otherV()

    一般情況下,bothE().otherV()等價於both()

綜合運用

  1. 多度查詢

    // 4度out()查詢
    // 通過id找到“javeme”作者頂點
    // 通過out()訪問其創建的軟件
    // 繼續通過out()訪問軟件實現的框架
    // 繼續通過out()訪問框架包含的軟件
    // 繼續通過out()訪問軟件支持的語言
    g.V('javeme').out('created').out('implements').out('contains').out('supports')

    g.V(id).out()4

  2. 查詢支持Gremlin語言的軟件的作者

    // 通過id找到“Gremlin”語言頂點
    // 通過in()訪問支持Gremlin的軟件
    // 繼續通過in()訪問軟件的作者
    g.V('4:Gremlin').in('supports').in('created')

    g.V(id).in()2

  3. 查詢某個作者的共同作者

    // 通過id找到“javeme”作者頂點
    // 通過out()訪問其創建的軟件
    // 通過in()訪問軟件的所有作者
    g.V('javeme').out('created').in('created')

    g.V(id).out().in()

下一期:深入學習Gremlin(3):has條件過濾

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