Neo4j 图形数据库与Prolog(或miniKanren)

Neo4j 图形数据库与Prolog(或miniKanren),neo4j,prolog,graph-databases,minikanren,Neo4j,Prolog,Graph Databases,Minikanren,最近,我一直在研究Neo4j等图形数据库,以及Prolog和miniKanren中的逻辑编程。根据我到目前为止所了解的情况,两者都允许指定事实和它们之间的关系,还可以查询结果系统中的一些选择。所以,实际上我看不出它们之间有什么区别,它们都可以用来构建一个图并查询它,但是使用不同的语法。然而,它们被表示为完全不同的软件类型 除了数据库可能会提出一种更具时空效率的存储技术这一技术问题,以及miniKanren这样的微型逻辑核心更简单、更可嵌入之外,如果图形数据库和逻辑编程语言都只是一个图形数据库+查

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


除了数据库可能会提出一种更具时空效率的存储技术这一技术问题,以及miniKanren这样的微型逻辑核心更简单、更可嵌入之外,如果图形数据库和逻辑编程语言都只是一个图形数据库+查询API,那么它们之间的实际区别是什么,这些东西所体现的逻辑编程与neo4j完全不同

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

第二,在逻辑编程中,您通常试图建立一个允许您通过大量数据进行推理的逻辑。你可以把horn从句看作是一条简单的规则,比如“如果一个人是男性,并且是一个亲生子女的直系祖先,这意味着这个人是父亲”。在使用neo4j的cypher中,您可以描述一个您希望匹配的图形模式,该模式会产生数据,例如:

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


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

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

然而,虽然prolog可以抽象地描述相同的数据集,但它通常在小数据集上运行,并在内存中执行扫描。它不是一个数据库,当然也不适合与数据库所遇到的许多/大多数实时约束(即大量数据库写入)一起扩展


像Datomic这样的语言使用prolog(Datalog)的一个子集作为其查询语言,可能更符合您的想法,但即使这样,也远不是像neo4j这样的标记属性图(LPG)。一个很大的区别是,节点之间带有属性的“标记边”(据我所知)在LPG中不是一阶概念。虽然您可以使用连接表等来描述这些边或节点之间的关系,以创建多对多关系,但它们在neo4j中更具流动性。

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

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

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

 p(X):-p(X).
像p(a)这样的目标导致了一个非终止计算。这就是拥有图灵完备语言的所有功能所要付出的代价

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

例如,数据日志中的前一个程序

  p(X):-p(X).

使用相同的目标p(a),很容易产生答案的empy集{},而不是像Prolog那样无限循环。

Prolog是一种编程语言,而图形数据库只是一个数据库。使用Prolog可以完成的大多数事情都不可能只用一个数据库来完成。例如,使用Prolog可以构建一个像SWI Prolog那样的Web服务器,但仅使用数据库引擎是不可能的。将存储过程和触发器添加到图形数据库中,加载一些解析为属性AST的源代码(这是一个本机图形),您将得到db执行或转换这一伟大的答案。。。我想到了两件事:(1)demorgan规则将析取转化为蕴涵,因此任何horn子句集都应该同构于某个有向图,其中所有箭头都是蕴涵(这可以适用于neo db)。(2) 解释neo数据库的元图会产生节点标签、关系类型和属性之间的关系,这些关系可以很容易地用形式逻辑表示并由推理机处理。我想说的是