2012-03-19 40 views

回答

4

有趣的問題,因爲它似乎很簡單,但它很難正確表達查詢。 William Greenly's answer沒有提供你想要的,儘管他在他的解釋中是完全正確的,並且正確地使用了property path。爲了能夠正確地詢問正確的查詢來回答你的問題,必須假定所有列表都是正確的(它們只有一個第一個元素,一個休息,最後以零結束)。

查詢中的問題是它會統計數據集中所有列表的所有成員。您需要將rdf:first僅與一個列表中的元素相關聯。

如果你有一個URI標識列表中選擇您有興趣,您可以執行以下操作:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX ex: <http://www.example.org/#> 
SELECT (COUNT(?member) AS ?count) 
WHERE { 
    ex:uriOfTheList rdf:rest*/rdf:first ?member 
} 

但往往,列表不會被URI標識。在這種情況下,可以通過使用其他屬性來識別某些列表。例如,假設你有一個ex:listOfAuthors屬性,你可以這樣做:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX ex: <http://www.example.org/#> 
SELECT (COUNT(?member) AS ?count) 
WHERE { 
    ex:publication ex:listOfAuthors ?list . 
    ?list rdf:rest*/rdf:first ?member . 
} 

請注意,如果你簡單地做:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT (COUNT(?member) AS ?count) 
WHERE { 
    ?list rdf:rest*/rdf:first ?member . 
} 

你加起來名單和子列表的所有大小。 如果您沒有可以附加列表的謂詞,並且您沒有URI並且您可能想要爲每個列表中的所有列表計數,現在情況會變得複雜。還有,應該工作的一種方式:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT (COUNT(?c) AS ?count) 
WHERE { 
    ?thing !rdf:rest ?list . 
    ?list rdf:rest*/rdf:first ?member . 
} 

這是什麼要說的是,我們要找到的東西,連接到列表中,但不與謂詞rdf:rest。原則上,如果實體不是列表本身且謂詞不是rdf:rest,則只有列表的開始才通過謂詞連接到其他實體。而且,列表通常總是以某種方式與其他實體連接,因爲在獨立於別的地方描述列表上沒有意義。

+0

謝謝Antoine,你確定了一個非常重要的點與被連接的東西。當我在一個只有一個列表的數據集上進行查詢時,我沒有想到它。 – user1278577 2012-03-20 12:47:58

3

其實,這是一個很好的問題,因爲它不是一個特別簡單的解決方案。

在RDF列表中的重要條款是:

rdf:first 
rdf:rest 
rdf:nil 

爲多個項目的列表,建議您型號如下:使用RDF

a:a rdf:first a:b; 
    rdf:rest [ 
     rdf:first a:c; 
     rdf:rest rdf:nil. 
    ]. 

:無指示一個列表不再有任何更多的項目(所以本質上它是一個列表的列表)。然而,它也指出,你可以使用RDF:第一interderterminantly如下:

a:a rdf:first a:b; 
    rdf:first a:c; 
    rdf:rest rdf:nil. 

RDF的要點:零是指定列表不再有任何項目。請記住,語義Web基於開放世界的假設,所以除非另有說明,否則不能僅僅因爲它們不知道或陳述就認爲該列表沒有更多項目,因此需要個人rdf:nil。

幸運的是,在上面的例子中,兩個都有一個查詢,它依賴於支持SPARQL 1.1的處理器。

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT (COUNT(?a) AS ?count) 
WHERE {?a rdf:first+ ?c} 

請記住,除非列表包含rdf:nil,否則不要認爲它是完整的。

+0

謝謝威廉。 – user1278577 2012-03-20 12:46:35