从Datalog转换为SQL

时间:2011-07-01 10:04:22

标签: sql translation datalog

我仍然在考虑如何将Datalog程序的递归转换为SQL,例如

P(x,y) <- Q(x,y).
Q(x,y) <- P(x,z), A(y).

其中A/1是EDB谓词。这样,PQ之间存在共同依赖关系。对于更长的查询,如何解决这个问题?

而且,有没有系统完全实现翻译?如果有,我可以知道我可以参考哪种系统或哪种纸张?

2 个答案:

答案 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,它们提供传递闭包的功能。关系代数+传递闭包=数据记录。