2013-04-15 15 views
10

私はこのは、複数のRDFを指定:SPARQLクエリ内の型

PREFIX prefix: <http://example.org/ns#> 
SELECT * 
WHERE 
{ 
    ?x rdf:type ?type . 
} 

のようなSPARQLクエリは、今私はprefix:type1またはprefix:type2いずれかとして?typeのタイプを指定したいと持っています。これはどのように行うべきですか?

答えて

10

UNIONなどを使用できます。

PREFIX prefix: <http://example.org/ns#> 
SELECT * 
WHERE { 
    { ?x a prefix:type1 } UNION { ?x a prefix:type2 } 
} 

注述語の位置で使用することができるSPARQLキーワードであり、RDF型URI http://www.w3.org/1999/02/22-rdf-syntax-ns#type

に対応aを用いるようでFILTER句を使用して、これを行うために他の方法があります様々な表情:?type = prefix:type1

  • シリーズ条件又はオペレータと組み合わせ||
  • ?type IN (prefix:type1, prefix:type2)

それとも?type

クエリがより複雑であり、あなたが両面にクエリの多くを複製したくない場合は、これらが良いかもしれするためのオプションを指定するVALUES句を使用することができますUNIONの2つの可能性を考慮する必要があります。

+0

"the type in"は興味深いようですが、機能していない、私は確かに構文上のエラーをしています、そうですか? SELECT * WHERE { ?x rdf:type?type ?type(wo:Kingdom、wo:Phylum) } – Noor

+2

これらは 'FILTER'節で使用できる式ですので、' FILTER(?タイプIN(wo:Kingdon、wo:Phylum)) ' – RobV

9

FILTER INよりもはるかに速く、BINDINGSの機能が使用されます。 FILTER(?type IN (wo:Kingdon, wo:Phylum)ではなく、次のクエリの行に沿って何かを使用することを強くお勧めします。 BINDINGSを使用

SELECT * WHERE { ?x rdf:type ?type } BINDINGS ?type {(prefix:type1) (prefix:type2)} 

は、それが、それらをフィルタリングする前に、すべての結果を返すのではなく、処理されているようにSPARQLエンジンが結果を制限することを可能にします。これにより、結果がずっと速く返されます。

+4

もうバインドされません。それは価値です。このアプローチは、UNIONを使用するよりも優れていますが、FILTER(?IN IN ...)を使用するよりも使いやすくなります。 –

2

あなたはこのように、フィルタ構文を使用してそれを行うことができます:

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

は、すべての結果が返されます後にフィルタリングが適用される場合、私は知らないと私は、効率性を保証することはできませんのでご注意くださいまたはない。

関連する問題