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

Noo*_*oor 12 rdf sparql

我有这样的SPARQL查询

PREFIX prefix: <http://example.org/ns#>
SELECT *
WHERE 
{
    ?x rdf:type ?type .
}
Run Code Online (Sandbox Code Playgroud)

假设现在我想指定的类型?typeprefix:type1或者prefix:type2; 该怎么做?

小智 14

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

SELECT * WHERE { ?x rdf:type ?type } BINDINGS ?type {(prefix:type1) (prefix:type2)}
Run Code Online (Sandbox Code Playgroud)

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

  • 这不再是BINDINGS了; 这是价值.这种方法比使用UNION的方法更好,并且比使用FILTER(?type IN ...)更好. (5认同)

Rob*_*obV 13

你可以使用UNION例如

PREFIX prefix: <http://example.org/ns#>
SELECT *
WHERE {
    { ?x a prefix:type1 } UNION { ?x a prefix:type2 }
}
Run Code Online (Sandbox Code Playgroud)

请注意,使用的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))` (2认同)

Adr*_*end 5

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

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

SELECT * WHERE {
  VALUES ?type { prefix:Type1 prefix:Type2 }
  ?x rdf:type ?type
}
Run Code Online (Sandbox Code Playgroud)