深入學(xué)習(xí)Gremlin(10):邏輯運算

第10期 Gremlin Steps:

is()、and()、or()、not()

本系列文章的Gremlin示例均在HugeGraph圖數(shù)據(jù)庫上執(zhí)行,環(huán)境搭建可參考準(zhǔn)備Gremlin執(zhí)行環(huán)境,本文示例均以其中的“TinkerPop關(guān)系圖”為初始數(shù)據(jù)。

tinkerpop關(guān)系圖

上一期:深入學(xué)習(xí)Gremlin(9):條件和過濾

邏輯運算說明

Gremlin支持在遍歷器上加上邏輯運算進行過濾,只有滿足該邏輯條件的元素才會進入下一個遍歷器中。

下面講解實現(xiàn)上述功能的具體Step:

  • is():可以接受一個對象(能判斷相等)或一個判斷語句(如:P.gt()、P.lt()、P.inside()等),當(dāng)接受的是對象時,原遍歷器中的元素必須與對象相等才會保留;當(dāng)接受的是判斷語句時,原遍歷器中的元素滿足判斷才會保留,其實接受一個對象相當(dāng)于P.eq();
  • and():可以接受任意數(shù)量的遍歷器(traversal),原遍歷器中的元素,只有在每個新遍歷器中都能生成至少一個輸出的情況下才會保留,相當(dāng)于過濾器組合的與條件;
  • or():可以接受任意數(shù)量的遍歷器(traversal),原遍歷器中的元素,只要在全部新遍歷器中能生成至少一個輸出的情況下就會保留,相當(dāng)于過濾器組合的或條件;
  • not():僅能接受一個遍歷器(traversal),原遍歷器中的元素,在新遍歷器中能生成輸出時會被移除,不能生成輸出時則會保留,相當(dāng)于過濾器的非條件。

這四種邏輯運算Step除了像一般的Step寫法以外,and()or()還可以放在where()中以中綴符的形式出現(xiàn)。

實例講解

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

  1. Step is()

    示例1:

    // 篩選出頂點屬性“age”等于28的屬性值,與`is(P.eq(28))`等效
    g.V().values('age').is(28)
    

    當(dāng)沒有任何一個頂點的屬性“age”為28時,輸出為空。

    示例2:

    // 篩選出頂點屬性“age”大于等于28的屬性值
    g.V().values('age').is(gte(28))
    

    示例3:

    // 篩選出頂點屬性“age”屬于區(qū)間(27,29)的屬性值
    g.V().values('age').is(inside(27, 29))
    

    P.inside(a, b)是左開右開區(qū)間(a,b)

    示例4:

    // 篩選出由兩個或兩個以上的人參與創(chuàng)建(“created”)的頂點
    // 注意:這里篩選的是頂點
    g.V().where(__.in('created').count().is(gt(2))).values('name')
    

    where()Step可以接受一些過濾條件,在第10期會詳細(xì)介紹。

    示例5:

    // 篩選出有創(chuàng)建者(“created”)的年齡(“age”)在20~29之間的頂點
    g.V().where(__.in('created').values('age').is(between(20, 29))).values('name')
    
  2. Step and(),邏輯與

    示例1:

    // 所有包含出邊“supports”的頂點的名字“name”
    g.V().and(outE('supports')).values('name')
    

    示例2:

    // 所有包含出邊“supports”和“implements”的頂點的名字“name”
    g.V().and(outE('supports'), outE('implements')).values('name')
    

    示例3:

    // 包含邊“created”并且屬性“age”為28的頂點的名字“name”
    g.V().and(outE('created'), values('age').is(28)).values('name')
    

    示例4:“示例3”的中綴符寫法

    // 包含邊“created”并且屬性“age”為28的頂點的名字“name”
    g.V().where(outE('created')
                .and()
                .values('age').is(28))
     .values('name')
    
  3. Step or(),邏輯或

    示例1:

    // 所有包含出邊“supports”的頂點的名字“name”
    g.V().or(outE('supports')).values('name')
    

    只有一個條件時,and()or()的效果一樣的。

    示例2:

    // 所有包含出邊“supports”或“implements”的頂點的名字“name”
    g.V().or(outE('supports'), outE('implements')).values('name')
    

    注意對比與g.V().and(outE('supports'), outE('implements')).values('name')的差別

    示例3:

    // 包含邊“created”或?qū)傩浴癮ge”為28的頂點的名字“name”
    g.V().or(outE('created'), values('age').is(28)).values('name')
    

    注意對比與g.V().and(outE('created'), values('age').is(28)).values('name')的差別

    示例4:“示例3”的中綴符寫法

    // 包含邊“created”或?qū)傩浴癮ge”為28的頂點的名字“name”
    g.V().where(outE('created')
                .or()
                .values('age').is(28))
     .values('name')
    
  4. Step not(),邏輯非

    示例1:

    // 篩選出所有不是“person”的頂點的“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')
    

綜合運用

目標(biāo):獲取所有最多只有一條“created”邊并且年齡不等于28的“person”頂點

寫法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')

下一期:深入學(xué)習(xí)Gremlin(11):待添加

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容