29

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

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

4

3 回答 3

27

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

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

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

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

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

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

于 2015-03-22T13:42:08.363 回答
6

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

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

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

于 2019-06-26T21:21:52.773 回答
4

从计算的角度来看,两种模型之间存在很大差异。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 中那样无限循环。

于 2019-11-03T10:12:39.497 回答