在SPARQL

时间:2015-10-04 16:06:13

标签: sparql owl reasoning

我有一个OWL文件,其中包含我想编写查询的分类层次结构,其中答案包括每个人及其直接的分类父母。这是一个例子(完整的查询相当混乱)。

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rdf: <http:://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix : <urn:ex:> .

:fido rdf:type :Dog .
:Dog rdfs:subClassOf :Mammal .
:Mammal rdfs:subClassOf :Vertebrate .
:Vertebrate rdfs:subClassOf :Animal .
:fido :hasToy :bone

:kitty rdf:type :Cat .
:Cat rdfs:subClassOf :Mammal .
:kitty :hasToy :catnipMouse .

这个查询做了我想要的。

prefix rdf: <http:://www.w3.org/1999/02/22-rdf-syntax-ns#> .
prefix : <urn:ex:> .

SELECT ?individual ?type 
WHERE {
   ?individual :hasToy :bone .
   ?individual rdf:type ?type .
}

问题在于我宁愿使用OWL文件的推理版本,不出所料地包含其他语句:

:fido rdf:type :Mammal .
:fido rdf:type :Vertebrate .
:fido rdf:type :Animal .
:kitty rdf:type :Mammal .
:kitty rdf:type :Vertebrate .
:kitty rdf:type :Animal .

现在查询会得到关于Fido是哺乳动物等的其他答案。我可以放弃使用该文件的推理版本,或者,因为从java调用SPARQL查询,我可以做一堆其他查询以查找显示的最不包含的类型。我的问题是,是否有合理的纯SPARQL解决方案只返回Dog解决方案。

1 个答案:

答案 0 :(得分:2)

通用解决方案是确保仅要求直接类型。类C是实例X的直接类型,如果:

  1. X的类型为C
  2. 没有C'这样:
    • X的类型为C'
    • C'C
    • 的子类
    • C'不等于C
  3. (顺便说一句,最后一个条件是必要的,因为在RDF / OWL中,子类关系是自反的:每个类都是它自己的子类)

    在SPARQL中,这就像这样:

    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX : <urn:ex:> .
    
    SELECT ?individual ?type 
    WHERE {
       ?individual :hasToy :bone .
       ?individual a ?type .
       FILTER NOT EXISTS { ?individual a ?other .
                           ?other rdfs:subClassOf ?type .
                           FILTER(?other != ?type)
       }
    }
    

    根据您用于执行这些查询的API / triplestore /库,可能还有其他特定于工具的解决方案。例如,Sesame API(披露:我在Sesame开发团队中)可以选择为单个查询禁用推理:

    TupleQuery query = conn.prepareTupleQuery(SPARQL, "SELECT ...");
    query.setIncludeInferred(false); 
    
    TupleQueryResult result = query.evaluate();
    

    Sesame还提供了一个可选的附加推理器(称为“直接类型推理器”),它引入了您可以查询的其他“虚拟”属性,例如sesame:directTypesesame:directSubClassOf等。毫无疑问,其他工具有类似的选择。