1. 程式人生 > >深入學習Gremlin(8):資料分組與去重

深入學習Gremlin(8):資料分組與去重

第8期 Gremlin Steps: group()groupCount()dedup()by()

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

init-data

資料分組與去重說明

Gremlin支援對資料進行分組和去重。

資料分組是指:從某個維度上對擁有相同點的資料進行分組,比如根據年齡分組、根據出生省份分組等。

資料去重是指:去除結果集中相同的元素,或者去除在某個維度上具有相同點的資料,比如根據年齡選出一些代表,每個年齡最多隻能有一個人。

下面講解實現上述功能的具體Step:

  • group(): 對結果集進行分組,可通過by(property)來指定根據什麼維度進行分組,可稱維度為分組鍵;如果不指定維度則以元素id作為分組鍵,相當於重複的元素被分為一組。每一組由分組鍵+組內元素列表構成。如果有需要也可對每一組的元素列表進行reduce操作,依然使用by()語句,如by(count())對組內元素計數。
  • groupCount(): 對結果集進行分組,並統計每一組的元素個數。每一組由分組鍵+組內元素數量構成。
  • dedup(): 去除結果集中相同的元素,可通過by(property)來指定根據什麼維度進行去重。
  • by(): 語義上一般指“根據什麼維度”,與上述語句配合使用,如group().by()
    dedup().by()等。也可與其它語句配合,如前面講到的排序order().by()及路徑path().by()等。

例項講解

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

  1. Step group():對結果集進行分組

    示例1:

    // 不指定任何維度進行分組
    g.V().hasLabel('person').group()
    

    g.V().hasLabel().group()

    示例2:

    // 不指定任何維度進行分組
    // 但資料集中有重複的元素
    // 重複的元素將會被分為一組
    g.V().both().hasLabel('person').group()
    

    g.V().both().hasLabel().group()

    示例3:

    // 根據年齡進行分組
    g.V().hasLabel('person').group().by
    ('age')

    g.V().hasLabel().group().by()

    示例4:

    // 根據年齡進行分組
    // 並統計各個年齡的人數
    g.V().hasLabel('person')
     .group().by('age').by(count())
    

    g.V().hasLabel().group().by().by(count)

    示例5:

    // 根據頂點類別進行分組
    // 並統計各個類別的數量
    g.V().group().by(label).by(count())
    

    g.V().group().by(label).by(count)

  2. Step groupCount():對結果集進行分組計數

    示例1:

    // 不指定任何維度進行分組計數
    g.V().hasLabel('person').groupCount()
    

    g.V().hasLabel().groupCount()

    示例2:

    // 不指定任何維度進行分組計數
    // 但資料集中有重複的元素
    // 重複的元素將會被分為一組
    g.V().both().hasLabel('person').groupCount()
    

    g.V().both().hasLabel().groupCount()

    示例3:

    // 根據年齡進行分組計數
    g.V().hasLabel('person')
     .groupCount().by('age')
    

    g.V().hasLabel().groupCount().by()

  3. Step dedup():去除結果集中重複的元素

    示例1:

    // 對一組含有重複頂點的資料進行去重
    g.V().both().hasLabel('person').dedup()
    

    g.V().both().hasLabel().dedup()

    示例2:

    // 檢視所有人當中有哪幾種年齡
    // 人之間的年齡是可能有重複的,
    // 通過dedup去除掉重複的年齡
    g.V().hasLabel('person')
     .values('age').dedup()
    

    g.V().hasLabel().values().dedup()

    示例3:

    // 從各個年齡的人中選出一個代表
    g.V().hasLabel('person').dedup().by('age')
    

    g.V().hasLabel().dedup().by()

綜合運用

  1. 獲得各個地方人們的平均年齡

    // 根據地域分組,並得到各個組的平均年齡
    g.V().hasLabel('person').group()
     .by('addr').by(values('age').mean())
    

    mean-age-by-addr

  2. 統計頂點的邊數量的分佈情況

    // 擁有相同數量邊的頂點作為一組
    // 並獲取每一組的頂點數量
    // 結果相當於:擁有m條邊的頂點有n個
    g.V().groupCount().by(bothE().count())
    

    vertex-group-by-edges-count