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

3
我正在使用以下查询来查找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个回答

3

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

Virtuoso给出的错误信息更多地涉及到其实现的属性路径和联合,而不是实际的SPARQL查询。 SPARQL查询部分看起来是正确的。(我无法对Virtuoso特定的定义进行评论。)

在原始SPARQL标准中需要联合的许多地方,现在可以使用values指定变量可以具有的特定值。 这通常会导致更易读的查询(至少在我看来),一些终端,如Virtuoso,似乎处理得更好。

使用values(并使用终端网页界面使用的dbpedia-owl前缀),您的查询变成以下形式,Virtuoso返回您要查找的内容:

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

SPARQL结果

其他注意事项

当我在任何数字替换“*”时,都会出现同样的错误。我正在使用Virtuoso作为DBPedia SPARQL终端。

Virtuoso接受属性路径长度的{n,m}符号表示法,但请注意,尽管这些符号出现在一些属性路径的草案中,但它们实际上并没有被纳入SPARQL 1.1标准中。虚拟机仍然支持它们,但如果您使用它们,则可能无法在其他终端上使用查询。


感谢您的帮助。然而,还有一些属性尚未返回。例如,/PopulationTotal是一个具有域“populatedPlace”的属性,它是“City”的超级超类和范围整数。但它还没有在结果中。我认为Virtuoso存在一些问题。 - user3070752
@amirveyseh 你是指 http://dbpedia.org/ontology/populationTotal 吗?我没有看到该属性声明了一个域,只有一个范围。 - Joshua Taylor
抱歉,我使用旧版本的DBPedia本体架构(版本3.5.1)进行了检查,看起来在新版本中已经更改了。 - user3070752

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接