我有像这样的SPARQL查询
PREFIX prefix: <http://example.org/ns#>
SELECT *
WHERE
{
?x rdf:type ?type .
}
现在假设我想将?type
的类型指定为prefix:type1
或prefix:type2
;应该怎么做?
答案 0 :(得分:13)
使用FILTER IN
比BINDINGS
函数快得多。我强烈建议使用以下查询而不是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))
}
请注意,我无法保证效率,因为我不知道在所有结果将被退回后是否适用过滤。