聚合#
Cozo 中的聚合可以理解为作用于一连串值然后返回单个值(聚合值)的函数。
Cozo 中的聚合分为两类, 普通聚合 和 半晶格聚合 。所有的半晶格聚合都同时也是普通聚合,但是底层的实现方式不一样。只有半晶格聚合才能用在自递归的规则中。
半晶格聚合满足额外的代数性质:
- 幂等性
对单个值
a
进行聚合,值一定为a
本身;- 交换律
a
与b
的聚合等于b
与a
的聚合;- 结合律
聚合时怎么打括号得到的结果都一样。
在含有半晶格聚合的自递归规则中,理论上来说正文中的变量还需要满足一些额外的安全限制。常见的使用方式里这些限制都是被满足的,但随意使用归一来根据递归结果生成新的值可能会违反这些限制:Cozo 不会(也无法)检查这些有问题的查询。
半晶格聚合#
- min(x)#
最小值。
- max(x)#
最大值。
- and(var)#
所有值的逻辑与。
- or(var)#
所有值的逻辑或。
- union(var)#
所有值(每一个都是数组)的并集。
- intersection(var)#
所有值(每一个都是数组)的交集。
- choice(var)#
从给出的值中抽取一个非空值作为聚合值。若所有值都为空,则聚合值为空。
- min_cost([data, cost])#
聚合值为
cost
最小的data
。
- shortest(var)#
聚合值为长度最短的那个数组。
- bit_and(var)#
比特级别的“与”聚合值。被聚合的值必须都是字节数组。
- bit_or(var)#
比特级别的“或”聚合值。被聚合的值必须都是字节数组。
普通聚合#
- count(var)#
计数。
- count_unique(var)#
计数,重复值只计算一次。
- collect(var)#
将所有值聚合为一个数组。
- unique(var)#
将所有值聚合为一个数组,重复值只保留一份。
- group_count(var)#
对被聚合值按照值进行计数,列:值依次为
'a'
、'b'
、'c'
、'c'
、'a'
、'c'
,聚合值为[['a', 2], ['b', 1], ['c', 3]]
。
- bit_xor(var)#
比特级别的“排他或”聚合。值必须都为字节数组。
- latest_by([data, time])#
聚合值为
time
最大的data
。与min_cost
类似,但是min_cost
中数组里第二个值只能是数字,这里可以是任何类型,且min_cost
用的是最小,这里是最大。
- smallest_by([data, cost])#
聚合值为
cost
最小的data
。与min_cost
类似,但是min_cost
中数组里第二个值只能是数字,这里可以是任何类型。当cost
为空值时,直接舍弃此数组。
- choice_rand(var)#
从值中随机均匀取样一个值作为聚合值。
备注
此聚合不是半晶格聚合,因为如果不保存状态,则无法保证均匀采样,而目前的半晶格聚合实现都是无状态的。
统计聚合#
- mean(x)#
平均数。
- sum(x)#
求和。
- product(x)#
求积。
- variance(x)#
(样本)方差。
- std_dev(x)#
(样本)标准差。