Как использовать оператор Клини-звезды (*) или его вариант (+) с переменными в 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
и ваша альтернатива (что позволяет мой пример). Вы можете переместить *
оператор в скобках и добавьте его к каждой альтернативе, если вы хотите чистые цепочки определенных свойств.