2015-10-04 43 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