我有一个像这样的 SPARQL 查询
PREFIX prefix: <http://example.org/ns#>
SELECT *
WHERE
{
?x rdf:type ?type .
}
假设现在我想将类型指定?type
为prefix:type1
or prefix:type2
; 这应该怎么做?
比FILTER IN
函数快得多的是使用BINDINGS
. 我强烈建议使用以下查询的内容,而不是FILTER(?type IN (wo:Kingdon, wo:Phylum)
.
SELECT * WHERE { ?x rdf:type ?type } BINDINGS ?type {(prefix:type1) (prefix:type2)}
UsingBINDINGS
允许 SPARQL 引擎在处理结果时限制结果,而不是在过滤之前返回所有结果。这使得返回结果更快。
你可以使用UNION
例如
PREFIX prefix: <http://example.org/ns#>
SELECT *
WHERE {
{ ?x a prefix:type1 } UNION { ?x a prefix:type2 }
}
注意其中的使用a
是一个 SPARQL 关键字,它可以用在谓词位置并且对应于 RDF 类型 URIhttp://www.w3.org/1999/02/22-rdf-syntax-ns#type
还有其他方法可以做到这一点,例如使用FILTER
带有各种表达式的子句:
?type = prefix:type1
与条件或运算符组合的系列||
?type IN (prefix:type1, prefix:type2)
或者你可以使用一个VALUES
子句来指定选项?type
如果您的查询更复杂并且您不想将大部分查询复制到两侧UNION
或有两个以上的可能性要考虑,这些可能会更好。
您可以使用 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
}