最近我一直在研究像Neo4j这样的图形数据库,以及Prolog和miniKanren中的逻辑编程。根据我到目前为止所学到的,它们都允许指定事实和它们之间的关系,并且还查询结果系统以进行一些选择。所以,实际上我看不出它们之间有太大的区别,因为它们都可以用来构建图形并查询它,但使用不同的语法。但是,它们是完全不同的软件。
除了数据库可能提出更多时空有效存储技术的技术性,除了像miniKanren这样的微小逻辑核心更简单和可嵌入之外,图形数据库和逻辑编程语言之间的实际区别是什么,如果它们都只是一个图形数据库+查询API?
不,这些东西和neo4j所体现的逻辑编程是完全不同的。
在一个层面上,你是对的,它们在概念上都相当于图形存储和图形查询。但是对于逻辑编程,它只是概念上的图形查询,并不能保证它实际存储的方式(neo4j的存储方式)。
其次,通过逻辑编程,您通常会尝试建立 喇叭条款 允许您推理大量数据。你可以把喇叭条款想象成一个简单的规则,比如“如果一个人是男性,并且是生物学孩子的直接祖先,则暗示这个人是父亲”。在使用neo4j的密码中,您将描述一个您希望匹配的图形模式,从而产生数据,例如:
MATCH (p:Person)-[:father*]->(maleAncestor:Person)
RETURN maleAncestor
这告诉我们遍历图表 father
关系,并回归男性祖先。在逻辑编程语言中,你不会这样做。你可以指定一下 a
作为...的父亲 b
意思是 a
是男性,和 a
是...的祖先 b
。对于所有有效的a / b配对,这将隐含地和传递地说明。然后你会问一个问题,“谁是男性祖先”?然后,编程环境将通过利用您的规则来回答这个问题。这将通过与我上面指定的密码非常相似的数据构建遍历的效果,但是您了解数据和构建遍历的方式完全不同。
逻辑编程语言通常可以通过 谓词解析。像cypher这样的图形查询语言通过模式匹配和显式路径指定的组合来工作。他们是非常不同的。