我有这样的 SPARQL 查询
PREFIX prefix: <http://example.org/ns#> SELECT * WHERE { ?x rdf:type ?type . }
假设现在我想将?type的类型指定为prefix:type1或prefix:type2;该怎么做?
?type
prefix:type1
prefix:type2
比FILTER IN函数快得多的是使用BINDINGS。我强烈建议使用以下查询而不是FILTER(?type IN (wo:Kingdon, wo:Phylum)的内容。
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 e.g.
UNION
PREFIX prefix: <http://example.org/ns#> SELECT * WHERE { { ?x a prefix:type1 } UNION { ?x a prefix:type2 } }
注意使用a这是一个 SPARQL 关键字,可以在谓词位置使用并对应于 RDF 类型 URI http://www.w3.org/1999/02/22-rdf-syntax-ns#type
a
http://www.w3.org/1999/02/22-rdf-syntax-ns#type
还有其他方法可以执行此操作,例如使用带有各种表达式的FILTER子句:
FILTER
?type = prefix:type1系列与条件或运算符||结合
?type = prefix:type1
||
?type IN (prefix:type1, prefix:type2)
或者您可以使用VALUES子句指定?type的选项
VALUES
如果您的查询更复杂并且您不希望将大部分查询复制到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)) }
请注意,我不能保证效率,因为我不知道在所有结果将被退回后是否适用过滤。
3 回答
比
FILTER IN
函数快得多的是使用BINDINGS
。我强烈建议使用以下查询而不是FILTER(?type IN (wo:Kingdon, wo:Phylum)
的内容。使用
BINDINGS
允许 SPARQL 引擎在处理结果时限制结果,而不是在过滤之前返回所有结果。这样可以更快地返回结果。你可以使用
UNION
e.g.注意使用
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 语法执行此操作,如下所示:
请注意,我不能保证效率,因为我不知道在所有结果将被退回后是否适用过滤。