0

我有一些工作代码用于获取层次结构中术语的所有祖先。下列的:

    PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
    PREFIX skos-xl: <http://www.w3.org/2008/05/skos-xl#>
    PREFIX rdf: <http://www.w3.org/2000/01/rdf-schema#>

    select  ?grandparentliteralform (count(?parent) as ?distance)
    { ?iri skos:broader+ ?parent .
     ?parent skos:broader* ?grandparent .
     ?grandparent skos-xl:prefLabel ?grandparentlabel .
     ?grandparentlabel skos-xl:literalForm ?grandparentliteralform .
    } 
    group by ?grandparent
    order by DESC(?distance)

当 IRI 的更广泛的谓词是子属性 ( ?p rdf:subPropertyOf skos:broader) 时,它会中断所以现在我这样做是为了捕获所有子属性谓词:

select  ?grandparentliteralform (count(?parent) as ?distance)
{ ?iri ?p ?parent .
 ?parent skos:broader* ?grandparent .
 ?grandparent skos-xl:prefLabel ?grandparentlabel .
 ?grandparentlabel skos-xl:literalForm ?grandparentliteralform .
 ?p rdf:subPropertyOf   skos:broader .
} 
group by ?grandparent
order by DESC(?distance)

我真正想做的是:

select  ?grandparentliteralform (count(?parent) as ?distance)
{ ?iri ?p+ ?parent .
 ?parent ?p* ?grandparent .
 ?grandparent skos-xl:prefLabel ?grandparentlabel .
 ?grandparentlabel skos-xl:literalForm ?grandparentliteralform .
 ?p rdf:subPropertyOf   skos:broader .
} 
group by ?grandparent
order by DESC(?distance)

但使用?p+?p*抛出错误。

Unexpected token syntax error, unexpected <variable>, expecting <decimal literal> or <double literal> or <integer literal>

如何将*/+与变量一起使用?

4

2 回答 2

2

你不能。正如SPARQL 1.1 规范的属性路径部分所述:

路径的末端可能是 RDF 项或变量。变量不能用作路径本身的一部分,只能用作末端。

于 2018-11-14T02:38:50.233 回答
0

您可能会使用替代方法来捕获这一点:

?parent (skos:broader|your:alternative)* ?grandparent

确切的形式将需要反映您的数据结构以及您是否要允许混合skos:broader和您的替代方案(我的示例允许)。如果您想要特定属性的纯链,您可以将*运算符移动到括号内并将其添加到每个备选方案中。

于 2018-11-20T11:04:17.027 回答