我有这样的SPARQL查询
PREFIX prefix: <http://example.org/ns#>
SELECT *
WHERE
{
?x rdf:type ?type .
}
Run Code Online (Sandbox Code Playgroud)
假设现在我想指定的类型?type为prefix: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引擎在处理结果时限制结果,而不是在过滤之前返回所有结果.这样可以更快地返回结果.
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或者有两个可能需要考虑的情况下,这些可能会更好.
正如 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)
| 归档时间: |
|
| 查看次数: |
7554 次 |
| 最近记录: |