【问题标题】:translation from Datalog to SQL从 Datalog 到 SQL 的转换
【发布时间】:2011-07-01 10:04:22
【问题描述】:

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

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

其中A/1 是一个EDB 谓词。这就是PQ 之间的相互依赖关系。对于较长的查询,如何解决这个问题?

另外,有没有完全实现翻译的系统?如果有,请问我可以参考什么系统或哪篇论文?

【问题讨论】:

  • 这个例子应该更正了。注意变量 y 没有出现在第二条规则的前提中,尽管它被用在了头部。数据记录是restricted so that all programs terminate。您是在询问消除递归以获得(可能)单个 SQL 查询等效项的方法,还是在考虑在 SQL 上下文中实现递归,这可能(有严重限制)使用存储过程?
  • @hardmath:抱歉,错字...谢谢指正。是的,我想用SQL实现递归,可以吗?
  • 这是可能的,但我们可能会受到直接递归深度的限制。例如,MS SQL Server 2008 限制 the nesting depth of stored procedure calls to 32。演示一个概念可能就足够了,但不适用于生产应用程序。请注意,MS SQL Server 确实允许调用外部编码(扩展存储过程),其中调用的嵌套不受监控。
  • 您可能对递归的间接方法感兴趣,其中重复应用“数据记录”规则以推断新结果,并且这些可以插入到一个或多个表中,直到没有新的推导可能。
  • @hardmath:这就是我的想法!递归将在程序上完成,而不是在 SQL 上......但是,如果存在非平凡的依赖关系,这对我来说仍然如此难以管理......

标签: sql translation datalog


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 在这种情况下,它可能会起作用,但是在更大的非平凡递归的情况下呢?
  • 我概述的是一个过程,为了符合 Datalog 程序,将推导出所有(无限多)可证明的结论。如果您将A/1 等“终端”谓词作为外部代码实现,这些谓词将作为简单事实处理,即在所有可能的输入上存储调用它们的任何成功结果(请记住,在 Datalog 中,任何变量的范围都是有限的)。所以这个“皱纹”可以归结为标准的 Datalog 事实和规则。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2019-03-08
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多