このようなSPARQLクエリがあります
PREFIX prefix: <http://example.org/ns#>
SELECT *
WHERE
{
?x rdf:type ?type .
}
?type
の型を or のいずれかprefix:type1
として指定したいとしますprefix:type2
。これはどのように行うべきですか?
UNION
たとえば、使用できます
PREFIX prefix: <http://example.org/ns#>
SELECT *
WHERE {
{ ?x a prefix:type1 } UNION { ?x a prefix:type2 }
}
a
which の使用は、述語の位置で使用でき、RDF タイプ URI に対応する SPARQL キーワードであることに注意してください。http://www.w3.org/1999/02/22-rdf-syntax-ns#type
FILTER
さまざまな式で句を使用するなど、これを行う他の方法があります。
?type = prefix:type1
条件付きまたは演算子と組み合わせた一連の||
?type IN (prefix:type1, prefix:type2)
または、VALUES
句を使用してオプションを指定できます?type
クエリがより複雑で、クエリの多くを の両側に複製したくない場合UNION
や、考慮すべき可能性が 2 つ以上ある場合は、これらの方が適している場合があります。
次のように、FILTER 構文を使用して実行できます。
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX prefix: <http://example.org/ns#>
SELECT ?s ?p ?o ?type
WHERE {
?s a ?type .
?s ?p ?o .
FILTER(?type IN (prefix:Type1, prefix:Type2))
}
すべての結果が返された後にフィルタリングが適用されるかどうかがわからないため、効率を保証できないことに注意してください。
Joshua が述べたように、受け入れられた回答は SPARQL 1.1 では正確ではなくなりました。
SPARQL 1.1 では、VALUESキーワードを使用できますが、このようなユースケースでは構文がより複雑に見えます。ただし、それをコンパクトな形式で書くこともできます。
SELECT * WHERE {
VALUES ?type { prefix:Type1 prefix:Type2 }
?x rdf:type ?type
}