19

SPARQLでは、このようなことができます

select * where {
    ?s   (_:prop1 | _:prop2)  "some_val" .
    ...
    #use ?s in other patterns
    ?s    ?o    ?p .
}

パターンのオブジェクト部分に対して同じことを行うことは可能ですか? また、それが不可能な場合の回避策は何ですか?

例えば:

select * where {
    ?s   _:prop ("v1" | "v2") .
    ...
    #use ?s in other patterns
    ?s    ?o    ?p .
}
4

2 に答える 2

30

これを行うにはいくつかの方法があります。最も単純で純粋な SPARQL 1.0 の方法は、UNIONたとえば次を使用することです。

SELECT * WHERE
{
  { ?s _:prop "v1" } UNION { ?s _:prop "v2" }

  # Use ?s in other patterns
}

これはおそらく最も単純な方法ですが、これに複数の制約が必要な場合は、?sすぐに扱いにくくなります。

2 番目の方法は、節でIN関数を使用することです。これには、SPARQL 1.1 の実装が必要です。FILTER

SELECT * WHERE
{
  ?s _:prop ?value .
  FILTER(?value IN ("v1", "v2"))

  # Use ?s in other patterns
}

ここでの問題は、IN多くの選択肢がある場合、または一致する可能性のあるデータが多い場合、使用のパフォーマンスが非常に低下する可能性があることです。?s _:prop ?value

余談- 多くのオプティマイザは、実際にはこの 2 番目の方法を内部で最初の方法に拡張します。

3 番目の方法はVALUES、SPARQL 1.1 の実装を再度必要とする句を使用することです。

SELECT * WHERE
{
  VALUES (?value) { ( "v1" ) ( "v2 " ) }
  ?s _:prop ?value .

  # Use ?s in other patterns
}

これは、(SPARQL の実装に応じて) 多くの代替手段により適切にスケーリングされ、おそらく読み書きが最も優れているため、おそらく最良のオプションです。

于 2013-07-11T18:01:17.443 に答える