Как использовать оператор Клини-звезды (*) или его вариант (+) с переменными в sparql?

У меня есть некоторый рабочий код для получения всех предков термина в иерархии. Следующий:

    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 ответа

Решение

Ты не можешь В разделе " Пути свойств" спецификации SPARQL 1.1 говорится:

Концами пути могут быть RDF-термины или переменные. Переменные нельзя использовать как часть самого пути, только в целях.

Вы могли бы потенциально использовать альтернативы, чтобы захватить это:

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

Точная форма должна отражать вашу структуру данных и то, хотите ли вы разрешить смешивание skos:broader и ваша альтернатива (что позволяет мой пример). Вы можете переместить * оператор в скобках и добавьте его к каждой альтернативе, если вы хотите чистые цепочки определенных свойств.

Другие вопросы по тегам