在SPARQL查询中指定多个rdf:类型

时间:2013-04-15 22:03:02

标签: rdf sparql

我有像这样的SPARQL查询

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

现在假设我想将?type的类型指定为prefix:type1prefix:type2;应该怎么做?

4 个答案:

答案 0 :(得分:13)

使用FILTER INBINDINGS函数快得多。我强烈建议使用以下查询而不是FILTER(?type IN (wo:Kingdon, wo:Phylum)的内容。

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

使用BINDINGS允许SPARQL引擎在处理结果时限制结果,而不是在过滤之前返回所有结果。这样可以更快地返回结果。

答案 1 :(得分:12)

您可以使用UNION例如

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

请注意a的使用,它是一个SPARQL关键字,可用于谓词位置并对应于RDF类型URI 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 :(得分:3)

如Joshua所述,在SPARQL 1.1中,已接受的答案不再准确。

在SPARQL 1.1中,可以使用VALUES关键字,但是对于像这样的用例,语法看起来更加复杂。但是,您也可以将其写为紧凑形式:

SELECT * WHERE {
  VALUES ?type { prefix:Type1 prefix:Type2 }
  ?x rdf:type ?type
}

答案 3 :(得分: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))
}

请注意,我无法保证效率,因为我不知道在所有结果将被退回后是否适用过滤。