5

我还在思考如何将Datalog程序的递归转换成SQL,比如

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

其中A/1是 EDB 谓词。P因此,和之间存在相互依赖关系Q。对于更长的查询,如何解决这个问题?

此外,有没有系统完全实现翻译?如果有,我可以知道我可以参考什么系统或哪篇论文吗?

4

3 回答 3

1

如果您采用“列出”先前结论和对这些结论进行前向链推理的方法来推断新结论,则不需要递归“深度”。

请记住,Datalog 需要对规则和变量进行一些限制,以确保有限终止并因此得出有限多个结论。例如,变量必须具有有限范围的可能值。

假设您的示例是指常量而不是变量:

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

一个问题是您希望A/1实现为扩展存储过程或外部代码。为此,我建议列出调用A所有可能参数(无限多)的所有结果。毕竟,这些都是您系统的结论(可证明的陈述)。

一旦完成,前向链接推理就会迭代而不是递归地进行。在每一步考虑每条规则,如果它产生一个新的结论,则将其与先前获得的(列出的)结论的前提(右侧)一起应用。如果在当前步骤中没有规则产生新的结论,则停止。证明程序已完成。

在您的示例中,证明在所有事实都被引用后停止A,因为没有结论足以应用任一规则来获得新结论。

于 2011-07-05T14:07:50.697 回答
0

一种可能的方法是在 SQL 中使用递归 CTE,它提供传递闭包的能力。关系代数 + 传递闭包 = Datalog。

于 2019-10-21T23:53:01.147 回答
0

Logica做了这样的事情。它将一种类似数据日志的语言翻译成用于 Google BigQuery、PostgreSQL 和 SQLite 的 SQL。

于 2022-02-12T18:57:49.040 回答