web-dev-qa-db-ja.com

SPARQLクエリの「または」

SPARQLで基本的な論理演算子が実装されていない理由がよくわかりません。ただし、ほとんどの場合、いくつかの方法で同じ結果を得ることができます。

この質問の目的は、「または」ステートメントを置き換えることができる可能なトラフのクイックリファレンスを用意することです。

ここに私が考えることができるものがあります:

1)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} 
    }
 }

(少なくともスタードッグでは)

2)FILTER

例えば:

SELECT * WHERE
    { 
        ?s ?p ?o.
        FILTER (?p = :propA || ?p = :propB )
    }

他のアイデアはありますか?

19
ffa

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.
}
26
Jeen Broekstra

どの述語がどのオブジェクトにつながるかを追跡する場合、これは "OR"の一般的な解決策です。

SELECT DISTINCT ?s ?o1 ?o2 
WHERE {
  {
     ?s p1 ?o1 .
     OPTIONAL
     {
        ?s p2 ?o2 .
     }
  } 
  UNION 
  {
     ?s p2 ?o2 .
     OPTIONAL
     {
        ?s p1 ?o1 .
     }
  }
}
3
Marko Djurovic