第10期 Gremlin Steps:
is()
虏辫、and()
疤苹、or()
赶舆、not()
本系列文章的Gremlin示例均在HugeGraph圖數(shù)據(jù)庫(kù)上執(zhí)行,環(huán)境搭建可參考準(zhǔn)備Gremlin執(zhí)行環(huán)境倦青,本文示例均以其中的“TinkerPop關(guān)系圖”為初始數(shù)據(jù)瓮床。
上一期:深入學(xué)習(xí)Gremlin(9):條件和過(guò)濾
邏輯運(yùn)算說(shuō)明
Gremlin支持在遍歷器上加上邏輯運(yùn)算進(jìn)行過(guò)濾,只有滿足該邏輯條件的元素才會(huì)進(jìn)入下一個(gè)遍歷器中产镐。
下面講解實(shí)現(xiàn)上述功能的具體Step:
-
is()
:可以接受一個(gè)對(duì)象(能判斷相等)或一個(gè)判斷語(yǔ)句(如:P.gt()
隘庄、P.lt()
、P.inside()
等)磷账,當(dāng)接受的是對(duì)象時(shí)峭沦,原遍歷器中的元素必須與對(duì)象相等才會(huì)保留;當(dāng)接受的是判斷語(yǔ)句時(shí)逃糟,原遍歷器中的元素滿足判斷才會(huì)保留吼鱼,其實(shí)接受一個(gè)對(duì)象相當(dāng)于P.eq()
蓬豁; -
and()
:可以接受任意數(shù)量的遍歷器(traversal),原遍歷器中的元素菇肃,只有在每個(gè)新遍歷器中都能生成至少一個(gè)輸出的情況下才會(huì)保留地粪,相當(dāng)于過(guò)濾器組合的與條件; -
or()
:可以接受任意數(shù)量的遍歷器(traversal)琐谤,原遍歷器中的元素蟆技,只要在全部新遍歷器中能生成至少一個(gè)輸出的情況下就會(huì)保留,相當(dāng)于過(guò)濾器組合的或條件斗忌; -
not()
:僅能接受一個(gè)遍歷器(traversal)质礼,原遍歷器中的元素,在新遍歷器中能生成輸出時(shí)會(huì)被移除织阳,不能生成輸出時(shí)則會(huì)保留眶蕉,相當(dāng)于過(guò)濾器的非條件。
這四種邏輯運(yùn)算Step除了像一般的Step寫法以外唧躲,
and()
和or()
還可以放在where()
中以中綴符的形式出現(xiàn)造挽。
實(shí)例講解
下面通過(guò)實(shí)例來(lái)深入理解每一個(gè)操作。
-
Step
is()
示例1:
// 篩選出頂點(diǎn)屬性“age”等于28的屬性值弄痹,與`is(P.eq(28))`等效 g.V().values('age').is(28)
當(dāng)沒(méi)有任何一個(gè)頂點(diǎn)的屬性“age”為28時(shí)饭入,輸出為空。
示例2:
// 篩選出頂點(diǎn)屬性“age”大于等于28的屬性值 g.V().values('age').is(gte(28))
示例3:
// 篩選出頂點(diǎn)屬性“age”屬于區(qū)間(27肛真,29)的屬性值 g.V().values('age').is(inside(27, 29))
P.inside(a, b)
是左開(kāi)右開(kāi)區(qū)間(a谐丢,b)示例4:
// 篩選出由兩個(gè)或兩個(gè)以上的人參與創(chuàng)建(“created”)的頂點(diǎn) // 注意:這里篩選的是頂點(diǎn) g.V().where(__.in('created').count().is(gt(2))).values('name')
where()
Step可以接受一些過(guò)濾條件,在第10期會(huì)詳細(xì)介紹毁欣。示例5:
// 篩選出有創(chuàng)建者(“created”)的年齡(“age”)在20~29之間的頂點(diǎn) g.V().where(__.in('created').values('age').is(between(20, 29))).values('name')
-
Step
and()
庇谆,邏輯與示例1:
// 所有包含出邊“supports”的頂點(diǎn)的名字“name” g.V().and(outE('supports')).values('name')
示例2:
// 所有包含出邊“supports”和“implements”的頂點(diǎn)的名字“name” g.V().and(outE('supports'), outE('implements')).values('name')
示例3:
// 包含邊“created”并且屬性“age”為28的頂點(diǎn)的名字“name” g.V().and(outE('created'), values('age').is(28)).values('name')
示例4:“示例3”的中綴符寫法
// 包含邊“created”并且屬性“age”為28的頂點(diǎn)的名字“name” g.V().where(outE('created') .and() .values('age').is(28)) .values('name')
-
Step
or()
,邏輯或示例1:
// 所有包含出邊“supports”的頂點(diǎn)的名字“name” g.V().or(outE('supports')).values('name')
只有一個(gè)條件時(shí)凭疮,
and()
與or()
的效果一樣的。示例2:
// 所有包含出邊“supports”或“implements”的頂點(diǎn)的名字“name” g.V().or(outE('supports'), outE('implements')).values('name')
注意對(duì)比與
g.V().and(outE('supports'), outE('implements')).values('name')
的差別示例3:
// 包含邊“created”或?qū)傩浴癮ge”為28的頂點(diǎn)的名字“name” g.V().or(outE('created'), values('age').is(28)).values('name')
注意對(duì)比與
g.V().and(outE('created'), values('age').is(28)).values('name')
的差別示例4:“示例3”的中綴符寫法
// 包含邊“created”或?qū)傩浴癮ge”為28的頂點(diǎn)的名字“name” g.V().where(outE('created') .or() .values('age').is(28)) .values('name')
-
Step
not()
串述,邏輯非示例1:
// 篩選出所有不是“person”的頂點(diǎn)的“l(fā)abel” g.V().not(hasLabel('person')).label()
示例2:
// 篩選出所有包含不少于兩條(大于等于兩條)“created”邊的“person”的名字“name” g.V().hasLabel('person').not(out('created').count().is(lt(2))).values('name')
綜合運(yùn)用
目標(biāo):獲取所有最多只有一條“created”邊并且年齡不等于28的“person”頂點(diǎn)
寫法1:
// 與(含有小于等于一條“created”邊执解,年齡不等于28)
g.V().hasLabel('person')
.and(outE('created').count().is(lte(1)),
values("age").is(P.not(P.eq(28))))
.values('name')
寫法2:
// 非(或(含有多于一條“created”邊,年齡等于28))
g.V().hasLabel('person')
.not(or(out('created').count().is(gt(1)),
values('age').is(28)))
.values('name')