non*_*com 20 prolog neo4j graph-databases minikanren
最近我一直在研究像Neo4j这样的图形数据库,以及Prolog和miniKanren中的逻辑编程.根据我迄今所学到的知识,它们都允许指定它们之间的事实和关系,并且还可以查询生成的系统以进行某些选择.所以,实际上我看不出它们之间的差别很大,因为它们都可以用来构建图形并查询它,但是使用不同的语法.但是,它们是完全不同的软件.
除了数据库可能提出更多时空有效存储技术的技术性,除了像miniKanren这样的微小逻辑核心更简单和可嵌入之外,图形数据库和逻辑编程语言之间的实际区别是什么,如果它们都只是一个图形数据库+查询API?
Fro*_*its 19
不,这些东西和neo4j所体现的逻辑编程是完全不同的.
在一个层面上,你是对的,它们在概念上都相当于图形存储和图形查询.但是对于逻辑编程来说,它只是概念上的图形查询,并不能保证它实际上是以这种方式存储的(neo4j就是这样).
其次,通过逻辑编程,您通常会尝试建立允许您通过大量数据推理的反对条款.你可以把喇叭条款想象成一个简单的规则,比如"如果一个人是男性,并且是生物学孩子的直接祖先,则暗示这个人是父亲".在使用neo4j的密码中,您将描述您希望匹配的图形模式,从而产生数据,例如:
MATCH (p:Person)-[:father*]->(maleAncestor:Person)
RETURN maleAncestor
Run Code Online (Sandbox Code Playgroud)
这告诉我们通过father
关系遍历图形,并返回男性祖先.在逻辑编程语言中,你不会这样做.你可以指定a
作为男性的b
手段之父a
,并且a
是其祖先b
.对于所有有效的a/b配对,这将隐含地和传递地说明.然后你会问一个问题,"谁是男性祖先"?然后,编程环境将通过利用您的规则来回答这个问题.这将通过与我上面指定的密码非常相似的数据构建遍历的效果,但是您了解数据和构建遍历的方式完全不同.
逻辑编程语言通常通过谓词解析来工作.像cypher这样的图形查询语言通过模式匹配和显式路径指定的组合来工作.他们非常不同.
图数据库和逻辑编程之间有一些非常酷的相似之处。你把这两者联系起来真是太聪明了。
然而,虽然它们抽象地能够描述相同的数据集,但 prolog 通常对小数据集进行操作并在内存中执行扫描。它不是一个数据库,当然不适合随着数据库运行的许多/大多数实时约束进行扩展——即大量的数据库写入。
像 Datomic 这样的语言使用 prolog (Datalog) 的一个子集作为其查询语言,并且可能与您的想法稍微更兼容,但即便如此,它也与像 neo4j 这样的标记属性图 (LPG) 相去甚远。一个很大的区别是节点之间的“标记边”,具有属性,不是(据我所知)除了液化石油气之外的任何东西的一阶概念。尽管您可以使用例如来描述节点之间的这些边或关系。一个用于创建多对多关系的连接表,它们在像 Neo4j 这样的东西中更加流畅。
从计算的角度来看,两种模型之间存在很大差异。Prolog 是图灵完备的,这意味着原则上任何其他语言的任何程序都可以翻译成 Prolog。
然而,Neo4j 查询语言 *Cypher 以及一般大多数数据库查询语言都不是图灵完备的,因此不适合表示任何通用程序。这有优点也有缺点。主要缺点是您通常需要将 Neo4j 的功能与 Python 或任何其他语言的外部程序结合起来才能生成有用的应用程序。主要优点是 Cypher 中的所有查询都会终止(尽管它们可能需要很长时间才能完成),这对于数据库查询来说是一个非常好的属性;当您查询数据库时,您总是期望得到答案。
这在 Prolog 中不会发生。一个简单的程序,例如
p(X):-p(X).
Run Code Online (Sandbox Code Playgroud)
像 p(a) 这样的目标会导致不间断的计算。这是拥有图灵完备语言的所有功能所必须付出的代价。
如果您想查看另一个相关范例(介于 Prolog 和 Neo4j 之间),请查看演绎数据库,例如Datalog。Datalog 的语法与 prolog 类似(实际上它是一个子集),但是与数据库查询语言类似,Datalog 中的目标/查询总是终止的。
例如之前Datalog中的程序
p(X):-p(X).
Run Code Online (Sandbox Code Playgroud)
具有相同的目标 p(a),可以轻松生成答案的空集 {},而不是像 Prolog 中那样无限循环。