Как использовать оператор Клини-звезды (*) или его вариант (+) с переменными в sparql? - PullRequest
0 голосов
/ 14 ноября 2018

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

    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 голосов
/ 20 ноября 2018

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

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

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

0 голосов
/ 14 ноября 2018

Вы не можете. В разделе Свойства пути спецификации SPARQL 1.1 указано:

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

...