第15期 Gremlin Steps:
coalesce()
、optional()
逛漫、union()
本系列文章的Gremlin示例均在HugeGraph圖數(shù)據(jù)庫上執(zhí)行黑低,環(huán)境搭建可參考準(zhǔn)備Gremlin執(zhí)行環(huán)境,本文示例均以其中的“TinkerPop關(guān)系圖”為初始數(shù)據(jù)尽楔。
tinkerpop關(guān)系圖
上一期:深入學(xué)習(xí)Gremlin(14):待添加
分支操作說明
-
coalesce
: 可以接受任意數(shù)量的遍歷器(traversal)投储,按順序執(zhí)行第练,并返回第一個能產(chǎn)生輸出的遍歷器的結(jié)果; -
optional
: 只能接受一個遍歷器(traversal)玛荞,如果該遍歷器能產(chǎn)生一個結(jié)果娇掏,則返回該結(jié)果,否則返回調(diào)用optional
Step的元素本身勋眯。當(dāng)連續(xù)使用.optional()
時婴梧,如果在某一步返回了調(diào)用元素本身,則后續(xù)的.optional()
不會繼續(xù)執(zhí)行客蹋; -
union
: 可以接受任意數(shù)量的遍歷器(traversal)塞蹭,并能夠?qū)⒏鱾€遍歷器的輸出合并到一起;
實例講解
下面通過實例來深入理解每一個操作讶坯。
-
Step
coalesce()
示例1:
// 按優(yōu)先級尋找到頂點“HugeGraph”的以下邊和鄰接點番电,找到一個就停止 // 1、“implements”出邊和鄰接點 // 2辆琅、“supports”出邊和鄰接點 // 3漱办、“created”入邊和鄰接點 g.V('3:HugeGraph').coalesce(outE('implements'), outE('supports'), inE('created')).inV().path().by('name').by(label)
HugeGraph這三類邊都是存在的,按照優(yōu)先級婉烟,返回了“implements”出邊和鄰接點娩井。
示例2:
// 按優(yōu)先級尋找到頂點“HugeGraph”的以下邊和鄰接點,找到一個就停止(調(diào)換了示例1中的1和2的順序) // 1似袁、“supports”出邊和鄰接點 // 2洞辣、“implements”出邊和鄰接點 // 3、“created”入邊和鄰接點 g.V('3:HugeGraph').coalesce(outE('supports'), outE('implements'), inE('created')).inV().path().by('name').by(label)
這次由于“supports”放在了“implements”的前面昙衅,所以返回了“supports”出邊和鄰接點扬霜。
自己動手比較一下
outE('supports'), outE('implements'), inE('created')
在.coalesce()
中隨意調(diào)換順序的區(qū)別。 -
Step
optional()
示例1:
// 查找頂點"linary"的“created”出頂點而涉,如果沒有就返回"linary"自己 g.V('linary').optional(out('created'))
示例2:
// 查找頂點"linary"的“knows”出頂點畜挥,如果沒有就返回"linary"自己 g.V('linary').optional(out('knows'))
示例3:
// 查找每個“person”頂點的出“knows”頂點,如果存在婴谱,然后以出“knows”頂點為起點,繼續(xù)尋找其出“created”頂點躯泰,最后打印路徑 g.V().hasLabel('person').optional(out('knows').optional(out('created'))).path()
結(jié)果中的后面四個頂點因為沒有出“knows”頂點谭羔,所以在第一步返回了自身后就停止了。
-
Step
union()
示例1:
// 尋找頂點“l(fā)inary”的出“created”頂點麦向,鄰接“knows”頂點瘟裸,并將結(jié)果合并 g.V('linary').union(out('created'), both('knows')).path()
示例2:
// 尋找頂點“HugeGraph”的入“created”頂點(創(chuàng)作者),出“implements”和出“supports”頂點诵竭,并將結(jié)果合并 g.V('3:HugeGraph').union(__.in('created'), out('implements'), out('supports'), out('contains')).path()
頂點“HugeGraph”沒有“contains”邊话告,所以只打印出了其作者(入“created”)兼搏,它實現(xiàn)的框架(出“implements”)和支持的特性(出“supports”)。