2012-08-29 81 views
6

我試圖爲一個類獲取最具體的屬性,並且我被卡住了。我想提取適用於給定類的所有屬性(包括從超類繼承的屬性),,除以外的結果集中包含子屬性的屬性。SPARQL:獲得「最具體的屬性」

例如,如果我有一個類人口其屬性之一是atLocation,和人口的子類,稱爲難民難民有房產currentLocation,這是at地點的子屬性。

所以,我要的是一個通用的查詢會給我只有atLocation如果我把在人口只有currentLocation如果我把在難民。我有這樣的:

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix ex: <http://example.org/vocabulary#> 

SELECT DISTINCT ?prop WHERE { 
    ex:Refugee rdfs:subClassOf* ?domain . 
    ?prop rdfs:domain ?domain . 
    ?subprop rdfs:domain ?domain . 
    FILTER NOT EXISTS { ?subprop rdfs:subPropertyOf ?prop . } 
} ORDER BY ?prop 

這讓我既atLocationcurrentLocation,雖然。

這可能在一個查詢中呢?任何想法如何解決這個讚賞!

+1

同樣的問題也在W3C sparql-dev郵件列表上發佈(和回答),請參閱http://lists.w3.org/Archives/Public/public-sparql-dev/2012JulSep/0017.html –

回答

4

當我爲自己嘗試時,這比我預想的要複雜。 但是,您需要做的是在一定程度上擴展NOT EXISTS子句。

SELECT ?prop WHERE { 
    ?prop rdfs:domain ?domain . 
    ?class rdfs:subClassOf* ?domain . 
    FILTER NOT EXISTS { 
     ?sub rdfs:subPropertyOf ?prop. 
     ?sub rdfs:domain ?d. 
     ?class rdfs:subClassOf* ?d . 
    } 
    FILTER (?class = ex:Refugee) 
} 

我們選擇它的訪問前所有屬性:難民或 超恩:難民(前兩個BGPS)。但是,我們想要過濾出 那些子屬性存在的屬性,該屬性也有一個 域,它是(超類)ex:Refugee域。請注意,我們使用 不同的變量作爲子屬性(?d)的域,畢竟它不一定必須與我們選擇的屬性 具有完全相同的域。

一個簡單的(非蘊涵或RDF(S)蘊涵) triplestore,只要每個子屬性徒有其最具體的 域類中定義的,也就是你有三重「恩上述工作:currentLocation rdfs:domain ex:Refugee'but not explicit'ex:currentLocation rdfs:domain ex:Population'。

+0

謝謝,Jeen。我正準備在這裏粘貼你的答案,以防別人將來遇到同樣的問題。 – Carsten

+0

@Carsten,你不認爲我會讓你脫離這些業力點嗎? :) –