【发布时间】:2013-04-15 22:03:02
【问题描述】:
我有一个这样的 SPARQL 查询
PREFIX prefix: <http://example.org/ns#>
SELECT *
WHERE
{
?x rdf:type ?type .
}
假设现在我想将?type 的类型指定为prefix:type1 或prefix:type2;这应该怎么做?
【问题讨论】:
我有一个这样的 SPARQL 查询
PREFIX prefix: <http://example.org/ns#>
SELECT *
WHERE
{
?x rdf:type ?type .
}
假设现在我想将?type 的类型指定为prefix:type1 或prefix:type2;这应该怎么做?
【问题讨论】:
比FILTER IN 函数快得多的是使用BINDINGS。我强烈建议使用以下查询的内容,而不是FILTER(?type IN (wo:Kingdon, wo:Phylum)。
SELECT * WHERE { ?x rdf:type ?type } BINDINGS ?type {(prefix:type1) (prefix:type2)}
使用BINDINGS 允许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 子句中使用的表达式,所以它是FILTER(?type IN (wo:Kingdon, wo:Phylum))
您可以使用 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
}
【讨论】: