AnzoGraph是一个原生的大规模并行处理(MPP)图OLAP数据库,专门用于交互式数据仓库分析和图形分析。在我们之前的文章中,我们向您展示了AnzoGraph如何不仅支持语义图,还使用RDF *提出的W3C标准标记属性图。本文将向您展示AnzoGraph如何为窗口聚合等高级分析提供内置支持,这使得用户只需使用一个查询即可在结果集的特定分区或窗口上计算多个聚合值,而无需编写和提交多个冗余查询以获得相同的结果。
与对结果进行分组并返回单个值的分组聚合函数不同,窗口聚合为指定窗口中的每一行返回一个值。例如,使用分组的聚合SUM函数来累计一年中销售的票证总数,将返回一个值:当年销售的票证总数。但是,通过使用SUM 窗口聚合,结果可以按月分区,以便您的单个查询返回12个值:一年中每个月销售的票证总和。
本文介绍了受支持的窗口聚合,解释了如何将它们合并到AnzoGraph中的SPARQL查询中,并提供了一些示例查询。
AnzoGraph内置窗口聚合
AnzoGraph提供以下内置聚合和排名功能:
- AVG:计算输入表达式值的平均值。
- COUNT:计算表达式定义的结果数。
- MAX:返回输入表达式值的最大值。
- MIN:返回输入表达式值的最小值。
- NTILE:将分区中的行划分为指定数量的已排名组,并返回每个值所属的组。
- PERCENTILE:与使用NTILE(100)一样,此函数将分区中的行划分为100个排名组,并返回每个值所属的组。
- PRODUCT:将输入表达式值相乘并返回乘积。
- QUARTILE:与使用NTILE(4)一样,此函数将分区中的行划分为4个排序组,并返回每个值所属的组。
- ROW_NUMBER:为分区中的每一行分配唯一的数字。
- SUM:返回输入表达式值的总和。
窗口聚合SPARQL语法
在SPARQL查询中合并窗口聚合时,请使用以下语法。语法下面的列表描述了每个选项:
(FUNCTION_NAME (表达式1 ) OVER (
[ PARTITION BY 表达式2 ] |
[ ORDER BY expression3 [ frame_clause ] ]
)
AS ?变量 )
FUNCTION_NAME(表达式1)
窗口聚合名称和表达式,用于生成要操作的值。
过度()
必需的OVER()关键字将窗口聚合与其他聚合函数区分开来。
PARTITION BY表达式2
此可选子句形成行组,将结果集划分为分区。如果不包含PARTITION BY子句,则分区将成为WHERE子句标识的整个结果集。当包含PARTITION BY时,系统会为每个分区中的行计算指定的函数。
ORDER BY表达式3
此可选子句定义每个分区中的行的顺序或顺序。
frame_clause
可选的frame子句定义窗口框架,该框架指定分区中与当前行组合的行。窗框有两种类型:
具有两个移动端点的固定框架,其中每个行在窗口框架在分区中向前滑动时成为当前行。这种类型的帧非常适合计算移动时间帧上的聚合。
具有一个锚定端点的调整大小框架,其中一行是固定端点,并且框架向上(向前)或向下(向下)调整大小。这种类型的框架非常适合计算运行总计。
所有窗口框架的参考点是当前行。frame子句可以是以下选项之一:
[ ROWS ] frame_start
[ ROWS ] BETWEEN frame_start AND frame_end
其中frame_start是以下选项之一:
UNBOUNDED PRECEDING
positive_value PRECEDING
CURRENT ROW
positive_value FOLLOWING
而frame_end是以下选项之一:
positive_value PRECEDING
CURRENT ROW
positive_value FOLLOWING
UNBOUNDED FOLLOWING
如果未指定frame子句,系统会将窗口框架视为无界:在无界预定和无限制下行之间行。
AnzoGraph窗口聚合查询示例
下面的示例查询分析了虚构的电子商务网站的销售活动,我们称之为“Tickit”,人们购买和出售体育赛事,演出和音乐会的门票。数据包括人员,地点,类别,日期,事件,列表和销售类别。注意:Tickit示例数据包含在AnzoGraph的安装中,也可在Amazon S3上使用。
以下简单查询在Tickit图中汇总了每月的事件数:
SELECT ?month (COUNT (?event ) OVER (PARTITION BY ?month ) AS ?events )
FROM <tickit>
在哪里 {
{ SELECT ?event (MONTH (?date ) AS ?month )
在哪里 {
?sale <dateid> ?dateid 。
?dateid <caldate> ?date 。
?sale <eventid> ?eventid 。
?eventid <eventname> ?event 。
}
}
}
ORDER BY ?月
月 | 事件
------ + --------
1 | 26117
1 | 26117
。。。
2 | 30911
2 | 30911
。。。
3 | 33932
3 | 33932
。。。
4 | 32196
4 | 32196
。。。
8 | 34315
8 | 34315
。。。
12 | 11648
12 | 11648
。。。
此示例查询返回每个销售人员来自事件“Gypsy”的总销售额的百分比:
SELECT ?event_name ?fname ?lname
((?美元 * 100 。0 / (SUM (?美元) OVER (PARTITION BY ?事件))) 为 ?percent_of_sales )
FROM <tickit>
在哪里 {
?sale <eventid> ?活动 。
?event <eventname> ?event_name 。
?sale <卖方> ?销售人员 。
?sale <pricepaid> ?美元 。
?salesperson <firstname> ?fname 。
?salesperson <lastname> ?lname 。
FILTER (?event_name = “Gypsy” )。
}
ORDER BY ?event_name desc (?percent_of_sales )
event_name | fname | lname | percent_of_sales
----------- --------- + + + ----------- ---------------- -
吉普赛 | 佐伊 | 索萨 | 100 。000000
吉普赛 | Xaviera | 雅各布森 | 50 。941458
吉普赛 | Brianna | 麦克法兰 | 50 。507614
吉普赛 | Alexa | 贝尔德 | 45 。792564
吉普赛 | Roanna | 木材 | 42 。040816
吉普赛 | 科莱特 | 粘土 | 36 。938776
吉普赛 | Amela | 霍尔曼 | 35 。727660
吉普赛 | 奥布里 | 特雷尔 | 32 。245681
吉普赛 | 布鲁诺 | 格里芬 | 31 。813858
吉普赛 | 达米安 | 伯杰 | 31 。245923
吉普赛 | Zelenia | 伍兹 | 31 。161644
吉普赛 | Imogene | 麦克莱恩 | 31 。000483
吉普赛 | 海伦 | 哈尼 | 30 。295666
吉普赛 | 西拉斯 | 永利 | 28 。730306
吉普赛 | Caryn | 海丝特 | 28 。714012
吉普赛 | 卡姆登 | 霍恩 | 27 。253097
吉普赛 | 阿达拉 | 伯里斯 | 26 。809349
吉普赛 | 拉雅 | 弗莱明 | 26 。790955
。。。
此示例查询示例Tickit数据集,以返回为“Mamma Mia!”事件销售的票数的运行总计:
SELECT ?event ?month (SUM (?qty ) OVER (PARTITION BY ?month ORDER BY ?event
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS ?票)
FROM <tickit>
在哪里 {
?s <qtysold> ?数量 。
?s <eventid> ?eventid 。
?eventid <eventname> ?event 。
?s <dateid> ?date 。
?date <month> ?month 。
过滤器(?event = “Mamma Mia!” )
}
ORDER BY ?门票
限制 500
事件 | 月 | 门票
----------- + ------- + ---------
妈妈咪 呀! | 五月 | 1
妈妈咪 呀! | JAN | 1
妈妈咪 呀! | SEP | 1
妈妈咪 呀! | APR | 2
妈妈咪 呀! | JAN | 2
妈妈咪 呀! | AUG | 2
妈妈咪 呀! | JUN | 2
妈妈咪 呀! | 五月 | 2
妈妈咪 呀! | NOV | 2
妈妈咪 呀! | SEP | 3
妈妈咪 呀! | NOV | 3
妈妈咪 呀! | FEB | 4
妈妈咪 呀! | APR | 4
。。。
妈妈咪 呀! | JAN | 85
妈妈咪 呀! | JUL | 85
妈妈咪 呀! | MAR | 85
妈妈咪 呀! | JUN | 85
妈妈咪 呀! | OCT | 85
妈妈咪 呀! | NOV | 85
妈妈咪 呀! | FEB | 86
妈妈咪 呀! | APR | 86
...
与可能需要您编写多个查询以获得数据集中值的整体视图的其他图形数据库不同,AnzoGraph的窗口聚合使用户能够运行单个查询,该查询返回有关数据模式的详细信息,例如运行总计或更改随着时间的推移。除了窗口聚合之外,AnzoGraph还包含一个包含其他类似SQL和Microsoft Excel的函数的丰富库。