为什么 owl:Restriction 推理在 Blazegraph 中不起作用?

Why is owl:Restriction reasoning not working in Blazegraph?

在 Blazegraph 中使用以下 RDF(取自 this answer):

:eats rdf:type owl:ObjectProperty .

:Vegetable rdf:type owl:Class ;
       rdfs:subClassOf owl:Thing .

:Vegetarian rdf:type owl:Class ;
        owl:equivalentClass [ rdf:type owl:Restriction ;
                              owl:onProperty :eats ;
                              owl:someValuesFrom :Vegetable
                            ] .

:Carrot rdf:type :Vegetable ,
             owl:NamedIndividual .

:John rdf:type owl:NamedIndividual , owl:Thing ;
      :eats :carrot .

以下 SPARQL 返回空白:

select ?who
where 
{
  ?who a :Vegetarian .       
}

这里是 Blazegraph 命名空间配置(Blazegraph 运行 作为命令行中的 NanoSparqlServer):

com.bigdata.namespace.kb.spo.com.bigdata.btree.BTree.branchingFactor    1024
com.bigdata.relation.container  test-ng-2
com.bigdata.journal.AbstractJournal.bufferMode  DiskRW
com.bigdata.journal.AbstractJournal.file    bigdata.jnl
com.bigdata.journal.AbstractJournal.initialExtent   209715200
com.bigdata.rdf.store.AbstractTripleStore.vocabularyClass   com.bigdata.rdf.vocab.DefaultBigdataVocabulary
com.bigdata.rdf.store.AbstractTripleStore.textIndex false
com.bigdata.btree.BTree.branchingFactor 128
com.bigdata.namespace.kb.lex.com.bigdata.btree.BTree.branchingFactor    400
com.bigdata.rdf.store.AbstractTripleStore.axiomsClass   com.bigdata.rdf.axioms.OwlAxioms
com.bigdata.service.AbstractTransactionService.minReleaseAge    1
com.bigdata.rdf.sail.truthMaintenance   true
com.bigdata.journal.AbstractJournal.maximumExtent   209715200
com.bigdata.rdf.sail.namespace  test-ng-2
com.bigdata.relation.class  com.bigdata.rdf.store.LocalTripleStore
com.bigdata.rdf.store.AbstractTripleStore.quads false
com.bigdata.relation.namespace  test-ng-2
com.bigdata.btree.writeRetentionQueue.capacity  4000
com.bigdata.rdf.store.AbstractTripleStore.statementIdentifiers  true

我错过了什么?

原因似乎是

:Carrot rdf:type :Vegetable ,

你从大写字母开始 Carrot,但在

 :eats :carrot .

你使用小写字母。

此数据格式不正确:

:Carrot rdf:type :Vegetable ,
             owl:NamedIndividual .

:John rdf:type owl:NamedIndividual , owl:Thing ;
      :eats :carrot .

您还需要说明 :carrot 是 :Carrot 类型的个体,断言如下:

:carrot rdf:type owl:NamedIndividual , owl:Thing, :Carrot .

然后,由于 :carrot 将是 :Carrot 的实例,而 :Carrot 是 :Vegetable 的子类,您可以推断 :carrot 是 :Vegetable 的实例,因此 :John :eats some :蔬菜。如果 Blazegraph 支持 OWL 推理(例如,不仅仅是 RDFS 推理),那应该足以让您推断出 :John 是一个 :Vegetarian(至少根据这个非标准的素食定义)。

存在一些 RDF 语法问题,但根本原因是 Blazegraph 不支持 OWL 开箱即用的推理。查看当前 support。已经有一些针对 ELK Reasoner 的工作。

关于此示例中的 RDF,这里有一个更新已验证可在 Blazegraph 1.5.1 中加载。它结合了上面的反馈并添加了命名空间。我使用上面的属性创建了一个属性 (test.properties) 文件,并使用来自 Sourceforge 的可执行 jar 加载了 Blazegraph。

java -Xmx2g -Dbigdata.propertyFile=test.properties -jar bigdata-bundled.jar

转到 workbench:http://localhost:9999/bigdata/ 并将下面的 RDF 粘贴到 workbench 上的 "Update" 选项卡中,选择 "RDF Data",格式为 "Turtle"。

@prefix : <http://whosebug.com/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .

:eats rdf:type owl:ObjectProperty .

:Vegetable rdf:type owl:Class ;
   rdfs:subClassOf owl:Thing .

:Vegetarian rdf:type owl:Class ;
   owl:equivalentClass [ rdf:type owl:Restriction ;
                          owl:onProperty :eats ;
                          owl:someValuesFrom :Vegetable
                        ] .

:Carrot rdf:type :Vegetable ,
         owl:NamedIndividual .

:carrot rdf:type owl:NamedIndividual , owl:Thing, :Carrot .

:John rdf:type owl:NamedIndividual , owl:Thing ;
          :eats :carrot .

如果您随后转到查询选项卡并运行类似以下内容:

select * where { ?s ?p ?o }

您将看到 OWLAxiomsVocabulary 推断出的所有三元组。