9

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 値が正しくなかったのが修正されました

4

2 に答える 2

5

RDF はコレクションとコンテナーの語彙を定義しますが、それらを含むグラフをどのように解釈するかという点で特別な意味はありません。それらは多値プロパティを表すことを意図しておらず、実際には適切ではありません。

一般に、次のように言います。

:A :predicate [ a rdf:Alt ; rdf:_1 :B ; rdf:_2 :C ] .

と同等ではありません

:A :predicate :B , :C .

述語が owl:sameAs: であるとしましょう。

:A owl:sameAs [ a rdf:Alt ; rdf:_1 :B ; rdf:_2 :C ] .

上記は、:Aが:B と :Cを含む個体の名前であることを示していますが、次のようになります。

:A owl:sameAs :B , :C .

は、:A、:B、:C が一人物であることを示しています。

SPARQL は、コンテナーとコレクションにとらわれません (rdf:List の構文上の短縮形は別として)。コレクションを操作するためのより便利な方法が必要な場合は、Jenardflibを含む多くの RDF APIにそれらの第一級の表現があります。

補遺

多値プロパティをモデル化する方法、つまり、"Example n°1"@fr と "Example #1"@en の両方が urn:1 のラベルであることをモデル化する方法は、2 つの事実を単純に述べるだけです。

<rdf:Description rdf:about="urn:1">
    <rdfs:label xml:lang="fr">Exemple n°1</rdfs:label>
    <rdfs:label xml:lang="en">Example #1</rdfs:label>
    ...
</rdf:Description>

そしてクエリ:

SELECT ?res WHERE { ?res rdfs:label ?label . FILTER ( contains(?label, 'Example'@en) ) }

<urn:1> と <urn:2> の英語ラベルに一致します。

複数値のプロパティとその値の順序付けを持つ my:release プロパティの場合は、少しトリッキーです。値がrdf:Listまたはrdf:Seqである新しいプロパティ(たとえば、my:releases)を定義できます。my:release は直接的な関係を提供し、my:releases は明示的な順序付けを指定する間接的な関係を提供します。推論ストアと適切なルールがあれば、後者を提供するだけで済みます。残念ながら、これによって SPARQL 内での順序付けが簡単になるわけではありません。

SPARQL および非推論ストアでの作業がより簡単なアプローチは、バージョン自体を、順序を定義するプロパティを持つオブジェクトにすることです。

  <rdf:Description rdf:about="urn:1">
    <rdfs:label xml:lang="fr">Exemple n&#xB0;1</rdfs:label>
    <rdfs:label xml:lang="en">Example #1</rdfs:label>
    <my:release>
      <my:Release>
        <dc:issued rdf:datatype="&xsd;date">2008-10-10/dc:issued>
        <my:version>10.0</my:version>
      </my:Release>
    </my:release>
    <my:release>
      <my:Release>
        <my:version>2.4</my:version>
        <dc:issued rdf:datatype="&xsd;date">2007-05-01</dc:issued>
      </my:Release>
    </my:release>
    ...
  </rdf:Description>

上記では、明示的な順序がなくなったため、日付を使用して結果を並べ替えることができます。クエリは少しだけ複雑です。

SELECT ?ver 
WHERE { <urn:1> my:release [ my:version ?ver ; dc:issued ?date ] }
ORDER BY ?date
于 2013-04-26T04:36:28.727 に答える