【问题标题】:Is there a way to translate database table rows into Prolog facts?有没有办法将数据库表行转换为 Prolog 事实?
【发布时间】:2011-11-17 18:58:07
【问题描述】:

在做了一些研究之后,我对 Prolog 以非常简单的方式表达查询的能力感到惊讶,就像口头告诉机器该做什么一样。发生这种情况是因为我对工作中的 Propel 和 PHP 感到非常厌烦。

所以,我一直想知道是否有办法将数据库表行(例如 Postgres)转换为 Prolog 事实。这样一来,我就可以停止使用这么多无聊的连接并使用 ORM,而是编写类似这样的东西来获得我想要的东西:

mantenedora_ies(ID_MANTENEDORA, ID_IES) :- 
  papel_pessoa(ID_PAPEL_MANTENEDORA, ID_MANTENEDORA, 1),
  papel_pessoa(ID_PAPEL_IES, ID_IES, 6),
  relacionamento_pessoa(_, ID_PAPEL_IES, ID_PAPEL_MANTENEDORA, 3).

要了解我为何感到无聊,请查看this post。前面的这些简单行将替换那里的代码,更容易阅读和理解。我只是对此感到好奇,因为这里不可能更换东西。

如果可以在 PHP 中完成类似的事情,那也太酷了。有谁知道这样的事情吗?

【问题讨论】:

  • 谢谢@starblue,语言也是重点。但是,它能否与真实数据库集成,将最后一个数据库变成事实数据库?
  • 最新版本的 DES (fdi.ucm.es/profesor/fernan/des) 可以访问 ODBC 并提供 Datalog/SQL 之间的互操作性
  • 谢谢@chac。我周末去看看。

标签: database postgresql prolog


【解决方案1】:

检查 swi-prolog 的 ODBC 接口(也许其他 prolog 实现也有等效的东西)

http://www.swi-prolog.org/pldoc/doc_for?object=section%280,%270%27,swi%28%27/doc/packages/odbc.html%27%29%29

【讨论】:

  • 哇,感谢您的快速回答,我会尽快查看此文档。
  • 可能是我看错了,因为它很快,但是使用这个ODBC接口,仍然需要编写类似SQL的语句来查询数据库吗?
  • (现在迟到的答案 xd)确实,您需要在 prolog 中构造 SQL 查询以与数据库交互。我相信您可以编写非常简单的查询,只是为了传输数据并让 prolog 完成“真正的”工作(或者您可以编写复杂的查询并使用非常简单的 prolog 谓词,但这有点毫无意义 xd)。例如,不要写 SELECT * FROM members WHERE id=foo,而是写 SELECT * FROM members,在 prolog 中翻译它,然后使用模式匹配来选择正确的成员。
  • @ThanosQR:从查询中删除过滤器效率非常低!
  • 我可以以某种方式只选择查询中涉及的表。但是维护prolog数据库和数据库本身同步呢?
【解决方案2】:

我可以想到一些方法来解决这个问题 -

  1. 在初始化时,调用一个从表中选择所有数据并将其声明到数据库中的方法。对每个数据库执行此操作。您需要将每行的形状声明为:- 动态 ies_row/4 等

  2. 您可以通过覆盖 user:prolog_load_files 来修改 load_files。从这个活动中,你可以得到类似于#1 的东西。这样做的好处是看起来像一个 load_files 调用。 http://www.swi-prolog.org/pldoc/man?predicate=prolog_load_file%2F2 ... 这个文档提到了库(http_load),但我在任何地方都找不到这个(我最近对此很感兴趣)!

【讨论】:

  • 谢谢@DaveEdelstein。关于这些方法:1)我可以以某种方式只选择查询中涉及的表。但是维护prolog数据库和数据库本身同步呢? 2)我还是要找这个文档,但是是关于读取数据库文件的吗?
【解决方案3】:

Draxler Prolog to SQL 编译器,它将某些模式(如您编写的连词)转换为更详细的 SQL 连接。您可以在相关帖子 (prolog to SQL converter) 中找到更多信息。

但请注意,Prolog 也有其弱点,尤其是在聚合方面。如果没有库,获得总和、计数等并不是很容易。而且这样的库并不常见,也不太容易使用。

我认为您可以尝试使用允许缩短查询文本的内置功能(当这导致代码更具可读性时)专门针对 equijoins 使用 PHP DB 接口。在 SWI-Prolog / ODBC 中工作,其中(如在 PHP 中)您需要编写 SQL,我发现自己以这种方式工作,以处理与您在另一篇文章中显示的非常相似的事情。

我发现另一种有用的方法:我为 MySQL 备份接口(实际上是 PHPMyAdmin)使用的 SQL 子集编写了一个解析器。所以我经常在本地转储我的 CMS 数据库,加载它的内存,应用我需要的任何职责任务,计算和编写(或应用)插入/更新/删除语句,然后上传这些。由于适合内存的数据库大小有限,因此可以做到这一点。我已经开发了,现在我正在用这种幼稚的方法维护this 小型电子商务。

从 PHP 编写 Prolog 应该不会太难:我会尝试修改现有的接口,比如很棒的 Adminer,它已经提供了基本序列化格式的选择。

【讨论】:

  • 非常感谢@chac。这是一个有趣的想法,但我想避免转换为 SQL。换句话说,我想要的是将一个数据库抽象为 Prolog 数据库。我只是将一些事实(表格行)写入文件,这就是我想要自动化的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 2020-04-09
  • 2022-07-06
  • 2020-01-10
  • 1970-01-01
相关资源
最近更新 更多