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

在SPARQL查询中指定多个rdf:类型,rdf,sparql,Rdf,Sparql,我有这样一个SPARQL查询 PREFIX prefix: <http://example.org/ns#> SELECT * WHERE { ?x rdf:type ?type . } 前缀: 挑选* 哪里 { ?x rdf:类型?类型。 } 假设现在我想将?type的类型指定为前缀:type1或前缀:type2;应该如何做到这一点?您可以使用UNION例如 PREFIX prefix: <http://example.org/ns#> SELECT *

我有这样一个SPARQL查询

PREFIX prefix: <http://example.org/ns#>
SELECT *
WHERE 
{
    ?x rdf:type ?type .
}
前缀:
挑选*
哪里
{
?x rdf:类型?类型。
}

假设现在我想将
?type
的类型指定为
前缀:type1
前缀:type2
;应该如何做到这一点?

您可以使用
UNION
例如

PREFIX prefix: <http://example.org/ns#>
SELECT *
WHERE {
    { ?x a prefix:type1 } UNION { ?x a prefix:type2 }
}
前缀:
挑选*
在哪里{
{?xa前缀:type1}联合{?xa前缀:type2}
}
注意使用了
a
,这是一个SPARQL关键字,可以在谓词位置使用,并对应于RDF类型URI
http://www.w3.org/1999/02/22-rdf-syntax-ns#type

还有其他方法可以做到这一点,例如对各种表达式使用
FILTER
子句:

  • 系列?type=前缀:type1
    与条件或运算符组合
    |
  • ?输入(前缀:type1,前缀:type2)
或者您可以使用
VALUES
子句指定
类型的选项


如果您的查询更复杂,并且不想将查询的大部分复制到的两边,或者有更多的两个可能要考虑的话,这些可能会更好。

比>过滤器在函数中要快得多,就是使用<代码>绑定< /代码>。我强烈建议使用与以下查询类似的内容,而不是

过滤器(?键入(wo:Kingdon,wo:Phylum)

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

使用
绑定
允许SPARQL引擎在处理结果时限制结果,而不是在筛选结果之前返回所有结果。这使得返回结果的速度更快。

您可以使用筛选语法执行此操作,如下所示:

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))
}
前缀rdf:
前缀:
选择s?p?o?类型
在哪里{
这是一种类型。
?s?p?o。
过滤器(?键入(前缀:Type1,前缀:Type2))
}

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

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

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

SELECT * WHERE {
  VALUES ?type { prefix:Type1 prefix:Type2 }
  ?x rdf:type ?type
}

“type-in”看起来很有趣,但它不起作用,我肯定在语法上犯了一个错误,对吗?选择*WHERE{x rdf:type-type-in(wo:Kingdom,wo:Phylum)}这些表达式可以在
FILTER
子句中使用,所以它应该是
FILTER(?type-in(wo:Kingdon,wo:Phylum))
它不再是绑定,而是值。不过,这种方法比使用UNION更好,也比使用FILTER(?键入…)更好。