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:Seq 要素 (またはその件については任意の rdf:Alt 要素) を元の順序で返す (他のパターンでは、元の順序が保持されているかどうかは問題ではないため、とにかく保持しないのはなぜですか?) - 明示的に指定されていない限りORDER BY 句を介して。
もちろん、古い方法との互換性を維持する必要があるため、新しい演算子を使用して propertyPath 構文を拡張する可能性はありますか?
日常の SPARQL ユースケースを大幅に簡素化できると思います。
それはあなたにとって理にかなっていますか?さらに、これを実装しようとしない理由はありますか?
編集により、サンプルの urn:2 rdfs:label 値が正しくなかったのが修正されました