1. 程式人生 > >深入學習Gremlin(3):has條件過濾

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

第3期 Gremlin Steps:

hasLabel(labels…​)hasId(ids…​)has(key, value)has(label, key, value)has(key, predicate)hasKey(keys…​)hasValue(values…​)has(key)hasNot(key)

本系列文章的Gremlin示例均在HugeGraph圖資料庫上執行,環境搭建可參考準備Gremlin執行環境,本文示例均以其中的“TinkerPop關係圖”為初始資料。

init-data

Has Step說明

在眾多Gremlin的語句中,有一大類是filter型別,顧名思義,就是對輸入的物件進行條件判斷,只有滿足過濾條件的物件才可以通過filter進入下一步。

has語句是filter型別語句的代表,能夠以頂點和邊的屬性作為過濾條件,決定哪些物件可以通過。has語句包括很多變種:

  • hasLabel(labels…​): 滿足一個label就可以通過
  • hasId(ids…​): 滿足一個ID就可以通過
  • has(key, value): 有“key=value”property的通過
  • has(label, key, value): 有“key=value”且label的通過
  • has(key, predicate): 有key且對應的value滿足predicate
  • hasKey(keys…​): properties包含所有的key才能通過
  • hasValue(values…​)
    : properties包含所有的value才能通過
  • has(key): 有這個屬性的通過
  • hasNot(key): 沒有這個屬性的通過
  • has(key, traversal): Remove the traverser if its object does not yield a result through the traversal off the property value

TinkerPop規範中,也可以對Vertex Property進行has()操作,前提是圖支援meta-property。HugeGraph不支援meta-property,因此本文不會有Vertex Property相關的has()示例。

例項講解

在HugeGraph中,按property的值查詢之前,應該對property建立索引,否則將無法查到結果並引發異常。(有兩個例外,Vertex的PrimaryKeys和Edge的SortKeys,具體參見HugeGraph官網

// 對‘person’的‘addr’屬性建立secondary索引,可以對Text型別property按值進行查詢
graph.schema().indexLabel('personByCity').onV('person').by('addr').secondary().ifNotExist().create()
// 對‘person’的‘age’屬性建立range索引,可以對Number型別property進行範圍查詢
graph.schema().indexLabel('personByAge').onV('person').by('age').range().ifNotExist().create()
  • 1
  • 2
  • 3
  • 4
1. hasLabel(label...),通過label來過濾頂點或邊,滿足label列表中一個即可通過
// 查詢label"person"的頂點
g.V().hasLabel('person')
  • 1
  • 2

g_V_hasLabelX_person_X

// 查詢label"person"或者"software"的頂點
g.V().hasLabel('person', 'software')
  • 1
  • 2

g_V_hasLabelXperson_softwareX

2. hasId(ids…​)
// 查詢id為"zhoney"的頂點
g.V().hasId('zhoney')
  • 1
  • 2

g_V_hasIdXzhoneyX

// 查詢id為“zhoney”或者“3:HugeGraph”的頂點
g.V().hasId('zhoney', '3:HugeGraph')
  • 1
  • 2

g_V_hasIdXzhoney_3-HugeGraphX

3. has(key, value),通過屬性的名字和值來過濾頂點或邊
// 查詢“addr”屬性值為“Beijing”的頂點
g.V().has('addr', 'Beijing')
  • 1
  • 2

g_V_hasXkey_valueX

4. has(label, key, value),通過label和屬性的名字和值過濾頂點和邊
// 查詢label為“person”且“addr”屬性值為“Beijing”的頂點
g.V().has('person', 'addr', 'Beijing')
  • 1
  • 2

g_V_hasXperson_addr_BeijingX

5. has(key, predicate),通過對指定屬性用條件過濾頂點和邊
// 查詢“addr”屬性值為“Beijing”的頂點
g.V().has('age', gt(20))
  • 1
  • 2

g_V_hasXage_gtX20XX

6. hasKey(keys…​): properties包含所有的key才能通過
// 查詢包含屬性“age”的頂點
g.V().has('age')
  • 1
  • 2

g_V_hasKeyXageX

HugeGraph目前不支援hasKey()傳遞多個key

7. hasValue(values…​): properties包含所有的value才能通過
// 查詢包含屬性值“Beijing”的頂點
g.V().hasValue('Beijing')
  • 1
  • 2

g_V_hasValueXBeijingX

8. has(key): 有這個屬性的通過,等價於hasKey(key)
// 查詢包含屬性“age”的頂點
g.V().has('age')
  • 1
  • 2

g_V_hasXageX

9. hasNot(key): 沒有這個屬性的通過
// 查詢沒有屬性“age”的頂點
g.V().hasNot('age')
  • 1
  • 2

g_V_hasNotXageX

由於has()語句對Vertex和Edge的用法一樣,本文僅給出了Vertex的示例。Edge的大家可以自行嘗試。