如何在任意长度的sparql路径中使用Union /或?

时间:2015-03-24 13:15:43

标签: path rdf sparql dbpedia virtuoso

我正在使用以下查询来查找来自DBPedia本体的城市(或城市的超类)或国家/地区(或国家/地区的超级类别)的所有属性。当我使用固定长度的路径没有问题但是当我把 * 定义为任意长度的路径时,我得到这个错误:

  

Virtuoso 37000错误SP031:SPARQL编译器:变量   '_ :: trans_subj_6_4'用于查询的子表达式,但不是   分配

我的SPARQL:

define sql:signal-void-variables 1
define input:default-graph-uri <http://dbpedia.org>

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX res: <http://dbpedia.org/resource/>
PREFIX owl:<http://www.w3.org/2002/07/owl#>
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>

select ?property where{
  { ?property rdfs:domain/^rdfs:subClassOf* dbo:City }
  UNION
  { ?property rdfs:range/^rdfs:subClassOf* dbo:Country } 
}

此外,当我输入任何数字而不是 * 时,我会得到同样的错误。我使用Virtuoso作为DBPedia SPARQL端点。

1 个答案:

答案 0 :(得分:2)

使用VALUES代替UNION(如果可以)

错误Virtuoso为您提供了更多关于其实现属性路径和 union 的信息,而不是实际的SPARQL查询。查询的SPARQL部分看起来是正确的。 (我无法与Virtuoso特定的定义说话。)

在原始SPARQL标准中需要 union 的许多地方,您现在可以使用来指定变量可以具有的特定值。它通常会导致更可读的查询(至少在我看来),而某些端点(如Virtuoso)似乎更好地处理它。

使用(并使用端点使用的网络界面使用的 dbpedia-owl 前缀),您将查询以下内容,并且Virtuoso将返回您的内容&#39 ;寻找:

select ?property where {
  values (?p ?v) { (rdfs:domain dbpedia-owl:City)
                   (rdfs:range dbpedia-owl:Country) }
  ?property ?p ?class  .
  ?class ^rdfs:subClassOf* ?v .
}

SPARQL results

其他注释

  

当我输入任何数字而不是*时,我得到同样的错误。我正在使用   Virtuoso作为DBPedia SPARQL端点。

虽然Virtuoso接受{n,m}符号表示属性路径的长度,但请注意,虽然这些符号出现在属性路径的某些草案中,但它们实际上并没有进入SPARQL 1.1标准。 Virtuoso仍然接受它们,但如果您使用它们,您可能无法将查询与其他端点一起使用。