最近,我一直在研究像Neo4j这样的图形数据库,以及Prolog和miniKanren中的逻辑编程。从我到目前为止所了解到的,两者都允许指定事实和它们之间的关系,也允许查询结果系统中的一些选择。所以,实际上,我看不出它们之间有多大的区别,因为它们都可以用来构建一个图形并查询它,但是使用不同的语法。然而,它们被呈现为完全不同类型的软件。
除了数据库可能会提出一种更加时空有效的存储技术之外,除了miniKanren这样的小逻辑核更简单和可嵌入之外,如果它们都只是一个图形数据库+查询API,那么图形数据库和逻辑编程语言之间的实际区别是什么呢?
发布于 2015-03-22 13:42:08
不,那些东西和neo4j所体现的逻辑编程是完全不同的。
在某种程度上,您是正确的,它们在概念上都相当于图存储和图查询。但是对于逻辑编程来说,它只是概念上的图形查询,并不能保证它实际上是以这种方式存储的(使用neo4j,它是这样的)。
其次,通过逻辑编程,您通常尝试建立允许您通过大量数据进行推理的horn clauses。你可以把喇叭条款看作一条简单的规则,比如“如果一个人是男性,并且是一个亲生孩子的直接祖先,那就意味着他是一个父亲”。在使用neo4j的密码中,您将描述希望匹配的图形模式,这将产生数据,例如:
MATCH (p:Person)-[:father*]->(maleAncestor:Person)
RETURN maleAncestor这告诉我们要通过father关系遍历图表,并返回男性祖先。在逻辑编程语言中,您不会这样做。您可以指定a是b的父亲,意味着a是男性,a是b的祖先。这将隐式和过渡地表明,对于所有有效的a/b配对。然后你会问一个问题,“谁是男性祖先”?然后,编程环境将通过利用您的规则来回答这个问题。这将产生通过数据构建遍历的效果,这些数据非常类似于上面指定的cypher,但是您理解数据和构建遍历的方式完全不同。
逻辑编程语言通常通过predicate resolution工作。一种图形查询语言(如cypher )通过模式匹配和显式路径指定相结合的方式工作。他们很不一样。
发布于 2019-06-26 21:21:52
在图形数据库和逻辑编程之间有一些非常酷的相似之处。你把这两者联系在一起真是太聪明了。
然而,尽管prolog能够抽象地描述相同的数据集,但它通常对小型数据集进行操作,并在内存中执行扫描。它不是一个数据库,当然也不适合与运行在- namely上的数据库的许多/大部分实时约束进行扩展--大量的数据库写入。
像Datomic这样的语言使用prolog (Datalog)的一个子集作为它的查询语言,并且可能稍微更兼容您的想法,但即使这样,也远没有像neo4j这样的标有标签的属性图(LPG)。一个很大的区别是,节点之间的“标记边”具有属性,(据我所知)在任何情况下都不是一阶概念,而是液化石油气( LPG )。虽然你可以用例如描述这些边或节点之间的关系。一个连接表来创建多到多的关系,它们在类似于neo4j的东西中流动得更多。
发布于 2019-11-03 10:12:39
从计算的角度来看,这两种模型有很大的不同。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中那样无限地循环。
https://stackoverflow.com/questions/29192927
复制相似问题