如何在sparql中将kleene star运算符(*)或其变体(+)与变量一起使用?

时间:2018-11-14 01:56:32

标签: sparql kleene-star

我有一些工作代码可用于获取层次结构中某个术语的所有祖先。 正在关注:

    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>

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

2 个答案:

答案 0 :(得分:2)

不能。正如SPARQL 1.1规范的Property Paths section所述:

  

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

答案 1 :(得分:0)

您可能会使用替代方法来捕获此信息:

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

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