1. 程式人生 > >實現圖資料庫TigerGraph Group By + Order By

實現圖資料庫TigerGraph Group By + Order By

一直引人注目的實時圖資料庫TigerGraph最近終於出了Developer Edition版本供大家熟悉使用,TigerGraph是使用其自己研發的Gsql來實現各種資料分析,本人也下載試用了一下,感覺功能還是很強大的,在此和大家分享一些使用的技巧。

TigerGraph下載地址:https://www.tigergraph.com/download/

藉著最近世界盃的氛圍,以足球為內容為大家舉例實現TigerGraph中的Group By + Order By功能。

首先,我們把圖中的頂點分為三個型別:footballer(球員),club(俱樂部),country(國家)。footballer頂點屬性有:name,age,position。club頂點屬性有:name,city。country頂點屬性有:name,continent。

其次,我們來定義邊的關係:footballer--(belong_to)-->club,club--(in)-->country,footballer--(belongs_to)-->country。舉例:梅西--(屬於)-->(巴塞羅那),巴塞羅那--(屬於)-->西班牙,梅西--(屬於)-->阿根廷。 像這樣的一個圖形,我們可以根據實際情況做很多資料分析,為了讓大家簡單的理解TigerGraph的Gsql語言,我們只實現一個簡單的統計功能,分析不同年齡的球員數量,並根據年齡倒排序。

在Gsql中,是沒有關鍵字GroupBy的,但它提供了很多Accumulators,正是因為這些Accumulators才能使得使用TigerGraph時實現底層的並行機制。這一次我們首先運用的是GroupByAccum(),它可以實現我們比較瞭解的Group By方法。其次,我們需要使用其中略微複雜的HeapAccum(),它能夠為我們實現最最關鍵的Order by方法。雖然Gsql有Order By關鍵字,但想要實現Group By之後的排序,我們目前使用HeapAccum()更合理且更快速。

實現方法如下:

CREATE QUERY groupby(INT num) FOR GRAPH MyGraph { // num引數用於自定義返回結果的數量
    TYPEDEF tuple<INT age, INT nums> ageResults; //建立一個元組,用於儲存年齡和數量
    HeapAccum<ageResults>(num, nums DESC) @@topAgeResults; // 第一個引數設定返回結果的數量,第二個引數用於設定排序的值,並設定正序和倒敘規則
    GroupByAccum<INT ages,SumAccum<INT> numt> @@group; // 第一個引數是需要被Group By的值,第二個用於統計Group By值的數量

    Footballer = {footballer.*}; // 定義頂點
    Result = SELECT f FROM Footballer:f 
              ACCUM @@group += (f.age->1); // ACCUM關鍵字來使用Accumulator

    //Foreach迴圈來取Group By的值,通過HeapAccum來最終完成排序
    FOREACH g IN @@group DO 
        @@topAgeResults += ageResults(g.ages,g.numt);
    END;
    PRINT @@topAgeResults; // 輸出最終排序後的結果
}

TigerGraph的Gsql比起其他圖資料庫的語言,有其自身的特點,且針對並行執行有著很好的優化。 本文僅僅只是拋磚引玉,想進一步瞭解TigerGraph的Gsql,可以進入官網學習瞭解。

官網Gsql學習網址:https://doc.tigergraph.com/GSQL-Language-Reference-Part-2---Querying.html#GSQLLanguageReferencePart2-Querying-ORDERBYClause