第2期 Gremlin Steps:
out()
、in()
、both()
、outE()
、inE()
、bothE()
、outV()
、inV()
、bothV()
、otherV()
本系列文章的Gremlin示例均在HugeGraph圖數據庫上執行,環境搭建可參考準備Gremlin執行環境,本文示例均以其中的“TinkerPop關係圖”爲初始數據,如下圖所示:
邊遍歷概念
邊遍歷是指通過頂點來訪問與其有關聯邊的鄰接頂點(或者僅訪問鄰接邊),邊遍歷是圖數據庫與圖計算的核心。我們先以TinkerPop官網的例子來解釋一下邊遍歷的相關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()
: 訪問邊的夥伴頂點,即相對於基準頂點而言的另一端的頂點
實例講解
下面通過實例來深入理解每一個操作。
Step
out()
:訪問頂點的OUT方向鄰接點示例1:
// 先查詢圖中所有的頂點 // 然後訪問頂點的OUT方向鄰接點 // 注意:out()的基準必須是頂點 g.V().out()
示例2:
// 訪問某個頂點的OUT方向鄰接點 // 注意'3:TinkerPop'是頂點的id // 該id是插入頂點時自動生成的 g.V('3:TinkerPop').out()
目前講解過的Gremlin Steps中,頂點的id可通過
g.V()
來獲取,也可通過即將講解的has()
來獲取(根據屬性查詢頂點)。示例3:
// 訪問某個頂點的OUT方向鄰接點 // 且限制僅“define”類型的邊相連的頂點 g.V('3:TinkerPop').out('define')
動手比一比:
g.V('3:TinkerPop').out()
g.V('3:TinkerPop').out('define', 'contains')
Step
in()
:訪問頂點的IN方向鄰接點示例1:
// 訪問某個頂點的IN方向鄰接點 g.V('3:TinkerPop').in()
示例2:
// 訪問某個頂點的IN方向鄰接點 // 且限制了關聯邊的類型 g.V('3:TinkerPop').in('implements')
Step
both()
:訪問頂點的雙向鄰接點示例1:
// 訪問某個頂點的雙向鄰接點 g.V('3:TinkerPop').both()
示例2:
// 訪問某個頂點的雙向鄰接點 // 且限制了關聯邊的類型 g.V('3:TinkerPop').both('implements', 'define')
Step
outE()
: 訪問頂點的OUT方向鄰接邊示例1:
// 訪問某個頂點的OUT方向鄰接邊 g.V('3:TinkerPop').outE()
示例2:
// 訪問某個頂點的OUT方向鄰接邊 // 且限制了關聯邊的類型 g.V('3:TinkerPop').outE('define')
Step
inE()
: 訪問頂點的IN方向鄰接邊示例1:
// 訪問某個頂點的IN方向鄰接邊 g.V('3:TinkerPop').inE()
示例2:
// 訪問某個頂點的IN方向鄰接邊 // 且限制了關聯邊的類型 g.V('3:TinkerPop').inE('implements')
Step
bothE()
: 訪問頂點的雙向鄰接邊示例1:
// 訪問某個頂點的雙向鄰接邊 g.V('3:TinkerPop').bothE()
示例2:
// 訪問某個頂點的雙向鄰接邊 // 且限制了關聯邊的類型 g.V('3:TinkerPop').bothE('define', 'implements')
Step
outV()
: 訪問邊的出頂點示例1:
// 訪問某個頂點的IN鄰接邊 // 然後獲取邊的出頂點 g.V('3:TinkerPop').inE().outV()
一般情況下,
inE().outV()
等價於in()
動手試一試:
g.V('3:TinkerPop').outE().outV()
Step
inV()
: 訪問邊的入頂點示例1:
// 訪問某個頂點的OUT鄰接邊 // 然後獲取邊的入頂點 g.V('3:TinkerPop').outE().inV()
一般情況下,
outE().inV()
等價於out()
動手試一試:
g.V('3:TinkerPop').inE().inV()
Step
bothV()
: 訪問邊的雙向頂點示例1:
// 訪問某個頂點的OUT鄰接邊 // 然後獲取邊的雙向頂點 g.V('3:TinkerPop').outE().bothV()
注意:
bothV()
會把源頂點也一起返回,因此只要源頂點有多少條出邊,結果集中就會出現多少次源頂點Step
otherV()
: 訪問邊的夥伴頂點示例1:
// 訪問某個頂點的OUT鄰接邊 // 然後獲取邊的夥伴頂點 g.V('3:TinkerPop').outE().otherV()
一般情況下,
outE().otherV()
等價於out()
,inE().otherV()
等價於in()
示例2:
// 訪問某個頂點的雙向鄰接邊 // 然後獲取邊的夥伴頂點 g.V('3:TinkerPop').bothE().otherV()
一般情況下,
bothE().otherV()
等價於both()
綜合運用
多度查詢
// 4度out()查詢 // 通過id找到“javeme”作者頂點 // 通過out()訪問其創建的軟件 // 繼續通過out()訪問軟件實現的框架 // 繼續通過out()訪問框架包含的軟件 // 繼續通過out()訪問軟件支持的語言 g.V('javeme').out('created').out('implements').out('contains').out('supports')
查詢支持Gremlin語言的軟件的作者
// 通過id找到“Gremlin”語言頂點 // 通過in()訪問支持Gremlin的軟件 // 繼續通過in()訪問軟件的作者 g.V('4:Gremlin').in('supports').in('created')
查詢某個作者的共同作者
// 通過id找到“javeme”作者頂點 // 通過out()訪問其創建的軟件 // 通過in()訪問軟件的所有作者 g.V('javeme').out('created').in('created')