Pydatalog 聚合函数的使用
Usage of Pydatalog Aggregate Functions
我一直在尝试各种聚合函数来感受它们,在过去几天感到困惑之后,我需要澄清一下。我要么得到完全不直观的行为,要么得到无用的错误。比如我测试:
(p[X]==min_(Y, order_by=Z)) <= Y.in_((4,6,2)) & Z.in_((6 ,))
查看示例输出:
p[0]==X,Y,Z
([(6,)], [4, 6, 2], [6, 6, 6])
p[1]==X,Y,Z
([(6,)], [6, 4, 2], [6, 6, 6])
p[2]==X,Y,Z
([(6,)], [4, 2, 6], [6, 6, 6])
- 为什么最低是6? 2、为什么Z绑定的值重复了3次? 3. 'order_by' 与从中找到最小值的列表相关的确切目的是什么? 4. 如果 'order_by' 列表中有多个值,为什么输出会发生变化;为什么特定值--6,在这种情况下--在'order_by'列表中会影响输出?另一个例子:
(p[X]==min_(Y, order_by=Z)) <= Y.in_((4,6,2)) & Z.in_((0 ,))
输出:
p[0]==X,Y,Z
([(6,)], [4, 6, 2], [0, 0, 0])
p[1]==X,Y,Z
([(6,)], [2, 6, 4], [0, 0, 0])
p[2]==X,Y,Z
([(2,)], [2, 6, 4], [0, 0, 0])
为什么 X 的输出会根据提供的索引从 6 变为 2?尽管在前面的示例中输出是错误的,但至少对于所使用的索引来说是一致的;只有一个 min/max,这使得 since.
我至少可以使用 min_、max_、sum_ 函数查看输出;但是,当谈到 rank_ 和 running_sum_ 时,我迷路了。我在定义函数时遵循类似的过程:
(p[X]==running_sum_(Z, group_by=Z, order_by=Z)) <= Z.in_((43,34, 65))
我尝试查看输出:
p[0]==X
我收到错误:
回溯(最后一次调用):
文件“”,第 1 行,位于
文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/UserList.py”,第 16 行,在 repr 中
def repr(self): return repr(self.data)
文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py”,第 109 行,在数据中
self.todo.ask()
文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py”,第 566 行,在 ask 中
self._data = Body(self.pre_calculations, self).ask()
文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py”,第 686 行,在 ask 中
self._data = literal.lua.ask()
文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyEngine.py”,第 909 行,在 _
调用(子目标)
文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyEngine.py”,第 664 行,在调用中
todo.do() # 获取 thunk 并执行它
文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyEngine.py”,第 640 行,在 do
self.thunk()
文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyEngine.py”,第 846 行,位于
aggregate.complete(base_subgoal, 子目标))
文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py”,第 820 行,完整
结果 = [ 元组 (l.terms) for l in list(base_subgoal.facts.values())]
AttributeError: 'bool' 对象没有属性 'values'
这是什么意思?做错了什么? running_sum_(和rank_)参数——'group_by'和'order_by'共享的关系是什么?
由于网络上似乎没有示例,因此非常感谢 rank_ 和 running_sum_ 用法的 2 或 3 个简短示例。
聚合子句分两步解决:
- 首先解决子句中的未知数,同时忽略聚合函数
- 然后对结果应用聚合函数
第一个子句的写法如下:
(p[None]==min_(Y, order_by=Y)) <= Y.in_((4,6,2))
p后方括号内的变量作为SQL中的"group by",也必须出现在子句正文中。在这种情况下,它不会变化,所以我使用 None。当您想要检索不同于您订购的值的另一个值时,需要 order_by 变量。
假设您要检索每个 class 学校中最小学生的姓名。基本谓词将是 pupil(ClassName, Name, Age)
.
+ pupil('1A', 'John', 8)
+ pupil('1B', 'Joe', 9)
聚合子句为:
(younger[ClassName] == min_(Name, order_by= Age)) <= pupil(ClassName, Name, Age)
查询将是:
(younger[ClassName]==X)
我一直在尝试各种聚合函数来感受它们,在过去几天感到困惑之后,我需要澄清一下。我要么得到完全不直观的行为,要么得到无用的错误。比如我测试:
(p[X]==min_(Y, order_by=Z)) <= Y.in_((4,6,2)) & Z.in_((6 ,))
查看示例输出:
p[0]==X,Y,Z ([(6,)], [4, 6, 2], [6, 6, 6])
p[1]==X,Y,Z ([(6,)], [6, 4, 2], [6, 6, 6])
p[2]==X,Y,Z ([(6,)], [4, 2, 6], [6, 6, 6])
- 为什么最低是6? 2、为什么Z绑定的值重复了3次? 3. 'order_by' 与从中找到最小值的列表相关的确切目的是什么? 4. 如果 'order_by' 列表中有多个值,为什么输出会发生变化;为什么特定值--6,在这种情况下--在'order_by'列表中会影响输出?另一个例子:
(p[X]==min_(Y, order_by=Z)) <= Y.in_((4,6,2)) & Z.in_((0 ,))
输出:
p[0]==X,Y,Z ([(6,)], [4, 6, 2], [0, 0, 0])
p[1]==X,Y,Z ([(6,)], [2, 6, 4], [0, 0, 0])
p[2]==X,Y,Z ([(2,)], [2, 6, 4], [0, 0, 0])
为什么 X 的输出会根据提供的索引从 6 变为 2?尽管在前面的示例中输出是错误的,但至少对于所使用的索引来说是一致的;只有一个 min/max,这使得 since.
我至少可以使用 min_、max_、sum_ 函数查看输出;但是,当谈到 rank_ 和 running_sum_ 时,我迷路了。我在定义函数时遵循类似的过程:
(p[X]==running_sum_(Z, group_by=Z, order_by=Z)) <= Z.in_((43,34, 65))
我尝试查看输出:
p[0]==X
我收到错误:
回溯(最后一次调用): 文件“”,第 1 行,位于 文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/UserList.py”,第 16 行,在 repr 中 def repr(self): return repr(self.data) 文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py”,第 109 行,在数据中 self.todo.ask() 文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py”,第 566 行,在 ask 中 self._data = Body(self.pre_calculations, self).ask() 文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py”,第 686 行,在 ask 中 self._data = literal.lua.ask() 文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyEngine.py”,第 909 行,在 _ 调用(子目标) 文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyEngine.py”,第 664 行,在调用中 todo.do() # 获取 thunk 并执行它 文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyEngine.py”,第 640 行,在 do self.thunk() 文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyEngine.py”,第 846 行,位于 aggregate.complete(base_subgoal, 子目标)) 文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py”,第 820 行,完整 结果 = [ 元组 (l.terms) for l in list(base_subgoal.facts.values())] AttributeError: 'bool' 对象没有属性 'values'
这是什么意思?做错了什么? running_sum_(和rank_)参数——'group_by'和'order_by'共享的关系是什么?
由于网络上似乎没有示例,因此非常感谢 rank_ 和 running_sum_ 用法的 2 或 3 个简短示例。
聚合子句分两步解决:
- 首先解决子句中的未知数,同时忽略聚合函数
- 然后对结果应用聚合函数
第一个子句的写法如下:
(p[None]==min_(Y, order_by=Y)) <= Y.in_((4,6,2))
p后方括号内的变量作为SQL中的"group by",也必须出现在子句正文中。在这种情况下,它不会变化,所以我使用 None。当您想要检索不同于您订购的值的另一个值时,需要 order_by 变量。
假设您要检索每个 class 学校中最小学生的姓名。基本谓词将是 pupil(ClassName, Name, Age)
.
+ pupil('1A', 'John', 8)
+ pupil('1B', 'Joe', 9)
聚合子句为:
(younger[ClassName] == min_(Name, order_by= Age)) <= pupil(ClassName, Name, Age)
查询将是:
(younger[ClassName]==X)