Neo4j:一个合理的RDF图形数据库和推理引擎


众所周知,Neo4j能够加载和写入RDF。到目前为止,RDF和OWL推理一直被归因于完全成熟的三元组存储或专用推理引擎。这篇文章表明,Neo4j可以通过一种独特的推理技术进行扩展,从而为RDF、RDFS和OWL2RL提供一个非常有表现力和高度好胜的推理机。我将简要说明该方法并提供一些基准测试结果。

标记属性图(LPG)和资源描述框架(RDF)有一个共同点:都将数据视为graph。不出所料,就像最近一样,存在将一种格式转换为另一种格式的方法demonstrated nicely by Jesús Barrasa from Neo4j对于汤森路透PermID RDF数据集。

如果你坚持differences between LPG and RDF,然后考虑表示模式信息和推理的不同能力。

Neo4j2.0时,引入了节点标签,用于对节点进行类型化,以便可选地对图的轻量级类型模式进行编码。一般而言,RDF Schema(RDFS)更正式地扩展了这种方法。RDFS允许结构化层次结构中的节点(在RDF中称为类)和关系(称为属性)的标签。最重要的是,Web Ontology Language(OWL)提供了一种语言来表达类似规则的条件,以自动派生新的事实,如节点标签或关系。

推理用知识丰富数据

要快速深入到规则和猫头鹰推理的世界,让我们考虑一下非常流行的LUBM benchmark (Lehigh University Benchmark)

基准由虚构的大学领域中人工生成的图形数据组成,涉及人员、系、课程等。例如,如果学生选修了某些课程,则会将其派生为参与者。因此,当他或她符合以下本体论规则时:

Student and (takesCourse some) SubClassOf Attendee

当翻译成LPG行话时,此规则必须按如下方式阅读:每个带标签的节点Student这与标签有某种关系takesCourse到某个其他节点将收到该标签Attendee。任何有经验的Neo4j程序员都可以摩拳擦掌,因为这条规则可以直接转化为以下内容Cypher表达式:

match (x:Student)-[:takesCourse]->()
set x:Attendee

这是完全可能的,但在嵌套很深的规则也可能相互依赖的情况下,这可能会变得很麻烦。例如,Cypher表达式缺少Student例如UndergraduateStudent。因此,严格地说,上面的表达式应该是:

match (x)-[:takesCourse]->() where x:Student or x:UndergraduateStudent
set x:Attendee

显然,在Protégé等本体编辑器和负责执行这些领域知识的OWL推理引擎的支持下,将这些领域知识编码为本体规则要方便得多。

关于RDFS/OWL的另一个好处是,对这样的知识进行建模是在一个非常声明性的级别上,即standardized by W3C。此外,OWL语言还具有健壮性和完备性等重要特性。

例如,您永远不能定义非终止规则集,推理将立即识别任何冲突的规则。在OWL2RL的情况下,进一步保证所有可导出的事实可以关于图的大小以多项式时间(理论上最坏的情况)导出。

在实践中,性能可能会有很大的不同。在我们的与会者示例中,无论是三元组存储规则引擎还是Cypher引擎,推理器都必须循环访问带有标签的图节点Student并检查是否takesCourse关系。

为了调整性能,可以使用专用索引来有效地选择具有特定关系的节点(分别为:关联度)或标签,以及使用存储过程。归根结底,这似乎没有很好的伸缩性:当数据加倍时,为了计算这类规则的后果,您需要将图形读写次数增加一倍。

好消息是,这并不是故事的结束。

一种高效的图存储推理方法

有一种技术叫做GraphScale这使得Neo4j能够进行可伸缩的猫头鹰推理。该方法基于一种抽象精化技术,该技术构建了适合于内存推理的紧凑的图形表示。然后,推理结果被递增地传播回底层图形存储。

GraphScale背后的思想是基于这样一种观察,即图中的实体通常具有相似的结构。GraphScale方法利用这些相似性并计算原始数据的压缩版本,称为抽象。

此抽象基于根据定义良好的逻辑标准共享相似结构的等价节点组。事实证明,该技术对于所有RDF、RDFS和OWL2RL都是健全和完整的。

Learn how the Neo4j graph database (vs. a triple store) performs as a reasonable RDF reasoning engine

以下是该方法的直观想法。将上图视为有关Neo4j中大学域的原始数据的一部分。右边是至少选修了一些课程的本科生的缩影。

本质上,这些学生是参与者这一派生事实隐含地适用于原始图形中的所有源节点。换句话说,从紧凑表示中的派生事实到原始图形中的节点之间存在某种一对多的关系。

用GraphScale对Neo4j进行推理和查询

让我们看看来自LUBM测试套件的不断增大的数据的一些性能结果。

下图描述了在Neo4j上使用GraphScale派生所有可派生事实(称为物化)的时间(不加载时间),分别为50,100。250所大学。与其他具有推理功能的辅助存储系统相比,Neo4j-GraphScale Duo的推理时间增长率随着数据的增加比任何其他系统都要低得多(架构和数据文件可以在本文的底部找到)。

A benchmark of GraphScale + Neo4j using the LUBM test suite

经验表明,物化是在真实环境中高效查询的关键。在没有预先物化的情况下,支持推理的三元组存储必须按需为每个查询临时派生所有答案和相关事实。因此,这会带来性能损失,并且在重要的规则集上通常会失败。

自从Neo4jgraph database不是三元组存储,它没有配备SPARQL查询引擎。但是,Neo4j提供了Cypher,并且对于许多语义应用程序,应该可以将SPARQL转换为Cypher查询。

从用户的角度来看,这将两种技术集成到一个平台中:事务图分析系统和RDFS/OWL推理引擎,该引擎能够通过Neo4j中的物化图上的Cypher为复杂的语义应用程序提供服务。

作为概念证明,让我们考虑LUBM测试套件中的第9个SPARQL查询,它被证明是14个给定查询中最具挑战性的查询之一。该查询询问讲授这些学生所选课程的学生及其导师:大多数数据集上的三角关系模式:

SELECT ?X ?Y ?Z {
  ?X rdf:type Student .
  ?Y rdf:type Faculty .
  ?Z rdf:type Course .
  ?X advisor ?Y .
  ?Y teacherOf ?Z .
  ?X takesCourse ?Z
}

在完全物化图的假设下,此SPARQL查询转换为以下CYPHER查询:

MATCH (x:Student)-[:takesCourse]->(z:Course),
      (x)-[:advisor]->(y:Faculty)-[:teacherOf]->(z)
RETURN x, y, z

毫无疑问,Neo4jCypher引擎使用以前的数据集提供了好胜查询性能(时间为resp. count(*)查询九的版本)。三元组存储A没有列出,因为它是没有辅助存储持久性的纯内存系统。

Benchmark data between Neo4j + Cypher + GraphScale vs. a triple storeNeo4j与GraphScale技术的结合更具潜力。事实上,图抽象作为查询应答的索引非常有用。例如,您可以立即从抽象中读取是否存在某种类型的数据匹配查询模式(X:)-[:]->()

一句话:我完全同意乔治·阿纳迪奥蒂斯的说法,即labeled property graphs and RDF/OWL are close relatives

在后续的博客文章中,我将介绍一个用于RDF图形的交互式可视化探索和查询工具,该工具利用上面描述的紧凑表示作为索引,在大型图形上提供卓越的用户体验和性能。

资源

图形比例:

    • GraphScale:向语义数据存储添加表达性推理。第14届国际语义网会议(ISWC 2015)演示文集:http://ceur-ws.org/Vol-1486/paper_117.pdf
    • 基于本体的数据仓库中可伸缩类型推理的抽象精化:EP2966600A1&US2016/0004965 A1

数据: