6

ビデオ メタデータでいっぱいのトリプル ストアがあるとします。ビデオには、次のように、事前定義されたタグを任意に選択できます。

v1 ex:hasTag A.
v2 ex:hasTag B.
v3 ex:hasTag A;
   ex:hasTag B.

したがって、この例では、2 つの定義済みタグAとのみが存在しますB

ここで、どの動画にどのタグが付けられているかを、次のような (または類似の) マトリックスで概観したいと思います。

    A     B 

v1  true  false
v2  false true
v3  true  true

しかし、これを達成する方法がわかりません。まず、ブール値のテストが必要です。たとえば、次のisTrue(?video ex:hasTag A)ようなものです。それでも、どこに置くかわかりません。前のステートメントを WHERE 句に入れると、クエリの結果Aにはもちろん、タグを持つ動画のみが含まれます。

SQL から来て、何らかの方法でサブクエリを使用する必要があると想像できますが、これらは現時点では標準化されていないようです。キーワードも見ましたFILTERが、それが欲しいとは思いません。

私は現在途方に暮れていますが、常に学びたいと思っています。どんな助けでも大歓迎です。

4

2 に答える 2

6

サブクエリは SPARQL 1.1 にあり、現在凍結されています。すでにいくつかの完全な実装があります。

ネストされた SELECT サブクエリと同様に、SPARQL 1.1 には、パターンが一致するかどうかをテストするための EXISTS および NOT EXISTS 関数があります。これはサブクエリの形式です。FILTER で使用するか、本当に true/false を返したい場合に使用できます。

BIND(EXISTS{?video ex:hasTag "A"} AS ?a)

あるいは:

SELECT ?video (EXISTS{?video ex:hasTag "A"} AS ?a) (EXISTS{?video ex:hasTag "B"} AS ?b)
{           
  ?video a ex:Video .
}
于 2012-11-13T09:35:53.410 に答える
4

次のようなものから始めてみてください。

SELECT ?video ?tagA ?tagB {
  ?video a ex:Video .
  OPTIONAL { ?video ex:hasTag ?tagA . FILTER (?tagA = "A") }
  OPTIONAL { ?video ex:hasTab ?tagB . FILTER (?tagB = "B") }
}

それはおおよそあなたが望むものになります。バインドされていない値を単純にチェックするのではなく、ブール値が本当に必要な場合は、次を使用します。

SELECT ?video (bound(?tagA) as ?a) (bound(?tagB) as ?b) { ... }

PS サブクエリは、SPARQL 1.1 で標準化されています (ほぼ、執筆時点で提案されている推奨事項) 。

于 2012-11-12T15:44:36.000 に答える