14

我有一个像这样的 SPARQL 查询

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

假设现在我想将类型指定?typeprefix:type1or prefix:type2; 这应该怎么做?

4

4 回答 4

15

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

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

UsingBINDINGS允许 SPARQL 引擎在处理结果时限制结果,而不是在过滤之前返回所有结果。这使得返回结果更快。

于 2013-04-30T13:52:04.567 回答
14

你可以使用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或有两个以上的可能性要考虑,这些可能会更好。

于 2013-04-15T22:28:32.110 回答
3

您可以使用 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))
}

请注意,我不能保证效率,因为我不知道在返回所有结果之后是否会应用过滤。

于 2015-04-04T09:57:28.000 回答
3

正如 Joshua 所提到的,在 SPARQL 1.1 中接受的答案不再准确。

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

SELECT * WHERE {
  VALUES ?type { prefix:Type1 prefix:Type2 }
  ?x rdf:type ?type
}
于 2020-08-25T09:54:14.047 回答