列表這是正確的/最佳SPARQL查詢來獲取項目的數量在RDF:類別:(?COUNT(A)作爲計數)?的RDF獲得數:使用SPARQL
選擇 其中{一http://www.w3.org/1999/02/22-rdf-syntax-ns#first?c}
在此先感謝您的幫助。
問候, 拉胡爾
列表這是正確的/最佳SPARQL查詢來獲取項目的數量在RDF:類別:(?COUNT(A)作爲計數)?的RDF獲得數:使用SPARQL
選擇 其中{一http://www.w3.org/1999/02/22-rdf-syntax-ns#first?c}
在此先感謝您的幫助。
問候, 拉胡爾
有趣的問題,因爲它似乎很簡單,但它很難正確表達查詢。 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
,則只有列表的開始才通過謂詞連接到其他實體。而且,列表通常總是以某種方式與其他實體連接,因爲在獨立於別的地方描述列表上沒有意義。
其實,這是一個很好的問題,因爲它不是一個特別簡單的解決方案。
在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,否則不要認爲它是完整的。
謝謝威廉。 – user1278577 2012-03-20 12:46:35
謝謝Antoine,你確定了一個非常重要的點與被連接的東西。當我在一個只有一個列表的數據集上進行查詢時,我沒有想到它。 – user1278577 2012-03-20 12:47:58