我使用下面的查询从 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 http://dbpedia.org/sparql作为 DBPedia SPARQL 端点。
使用 VALUES 而不是 UNION(如果可以的话)
Virtuoso 给你的错误更多是关于它的属性路径的实现和union比实际的 SPARQL 查询。查询的 SPARQL 部分看起来是正确的。 (我无法具体谈论 Virtuosodefines.)
在很多需要的地方union在原始 SPARQL 标准中,您现在可以使用values指定变量可以具有的特定值。它通常会导致更具可读性的查询(至少在我看来),并且某些端点(例如 Virtuoso)似乎可以更好地处理它。
Using values(并使用数据库百科-猫头鹰端点的 Web 界面使用的前缀),您的查询将变为以下内容,Virtuoso 将返回您要查找的内容:
select ?property where {
values (?p ?v) { (rdfs:domain dbpedia-owl:City)
(rdfs:range dbpedia-owl:Country) }
?property ?p ?class .
?class ^rdfs:subClassOf* ?v .
}
其他注意事项
另外,当我输入任何数字而不是 * 时,我会得到同样的错误。我在用着
Virtuoso 作为 DBPedia SPARQL 端点。
虽然 Virtuoso 接受属性路径长度的 {n,m} 表示法,但请注意,虽然这些属性路径出现在某些草稿中,但它们实际上并未纳入 SPARQL 1.1 标准。 Virtuoso 仍然接受它们,但如果您使用它们,您可能无法将查询与其他端点一起使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)