我一直在玩各种聚合功能以感受它们,在过去几天感到困惑后,我需要澄清。我或者得到完全不直观的行为或无益的错误。例如,我测试:
(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])
(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_,sum_函数查看输出;但是,当涉及到rank_和running_sum_时,我迷失了。我在定义函数时遵循类似的过程:
(p [X] == running_sum_(Z,group_by = Z,order_by = Z))< = Z.in _((43,44,65))
我尝试查看输出:
P [0] == X
我收到错误:
追踪(最近一次通话): 文件“”,第1行,in 文件“/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行,在询问中 self._data = Body(self.pre_calculations,self).ask() 文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py”,第686行,在询问中 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行,在 self.thunk() 文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyEngine.py”,第846行,in aggregate.complete(base_subgoal,subgoal)) 文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py”,第820行,完整 result = [tuple(l.terms)for l in list(base_subgoal.facts.values())] AttributeError:'bool'对象没有属性'values'
这是什么意思?做错了什么? running_sum_(和rank_)参数共享的关系是什么 - “group_by”和“order_by”?
由于网上似乎没有示例,因此非常感谢2或3个rank_和running_sum_用法的简短示例。
答案 0 :(得分:0)
聚合子句分两步解决:
以下是编写第一个句子的方法:
(p[None]==min_(Y, order_by=Y)) <= Y.in_((4,6,2))
p后括号中的变量用作&#34;组&#34;在SQL中,还必须出现在子句的主体中。在这种情况下,它不会改变,所以我使用无。当您想要检索另一个值而不是您订购的值时,需要order_by变量。
让我们假设您要检索每个班级中最年轻学生的姓名。基本谓词为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)