深入學習Gremlin(8):資料分組與去重
阿新 • • 發佈:2018-12-10
第8期 Gremlin Steps:
group()
、groupCount()
、dedup()
、by()
本系列文章的Gremlin示例均在HugeGraph圖資料庫上執行,環境搭建可參考準備Gremlin執行環境,本文示例均以其中的“TinkerPop關係圖”為初始資料,如下圖所示:
資料分組與去重說明
Gremlin支援對資料進行分組和去重。
資料分組是指:從某個維度上對擁有相同點的資料進行分組,比如根據年齡分組、根據出生省份分組等。
資料去重是指:去除結果集中相同的元素,或者去除在某個維度上具有相同點的資料,比如根據年齡選出一些代表,每個年齡最多隻能有一個人。
下面講解實現上述功能的具體Step:
group()
: 對結果集進行分組,可通過by(property)來指定根據什麼維度進行分組,可稱維度為分組鍵;如果不指定維度則以元素id作為分組鍵,相當於重複的元素被分為一組。每一組由分組鍵+組內元素列表構成。如果有需要也可對每一組的元素列表進行reduce操作,依然使用by()語句,如by(count())對組內元素計數。groupCount()
: 對結果集進行分組,並統計每一組的元素個數。每一組由分組鍵+組內元素數量構成。dedup()
: 去除結果集中相同的元素,可通過by(property)
來指定根據什麼維度進行去重。by()
: 語義上一般指“根據什麼維度”,與上述語句配合使用,如group().by()
dedup().by()
等。也可與其它語句配合,如前面講到的排序order().by()
及路徑path().by()
等。
例項講解
下面通過例項來深入理解每一個操作。
-
Step
group()
:對結果集進行分組示例1:
// 不指定任何維度進行分組 g.V().hasLabel('person').group()
示例2:
// 不指定任何維度進行分組 // 但資料集中有重複的元素 // 重複的元素將會被分為一組 g.V().both().hasLabel('person').group()
示例3:
// 根據年齡進行分組 g.V().hasLabel('person').group().by
示例4:
// 根據年齡進行分組 // 並統計各個年齡的人數 g.V().hasLabel('person') .group().by('age').by(count())
示例5:
// 根據頂點類別進行分組 // 並統計各個類別的數量 g.V().group().by(label).by(count())
-
Step
groupCount()
:對結果集進行分組計數示例1:
// 不指定任何維度進行分組計數 g.V().hasLabel('person').groupCount()
示例2:
// 不指定任何維度進行分組計數 // 但資料集中有重複的元素 // 重複的元素將會被分為一組 g.V().both().hasLabel('person').groupCount()
示例3:
// 根據年齡進行分組計數 g.V().hasLabel('person') .groupCount().by('age')
-
Step
dedup()
:去除結果集中重複的元素示例1:
// 對一組含有重複頂點的資料進行去重 g.V().both().hasLabel('person').dedup()
示例2:
// 檢視所有人當中有哪幾種年齡 // 人之間的年齡是可能有重複的, // 通過dedup去除掉重複的年齡 g.V().hasLabel('person') .values('age').dedup()
示例3:
// 從各個年齡的人中選出一個代表 g.V().hasLabel('person').dedup().by('age')
綜合運用
-
獲得各個地方人們的平均年齡
// 根據地域分組,並得到各個組的平均年齡 g.V().hasLabel('person').group() .by('addr').by(values('age').mean())
-
統計頂點的邊數量的分佈情況
// 擁有相同數量邊的頂點作為一組 // 並獲取每一組的頂點數量 // 結果相當於:擁有m條邊的頂點有n個 g.V().groupCount().by(bothE().count())