36

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

(少なくともStardogではありません)

2)FILTER

例えば:

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

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

4

2 に答える 2

49

SPARQLが「基本的な論理演算子」を提供しないとあなたが言う理由は完全にはわかりません。あなた自身の例がそれを明確に示しているからです。論理OR(||)と論理AND( )を条件&&の一部として提供し、FILTERを使用した選言グラフ パターンUNION(もちろん、連結グラフ パターンには特別な構文は必要ありません)。

のような構造の他のバリエーションORも可能です。「この特定の値は、これらの可能性のいずれかである必要があります」という形式のクエリでは、セット メンバーシップ演算子を使用できますIN

SELECT * 
WHERE { 
    ?s ?p ?o.
    FILTER (?p IN (:propA, :propB, :propC ) )
}

VALUESこの種のパターンには句を使用することもできます。

SELECT * 
WHERE {
    VALUES ?p { :propA :propB :propC } 
    ?s ?p ?o.
}

更新、おそらく最も単純なものを忘れました。プロパティ名のいくつかの代替を探しているあなたのようなクエリの場合、実際には次のようにプロパティ パス式も使用できます。

SELECT * 
WHERE {
    ?s :propA|:propB|:propC ?o.
}
于 2015-05-28T09:37:37.280 に答える