图形数据库及其技术生态系统可以为知识表示和推理问题提供优雅,有效的解决方案。 要了解这种说法,我们必须首先了解什么是图形。 图是一种数据结构。 图数据结构的类型很多,但出于本文的目的,我们将重点介绍一种已被称为属性图的类型 。 属性图表示顶点(节点,点)和边缘(弧,线)。 对属性图中的边进行定向和标记/键入(例如“马科知道彼得”)。 顶点和边缘(通常称为元素)都可以具有与之关联的任意数量的键/值对。 这些键/值对称为属性。 通过这种基础结构,可以回答一系列问题并解决问题。
对象建模
属性图数据结构的形式几乎与面向对象编程的对象图相同。 收集对象,删除它们的方法,然后剩下一个属性图。 对象的字段是原始字段,在这种情况下用作属性,或者它们很复杂,在这种情况下用作对其他对象的引用。 例如,在Java中:
class Person {String name;Integer age;Collection<Person> knows;
}
这个名字和年龄的属性是特定人实例的顶点属性和属性都知道指的知道标记的边缘给其他人。 Neo Technology的 Emil Eifrem拥护一种观点,即属性图与现代面向对象语言的语义以及开发人员使用的绘图技术保持一致,因此是“白板友好的”。 泰勒·科 万 ( Taylor Cowan )的jo4neo项目就是对这一想法的证明。 在jo4neo中,Java注释被优雅地用于允许Neo4j图形数据库支持Java对象图。 除了技术优势外,人类的思维还倾向于根据对象及其关系进行思考。 因此,图形也可以被认为是“对人脑友好的”。
给定一个对象图,可以回答有关领域的问题。 在称为Gremlin的图遍历DSL中 ,我们可以问对象图的问题:
// Who does Marko know?
marko.outE('knows').inV// What are the names of the people that Marko knows?
marko.outE('knows').inV.name// What are the names and ages of the people that Marko knows?
marko.outE('knows').inV.emit{[it.name, it.age]}// Who does Marko know that are 30+ years old?
marko.outE('knows').inV{it.age > 30}
概念建模
从组成模型的实例来看,可能存在抽象概念。 例如,尽管可能存在书籍实例,但也可能存在那些书籍所属的类别-例如科幻小说,技术小说,浪漫史等。图形是一种灵活的结构,因为它允许人们表达某种事物与某种事物相关其他的方式。 这些东西可能是真实的,也可能是空灵的。 这样,可以将本体论概念及其实例表示出来并进行适当查询以回答问题。
// What are the parent categories of history?
x = []; history.inE('subCategory').outV.aggregate(x).loop(3){!it.equals(literature)}; x// How many descendant categories does fiction have?
c = 0; fiction.outE('subCategory').inV.foreach{c++}.loop(3){true}; c// Is romance at the same depth as history?
c = 0; romance.inE('subCategory').outV.loop(2){c++; !it.equals(literature)}.outE('subCategory').inV.loop(2){c--; !it.equals(history)}; c == 0
自动推理
根据显式对象,它们之间的关系以及它们的抽象类别,可以制定推理过程。 图建模中存在的一种张力是要进行显式(结构化)和通过遍历(过程)进行推断的结果 。 就像许多计算一样,权衡是在空间和时间之间进行的。 如果某人与其共同作者之间存在优势,那么从该人与其共同作者之间只有一步之遥。 另一方面,如果必须通过共享著作推断出合著者,则需要执行多跳步骤来确定合著者。 推理是使隐含的事物显式化的过程。 下面使用Gremlin给出了几个简单的推理示例。
// Two people who wrote the same book/article/etc. are coauthors
g.V{x = it}.outE('wrote').inV.inE('wrote').outV.except([x])[0].foreach{g.addEdge(null, x, it, 'hasCoauthor')}// People who write literature are authors
author = g.addVertex(); author.type='role'; author.name='author'
g.V.foreach{it.outE('wrote').inV[0].foreach{g.addEdge(null, it, author, 'hasRole')} >> -1}
在上面的示例中,计算了完整的图表分析以确定所有共同作者和作者角色。 但是,没有什么可以阻止对本地推理算法的评估。
// Marko's coauthors are those people who wrote the same books/articles/etc. as him
marko.outE('wrote').inV.inE('wrote').outV.except([marko])[0].foreach{g.addEdge(null, x, it, 'hasCoauthor')}
结论
图形可用于建模对象,它们之间的关系以及它们所处的概念结构。 从该显式信息中,可以评估图查询和推理算法,以回答图上的问题并增加图内包含的显式知识的密度(即,增加顶点和边的数量)。 在RDF (知识表示)和RDFS / OWL (推理)的世界中,已经广泛利用了这种特定的图形使用模式。 RDF / RDFS / OWL的世界主要限于描述逻辑 (请参阅此处的相反论点)。 描述逻辑只是知识表示和推理这一更大领域的一部分。 有许多逻辑可以利用。 在图数据库的新兴空间中,存在必要的构建块来支持对其他逻辑的利用。 此外,在某些情况下,这些逻辑可以在同一图形结构内同时使用。 至此,下面的阅读清单提供了一些书籍,这些书籍阐明了有关异构推理的不同逻辑和思想。 图形数据库提供了一个实现这些想法的绿色领域。
进一步阅读
- Brachman,R.,Levesque,H.,“ 知识表示与推理 ”,Morgan Kaufmann,2004年。
- Wang,P.,“ 刚性灵活性:智能的逻辑 ”,Springer,2006年。
- 美国东部时间Mueller,“ 常识推理 ”,Morgan Kaufmann,2006年。
- Minsky,M.,“ 心灵学会” ,Simon&Schuster,1988年。
翻译自: https://www.javacodegeeks.com/2014/06/knowledge-representation-and-reasoning-with-graph-databases.html