大家好rdf/sparql開發人員。這裏有一個問題讓我嘮叨了一會兒,但是自rdf和sparql規範發佈以來,似乎沒有人能夠準確回答它。通過集合和rdf:容器進行Sparql查詢?
爲了說明這種情況,RDF定義了幾種方法來處理資源的多值屬性;從創建具有相同子噴射謂詞uris的三元組到集合或容器。這是很好的,因爲每種模式都有自己的特點。
但是從SPARQL的觀點來看,在我看來,查詢這些結構會導致過於複雜的查詢(更糟糕的是)無法轉錄爲明智的結果集:您無法使用變量來查詢任意列表,長度和propertyPath不保留「自然」順序。
以一種天真的方式,在很多SELECT或ASK查詢中,如果我想查詢或過濾容器或列表的值,我不會在乎大部分時間都在意底層模式是真的(如果有的話) )。因此,例如:
<rdf:Description rdf:about="urn:1">
<rdfs:label>
<rdf:Alt>
<rdf:li xml:lang="fr">Exemple n°1</rdf:li>
<rdf:li xml:lang="en">Example #1</rdf:li>
</rdf:Alt>
</rdfs:label>
<my:release>
<rdf:Seq>
<rdf:li>10.0</rdf:li>
<rdf:li>2.4</rdf:li>
<rdf:li>1.1.2</rdf:li>
<rdf:li>0.9</rdf:li>
</rdf:Seq>
</my:release>
</rdf:Description>
<rdf:Description rdf:about="urn:2">
<rdfs:label xml:lang="en">Example #2</rdfs:label>
</rdf:Description>
顯然,我希望雙方的資源來回答查詢:
SELECT ?res WHERE { ?res rdfs:label ?label . FILTER (contains(?label, 'Example'@en) }
我也希望查詢:
SELECT ?ver WHERE { <urn:1> my:release ?ver }
返回RDF:序列元素(或者任何rdf:Alt就是這個原因)按照原始順序(對於其他模式,保留原始順序還是不保留,爲什麼不保留它)? - 除非通過ORDER BY明確指定條款。
當然,有必要保持與舊方式的兼容性,所以也許有可能使用新的操作符來擴展propertyPath語法?
我覺得這會簡化很多日常的SPARQL用例。
對你有意義嗎? 此外,你看到有什麼理由不嘗試實施這個?
編輯修正的例子的骨灰盒:2周的rdfs:標籤值,這是不正確
請參閱https://bitbucket.org/dotnetrdf/dotnetrdf/wiki/UserGuide/Typed%20Values%20and%20Lists for dotNetRDF的RDF列表的程序化API – RobV 2013-04-26 17:11:06
感謝您的提示Rob,但我主要是在sparql級別認爲只要能夠簡單地查詢或過濾SPARQL屬性而無需後處理,事先知道該對象是否爲容器,並且不採用如下醜陋的sparql:SELECT coalesce(?lit,?labelObj)作爲?label {?s rdfs:label?labelObj。可選{?label rdf:next */rdf:first?lit FILTER(isLiteral(?lit))})}或者這樣的事情...... – Max 2013-04-26 17:28:13
事實上,我在考慮更多的XPath端口上的propertyPaths模式,如rdfs:label [ ],rdfs:label [0]或rdfs:label [i..n],例如它可以派上用場並回答容器/列表或簡單事實模式(當然事實模式沒有可預測性......) ) – Max 2013-04-26 17:40:56