我想编写一个使用 Prolog 查询 RDF 三元组的 Python Web 应用程序。 我找到了pyswip,用于将Python与SWI-Prolog接口,我目前正在研究SWI-Prolog的RDF功能。 我想知道以前是否有人尝试过这个 - 如果有人尝试过:你的设置是什么样的? 你如何让pyswip与SWI-Prolog语义Web库一起工作? 或者有没有另一个Python-Prolog接口可以简化此操作?
编辑:
我实际上找到了一个非常好的解决方案。 我以前使用过AllegroGraph 3.3 Python API对RDF数据进行Prolog查询,但我认为他们对Allegro Common Lisp的Prolog扩展有点缺乏,因为它缺少数字比较运算符之类的东西。 从那以后,我尝试了 AllegroGraph 4.6,我发现他们的 Prolog 扩展中缺少的任何内容都可以通过以下事实来弥补:您可以使用 lisp
转义函子编写 Allegro Common Lisp 表达式来处理您需要执行的任何操作,而 Prolog 扩展没有提供。 出于某种原因,当我使用 AllegroGraph 3.3 Python API 时,没有定义这个函子,但显然 Allegro 的开发人员从那时起已经走了很长一段路。
我建议任何想要构建一个使用Prolog查询RDF数据的Python Web应用程序的人。 它超级快,超级强大。
使用pyswip,尽管前段时间我看过它。你的问题很有吸引力,pyswip 看起来很有吸引力,尤其是"pythonic"界面。
然后我设法安装,但是完成后(我不得不调整安装"说明",因为我正在运行一个相当最新的SWI-Prolog),我无法运行简单的介绍性示例而不会引起奇怪的问题:示例声明中的错误arity,SWI-Prolog抱怨2^断言上的术语引用处理不当,等等。而且我找不到任何文档....
我建议使用Boost.Python和C++SWI-Prolog FLI(外语界面)。
也许我们只需要一种方法:比如PrologEngine.call(TermArray),映射到call/N,以完全访问丰富的Prolog库(其中包括SemWeb),以及一些反射性调用。
也就是说,我认为这不是一项微不足道的任务,也许 pyswip 提供了更好的方法,一旦调试......
我可能有兴趣合作编写一些东西,我知道一些 Boost 和 C++ FLI,但我不是 Python 程序员,只是用它来制作 Google Docs 的原型使用(或者更好的是,只是电子表格)......
OTOH 我喜欢用 Prolog 写作,现在,题外话,我会题外话,并向你提出一个稍微不同的方法:使用 SWI-Prolog 的 HTTP 服务器功能在逻辑和表示之间制作一个更独特的接口(即更多的 MVC)。
编写一个公开为 (X)HTML (+JSON+SVG+...) 的服务器,并在 python 中使用(或解析)输出。一种 RPC。
这样,逻辑将被强解耦,然后大大提高可重用性。当然,如果你对三元组"in se"不感兴趣,而是对它们的语义感兴趣,这是有道理的。
我认为调试也可以容易得多,总是由于解耦。Jan Wielemaker,主要的SWI-Prolog开发人员,经常建议利用复杂引擎一起运行的行为的困难,如Java(我认为Python会类似)和Prolog,特别是当涉及多线程时(总是,如果我们想到它的话)。今天,将使用多线程。
我没有使用pyswip的经验。 但供您参考,SWI Prolog似乎非常有能力,因为我对库Knowrob有一些经验,这是用于机器人中的AI推理。 不确定这是否有帮助