2011-03-22 37 views
8

我試圖查詢DBPedia以獲取與本體中給定類相關的屬性列表,但由於人類可讀的「標籤」並不總是清晰的,我也想從數據庫中提供一個例子。問題是,雖然我想選擇所有不同的屬性,但我只想要每個屬性的單個示例。 Here's我查詢的外觀沒有捕捉例如:在SPARQL中選擇一些不同的和一些不明顯的標籤

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

如果我改變它在this way,我開始變得重複值道具:

SELECT DISTINCT ?prop ?title ?example WHERE { 
    ?thing ?prop ?example. 
    ?thing a <http://dbpedia.org/ontology/Currency>. 
    ?prop rdf:type rdf:Property. 
    ?prop rdfs:label ?title. 
} ORDER BY DESC(COUNT(DISTINCT ?thing)) 
LIMIT 100 

我很新的使用SPARQL和數據庫一般的查詢,所以我不清楚如何做到這一點。理想情況下,我會使用DISTINCT(?prop)?title?示例,它爲prop選擇每個唯一值,並返回其標題和示例。

回答

6

在您的第二個查詢中,區別適用於?prop?title?example的值的組合。因此,你沒有得到任何重複,例如用於在第二個查詢得到以下兩行:

dbpedia2:subunitName "subunit name "@en "cent"@en 
dbpedia2:subunitName "subunit name "@en "centavo"@en 

他們不重複,因爲第三排?example有兩個不同的值"cent"@en"centavo"@en

解決這個更多鈔票的一個方法是使用GROUP BYMIN得到公正的?label?example排名最低的值,即:

SELECT ?prop MIN(?title) MIN(?example) WHERE { 
    ?thing ?prop ?example. 
    ?thing a <http://dbpedia.org/ontology/Currency>. 
    ?prop rdf:type rdf:Property. 
    ?prop rdfs:label ?title. 
} GROUP BY ?prop 
+0

這工作很漂亮,但就是GROUP BY必要爭論?我用ORDER BY DESC(COUNT(DISTINCT?thing))實現了它,它似乎仍然工作。 ORDER BY會給出一些令人不愉快的結果,而這種情況不會發生嗎? – Paul 2011-03-22 21:38:06

+2

@Paul要成爲合適的有效查詢,您不能直接對集合進行ORDER BY - 這是SPARQL 1.1規範所不允許的。這大概是一個Virtuoso擴展,並且會使查詢不可移植,即它不一定在非Virtuoso端點上工作。請查看我的答案,以查找適合做同樣事情並且便於攜帶的查詢表單 – RobV 2011-03-23 08:56:45

4

這裏是爲了實現你想要的子查詢什麼的另一種方式:

SELECT ?prop ?title ?example 
WHERE 
{ 
    ?thing a <http://dbpedia.org/ontology/Currency>. 
    ?prop rdf:type rdf:Property. 
    { SELECT ?title ?example WHERE { ?thing ?prop ?example . ?prop rdfs:label ?title. } LIMIT 1 } 
} 
LIMIT 100 

這樣做的優點是SPARQL 1.1符合標準的,正如我在我的評論的排序表示通過聚合不標準允許這樣您正在使用特定於供應商的擴展,這會限制查詢的可移植性。

如果你想通過一種方式聚合值是跨SPARQL然後1.1實現移植到命令你必須第一個項目像這樣:

SELECT ?s (COUNT(?p) AS ?predicates) WHERE 
{ 
    ?s ?p ?o 
} GROUP BY ?s ORDER BY DESC(?predicates)