首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图DB对Prolog (或miniKanren)

图DB对Prolog (或miniKanren)
EN

Stack Overflow用户
提问于 2015-03-22 09:44:39
回答 3查看 4.3K关注 0票数 30

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-22 13:42:08

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

在某种程度上,您是正确的,它们在概念上都相当于图存储和图查询。但是对于逻辑编程来说,它只是概念上的图形查询,并不能保证它实际上是以这种方式存储的(使用neo4j,它是这样的)。

其次,通过逻辑编程,您通常尝试建立允许您通过大量数据进行推理的horn clauses。你可以把喇叭条款看作一条简单的规则,比如“如果一个人是男性,并且是一个亲生孩子的直接祖先,那就意味着他是一个父亲”。在使用neo4j的密码中,您将描述希望匹配的图形模式,这将产生数据,例如:

代码语言:javascript
复制
 MATCH (p:Person)-[:father*]->(maleAncestor:Person)
 RETURN maleAncestor

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

逻辑编程语言通常通过predicate resolution工作。一种图形查询语言(如cypher )通过模式匹配和显式路径指定相结合的方式工作。他们很不一样。

票数 27
EN

Stack Overflow用户

发布于 2019-06-26 21:21:52

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

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

像Datomic这样的语言使用prolog (Datalog)的一个子集作为它的查询语言,并且可能稍微更兼容您的想法,但即使这样,也远没有像neo4j这样的标有标签的属性图(LPG)。一个很大的区别是,节点之间的“标记边”具有属性,(据我所知)在任何情况下都不是一阶概念,而是液化石油气( LPG )。虽然你可以用例如描述这些边或节点之间的关系。一个连接表来创建多到多的关系,它们在类似于neo4j的东西中流动得更多。

票数 6
EN

Stack Overflow用户

发布于 2019-11-03 10:12:39

从计算的角度来看,这两种模型有很大的不同。Prolog是图灵完整的,这意味着原则上任何其他语言的程序都可以翻译成Prolog。

然而,Neo4j查询语言*Cypher,以及一般大多数数据库查询语言,都不是图灵完整的,因此不适合表示任何通用程序。这有正反两方面。主要的缺点是,您通常需要将Neo4j上的功能与Python或任何其他语言中的外部程序结合起来,才能生成有用的应用程序。主要的好处是,Cypher中的所有查询都正在终止(尽管它们可能需要很长时间才能完成),这对于数据库查询来说是一个非常好的属性;当您查询数据库时,您总是期望得到一个答案。

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

代码语言:javascript
复制
 p(X):-p(X).

像p(a)这样的目标会导致不终止的计算。这是你拥有图灵完整语言的全部能力所必须付出的代价。

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

例如,Datalog中的前一个程序

代码语言:javascript
复制
  p(X):-p(X).

对于相同的目标p(a),容易生成空集{},而不是像Prolog中那样无限地循环。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29192927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档