我仍然在考虑如何将Datalog程序的递归转换为SQL,例如
P(x,y) <- Q(x,y).
Q(x,y) <- P(x,z), A(y).
其中A/1
是EDB谓词。这样,P
和Q
之间存在共同依赖关系。对于更长的查询,如何解决这个问题?
而且,有没有系统完全实现翻译?如果有,我可以知道我可以参考哪种系统或哪种纸张?
答案 0 :(得分:1)
如果采用“制表”先前结论和前向推理的方法来推断新的结论,则不需要递归的“深度”。
请记住,Datalog需要对规则和变量进行一些限制,以确保有限终止,从而得出有限的结论。例如,变量必须具有有限范围的可能值。
让我们假设您的示例引用常量而不是变量:
P(x,y) <- Q(x,y).
Q(x,y) <- P(x,z), A(y).
一个问题是,您希望将A/1
实现为扩展存储过程或外部代码。为此,我建议在所有可能的参数(有限多个)上对所有调用A
的结果进行制表。毕竟这些是您系统的结论(可证明的陈述)。
一旦完成,前向链接推断就会迭代而不是递归地进行。在每个步骤中考虑每个规则,将其应用于先前获得(表格)结论的前提(右侧),如果它产生新的结论。如果当前步骤中没有规则产生新结论,则停止。证明程序已经完成。
在您的示例中,在所有A
事实被引用后,证据都会停止,因为没有足够的结论可以应用任何一条规则来得出新的结论。
答案 1 :(得分:0)
一种可能的方法是在SQL中使用递归CTE,它们提供传递闭包的功能。关系代数+传递闭包=数据记录。