【问题标题】:how to use Union/or in sparql path with arbitrary length?如何在任意长度的 sparql 路径中使用联合/或?
【发布时间】:2015-03-24 13:15:42
【问题描述】:

我正在使用以下查询从 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 端点。

【问题讨论】:

    标签: path rdf sparql dbpedia virtuoso


    【解决方案1】:

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

    Virtuoso 给您的错误更多是关于其属性路径和 联合 的实现,而不是实际的 SPARQL 查询。查询的 SPARQL 部分看起来是正确的。 (我无法与 Virtuoso 特定的定义交谈。)

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

    使用 values(并使用端点的 Web 界面使用的 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 results

    其他说明

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

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

    【讨论】:

    • 感谢您的帮助。但是有一些属性还没有返回。例如 /PopulationTotal 是一个域为populatedPlace 的属性,它是City 的超类和范围整数。但它还没有在结果中。我认为 Virtuoso 存在一些问题
    • @amirveyseh 你的意思是dbpedia.org/ontology/populationTotal 吗?我没有看到在该属性上声明的域,只是一个范围。
    • 对不起,我用旧版本的 DBPedia 本体架构(版本 3.5.1)检查了它,它似乎在新版本中发生了变化。
    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多