SPARQLで基本的な論理演算子が実装されていない理由がよくわかりません。ただし、ほとんどの場合、いくつかの方法で同じ結果を得ることができます。
この質問の目的は、「または」ステートメントを置き換えることができる可能なトラフのクイックリファレンスを用意することです。
ここに私が考えることができるものがあります:
UNION
例えば:
SELECT * WHERE
{ { ?s :propA ?o } UNION { ?s :propB ?o } }
-非常に冗長になる可能性があるため、多くの場合適切ではありません。
SELECT * WHERE {
{ GRAPH ?g {?s ?p ?o. ?o ?pp ?data1}} UNION
{ GRAPH ?g {?s ?p ?o. ?o ?pp ?data2}}
}
として機能しません
SELECT * WHERE {
GRAPH ?g {
?s ?p ?o.
{?o ?pp ?data1} UNION
{?o ?pp ?data2}
}
}
(少なくともスタードッグでは)
FILTER
例えば:
SELECT * WHERE
{
?s ?p ?o.
FILTER (?p = :propA || ?p = :propB )
}
他のアイデアはありますか?
SPARQLが '基本的な論理演算子'を提供しないのはなぜかはわかりませんが、独自の例では明確に示されているため、論理OR(||
)および論理AND(&&
)FILTER
条件の一部として、およびUNION
を使用する分離グラフパターン(もちろん、接続グラフパターンには特別な構文は必要ありません)。
OR
- like構成の他のバリエーションも可能です。 「この特定の値はこれらの可能性の1つでなければならない」という形式のクエリの場合、メンバーシップ演算子IN
を使用できます。
SELECT *
WHERE {
?s ?p ?o.
FILTER (?p IN (:propA, :propB, :propC ) )
}
この種類のパターンにはVALUES
句を使用することもできます。
SELECT *
WHERE {
VALUES ?p { :propA :propB :propC }
?s ?p ?o.
}
更新おそらく最も単純なものを忘れてしまいました。 propertyの名前のいくつかの選択肢を探しているyoursなどのクエリでは、実際には次のようにプロパティパス式も使用できます。 :
SELECT *
WHERE {
?s :propA|:propB|:propC ?o.
}
どの述語がどのオブジェクトにつながるかを追跡する場合、これは "OR"の一般的な解決策です。
SELECT DISTINCT ?s ?o1 ?o2
WHERE {
{
?s p1 ?o1 .
OPTIONAL
{
?s p2 ?o2 .
}
}
UNION
{
?s p2 ?o2 .
OPTIONAL
{
?s p1 ?o1 .
}
}
}