23

私は私の店から正しいトリプルを選択するのに少し助けが必要です....

<a> a <type/1> .
<b> a <type/1> .
<c> a <type/1> .
<c> a <type/2> .

タイプ/1でタイプ/2ではない要素のみを選択したい

sparql selectクエリを使用してこれを達成するための最良の方法は何ですか?

次のようなものを探しています:

select ?a where 
{ 
    ?a a <type/1> .
    !{ ?a a <type/2> }
}

ありがとう、

:)

4

2 に答える 2

27

別のSPARQL1.1ソリューションは、MINUS例えば

SELECT ?a
WHERE
{
  ?a a <type/1> .
  MINUS { ?a a <type/2> . }
}

MINUS既存の一致からトリプルパターンに一致するソリューションを減算します。

ほとんどの場合、FILTER NOT EXISTS { }MINUS { }は同等ですが、これが当てはまらないいくつかのコーナーケースがあることに注意してください。この例については、SPARQL1.1仕様を参照してください。

于 2011-08-17T18:45:56.213 に答える
14

SPARQL 1.0では、これは少し注意が必要です。

SELECT ?a WHERE {
    ?a a <type/1>.
    OPTIONAL {
        ?a a ?othertype .
        FILTER (?othertype = <type/2>)
    }
    FILTER (!BOUND(?othertype))
}

OPTIONAL句は、を持っているものにはバインド?othertypeし、持っていないものにはバインドしないままにします。?a<type/2>?a

次に、finalは、バインドされていないFILTER行のみを選択します。?a

SPARQL 1.1では、はるかに簡単です。

SELECT ?a WHERE {
    ?a a <type/1>.
    FILTER NOT EXISTS { ?a a <type/2> . }
}
于 2011-08-17T18:34:53.910 に答える