图 DB 与 Prolog(或 miniKanren)

Posted

技术标签:

【中文标题】图 DB 与 Prolog(或 miniKanren)【英文标题】:A graph DB vs a Prolog (or miniKanren) 【发布时间】:2015-05-25 10:05:36 【问题描述】:

最近我一直在研究像 Neo4j 这样的图形数据库以及 Prolog 和 miniKanren 中的逻辑编程。从我目前所学的来看,两者都允许指定事实和它们之间的关系,还可以查询结果系统以获取一些选择。所以,实际上我看不出它们之间有多大区别,因为它们都可以用来构建图形并查询它,但使用不同的语法。但是,它们被呈现为完全不同类型的软件。

除了数据库可能提出更时空有效的存储技术的技术性,以及像miniKanren这样的微小逻辑核心更简单和可嵌入之外,图数据库和逻辑编程语言之间的实际区别是什么,如果它们都只是图数据库+查询API?

【问题讨论】:

Prolog 是一种编程语言,而图数据库只是一个数据库。使用 Prolog 可以完成的大多数事情仅靠数据库是不可能完成的。例如,使用 Prolog 可以构建像 SWI-Prolog web site 这样的网络服务器,但仅使用数据库引擎是不可能的。 将存储过程和触发器添加到图形数据库中,加载一些解析为属性 AST 的源代码(它本身就是一个图形),然后您将让您的数据库执行或转换此 AST 【参考方案1】:

不,那些东西所体现的逻辑编程和neo4j完全不同。

在一个层面上,您说得对,它们在概念上都相当于图形存储和图形查询。但是对于逻辑编程,它只是概念上的图形查询,并不能保证它实际上是以这种方式存储的(在 neo4j 中是这样)。

其次,通过逻辑编程,您通常会尝试建立horn clauses,以便您通过大量数据进行推理。您可以将 horn 子句视为一个简单的规则,例如“如果一个人是男性,并且是亲生孩子的直系祖先,则意味着该人是父亲”。在 Neo4j 的 cypher 中,您将描述您希望匹配的图形模式,它会产生数据,例如:

 MATCH (p:Person)-[:father*]->(maleAncestor:Person)
 RETURN maleAncestor

这告诉通过father 关系遍历图,并返回男性祖先。在逻辑编程语言中,您不会这样做。您可以指定ab 的父亲意味着a 是男性,而ab 的祖先。这将隐含地和传递地说明所有有效的 a/b 配对。然后你会问一个问题,“谁是男性祖先”?然后,编程环境将通过利用您的规则来回答这个问题。这将产生遍历数据的效果,这与我上面指定的密码非常相似,但是您理解数据和构建遍历的方式完全不同。

逻辑编程语言通常通过predicate resolution 工作。像 cypher 这样的图形查询语言通过模式匹配和显式路径指定的组合来工作。它们非常不同。

【讨论】:

很好的答案... 2 件事发生在我身上:(1)demorgan 规则将析取转换为蕴涵,因此任何一组 horn 子句都应该同构于所有箭头都是蕴涵的一些有向图(这可以安装在新数据库中)。 (2) 解释 Neo 数据库的元图会产生节点标签、关系类型和属性之间的关系,这些关系可以很容易地用形式逻辑表示并由推理器处理。我要说的是,虽然图查询和逻辑编程不同,但它们是兼容的并且可能是互补的 同意,它们是兼容的,并且是互补的,因为在受限模式 neo4j 图上实现推理器相对简单。但是大多数人在选择一种方法或另一种方法时,会隐含地选择一种特定的思考代码/数据的模型。他们可以触摸,但通常不会。 Prolog 的 N 元谓词在超图上看起来——它们看起来更像原生表示【参考方案2】:

图形数据库和逻辑编程之间有一些非常酷的相似之处。您将两者关联起来真是太聪明了。

然而,虽然它们能够抽象地描述相同的数据集,但 prolog 通常在小型数据集上运行并在内存中执行扫描。它不是数据库,当然也不适合在数据库运行时遇到的许多/大部分实时约束(即大量数据库写入)下进行扩展。

像 Datomic 这样的语言使用 prolog (Datalog) 的子集作为其查询语言,并且可能与您的想法稍微兼容,但即使这样也与 neo4j 这样的标签属性图 (LPG) 相去甚远。一个很大的区别是节点之间的“标记边缘”,具有属性,不是(据我所知)除了液化石油气之外的任何东西的一阶概念。尽管您可以使用例如描述这些边缘或节点之间的关系。用于创建多对多关系的连接表,它们在 neo4j 之类的东西中更加流畅。

【讨论】:

【参考方案3】:

从计算的角度来看,两种模型之间存在很大差异。 Prolog 是图灵完备的,这意味着原则上任何其他语言的任何程序都可以翻译成 Prolog。

但是,Neo4j 查询语言 *Cypher 以及通常的大多数数据库查询语言都不是图灵完备的,因此不适合表示任何通用程序。这有利有弊。主要缺点是您通常需要将 Neo4j 的强大功能与 Python 或任何其他语言的外部程序相结合,以生成有用的应用程序。主要优点是 Cypher 中的所有查询都终止(尽管它们可能需要很长时间才能完成)数据库查询的一个非常好的属性;当您查询数据库时,您总是期望得到答案。

这在 Prolog 中不会发生。一个简单的程序,如

 p(X):-p(X).

并且像 p(a) 这样的目标会导致非终止计算。这是拥有图灵完备语言的所有功能所必须付出的代价。

如果您想查看另一个相关的范例,它在某种程度上介于 Prolog 和 Neo4j 之间,请查看 演绎数据库,例如 Datalog。 Datalog 的语法类似于 prolog(实际上它是一个子集),但类似于数据库查询语言,Datalog 中的目标/查询总是终止的。

比如Datalog中之前的程序

  p(X):-p(X).

以相同的目标 p(a),轻松生成答案的空集合 ,而不是像 Prolog 中那样无限循环。

【讨论】:

以上是关于图 DB 与 Prolog(或 miniKanren)的主要内容,如果未能解决你的问题,请参考以下文章

Prolog Logic 与相邻房间

Prolog中定义图:边和路径,查找两个顶点之间是不是有路径

在prolog中查找图节点之间的距离

prolog表示不等式

Atitit.5gl 第五代语言编程语言 PROLOG教程  人工智能语言的标准 与实现

使用 Prolog 解决脑筋急转弯(Master Mind)