2011-03-19 79 views
7

我目前正在尋找一種方法來通過SPARQL端點查詢DBPedia's Infobox Onyology database以獲取類的列表,所選類的子類和給定類的屬性。就我所能找到的,你要麼需要知道你正在尋找的財產,要麼搜索特定的東西 - 我發現的所有例子似乎都是基於這樣的想法,即你想要搜索某些特定的東西(比如特定高程以上的城市人口等),而我想建立一些可以有效「瀏覽」類別的東西。例如,從this class hierarchy chart上的「owl:Thing」的子類列表開始,並向用戶顯示所選子類的子類列表。似乎可以通過映射wiki來瀏覽像這樣的內容,但最好是直接查詢SPARQL端點。獲取DBPedia信息框類別

是否有一些簡單的SPARQL查詢會返回這些類的可用類和屬性?

更新: 我想出了一個辦法,通過this query:

SELECT ?subject WHERE { 
    ?subject rdfs:subClassOf owl:Thing 
} 

它返回貓頭鷹的子類列表以獲得類層次看來,通過迭代:事情,如果我用其中一個子類替換owl:Thing,我得到這個子類的列表,直到沒有子類爲止,此時我可以選擇所有具有由所選子類給出的類型的資源。不過,我仍然不確定如何獲得子類的所有屬性。

更新2 現在開始接近。該查詢得到我的所有屬性(DBpedia中的孩子:屬性),同時也是一個國家,以及它們的標題:

SELECT DISTINCT ?prop ?title WHERE { 
    ?country ?prop ?value. 
    ?country a <http://dbpedia.org/ontology/Country>. 
    ?prop rdf:type rdf:Property. 
    ?prop rdfs:label ?title 
} 

這實際上是我真正要求。我現在要做的最後一件事是嘗試按它們出現的頁面數排序(可能最常見的屬性將是最感興趣的屬性)。

回答

7

好了,其實我已經想通或多或少的確切如何做到這一點,所以我提交這個答案,而不僅僅是一個編輯。什麼似乎給我正是我要找的是層次結構使用this query通過類迭代開始:

SELECT ?class ?label WHERE { 
    ?class rdfs:subClassOf owl:Thing. 
    ?class rdfs:label ?label. 
    FILTER(lang(?label) = "en") 
} 

選擇的結果送入查詢到位貓頭鷹的:每一次的事情。

一旦用戶已經選擇了他們希望,以顯示屬性的列表,在由它們出現的條目的數量從大到小的順序最低級別的類中,我使用this query

SELECT ?prop ?title WHERE { 
    ?country ?prop []. 
    ?country a <http://dbpedia.org/ontology/Country>. 
    ?prop rdf:type rdf:Property. 
    ?prop rdfs:label ?title 
} ORDER BY DESC(COUNT(DISTINCT ?country)) 

當然,如果你真的看到這些結果,那裏有一些時髦的屬性沒有非常具有描述性的標籤(「s」?什麼?),但這至少是我一直在尋找的東西。

2

這將讓你所有那些rdfs:domain屬性是SpaceMission S:

select ?property where { 
    ?property rdfs:domain <http://dbpedia.org/ontology/SpaceMission> 
} 

這些特性都接受SpaceMission爲主題。

請注意,在RDF(S)中,不需要爲每個屬性明確指定rdfs:domain語句,因爲rdfs:domain可以通過屬性的使用暗示。你可能因此發現,這種查詢會給你已所有屬性的列表與SpaceMission域定義但不會放棄你,是實際上所有的SpaceMission實例的使用所有屬性的列表。

+0

無論出於何種原因,似乎沒有當你選擇國家而不是SpaceMission工作。它返回的是「twinCountry」。此外,它似乎只返回dbpedia中的東西:本體,而不是dbpedia:屬性。我更新了主帖,看起來是對我原來的問題的回答。 – Paul 2011-03-20 01:06:15

3

(1)查詢所有現有的類:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT DISTINCT ?class 
WHERE { 
    ?s rdf:type ?class . 
} 

(2)查詢爲C類的任何實例中使用的所有屬性:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT DISTINCT ?property 
WHERE { 
    ?s rdf:type <C> . 
    ?s ?property ?o 
} 
1

這很可能是某些屬性實際上並不是這樣定義有:

?p a rdf:Property .

但在中間位置的任何條款被定義的屬性。所以,你可能會得到更多的結果有:

 
SELECT ?prop ?title WHERE { 
    ?country a <http://dbpedia.org/ontology/Country>. 
    ?country ?prop [] . 
    ?prop rdfs:label ?title . 
} 
ORDER BY DESC(COUNT(DISTINCT ?country)) 

(在開始稍微重新排序,有選擇性可以提高性能)