2015-10-04 41 views
3

我有一个OWL文件,其中包含一个分类层次结构,我想写一个查询,其答案包括每个人及其直接分类父代。这里有一个例子(完整的查询比较混乱)。在SPARQL中删除不需要的超类答案

@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 . 

现在约菲多是附加的答案查询结果哺乳动物等。我可以放弃使用合理版本的文件,或者,由于SPARQL查询是从java调用的,我可以做一堆附加查询来查找出现的最小包含类型。我的问题是,是否有合理的纯SPARQL解决方案只返回Dog解决方案。

+0

您可能会在http://stackoverflow.com/q/19632992/1281433找到足够的答案。 –

回答

2

一个通用的解决方案是,你确保你只需要直接类型。一类C是直下型的实例X的,如果:

  1. X的类型为C
  2. 没有C'使得:
    • X被类型的C'
    • C'是一个子类C
    • C'不是e QUAL到C

(即最后一个条件是必要的,顺便说一下,因为在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 /库来执行这些查询,也可能有其他的,具体工具的解决方案。例如,芝麻API(披露:我对芝麻开发团队)必须禁用推理单个查询的目的选项:

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

TupleQueryResult result = query.evaluate(); 

芝麻还提供了可选的附加inferencer(称为“直接类型推理“),它引入了你可以查询的附加”虚拟“属性,如sesame:directType,sesame:directSubClassOf等。其他工具无疑也会有类似的选择。

+0

这看起来很有帮助。事实证明,我为我的SPARQL查询使用了Sesame,所以我会试一试这些查询/推理选项。 – user2246336