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