实现图数据库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

猜你喜欢

转载自my.oschina.net/u/3705740/blog/1838993