Спецификация путей свойств SPARQL 1.1 содержит:
elt1 / elt2 A sequence path of elt1, followed by elt2
elt* A path of zero or more occurrences of elt.
elt+ A path of one or more occurrences of elt.
Я ожидаю, что elt1 / elt2*
всегда совпадает с объединением elt1
и elt1 / elt2+
.
Однако на практике это не так.
Этот запрос возвращает пустой результат
SELECT * FROM <http://www.snik.eu/ontology/bb>
{
?class rdfs:label ?label.
FILTER(LANGMATCHES(LANG(?label),"en"))
BIND(<http://www.snik.eu/ontology/bb/chapter10.4> as ?chapter)
?class meta:chapter/meta:subChapterOf* ?chapter.
}
Этот запрос возвращает непустой результат
SELECT * FROM <http://www.snik.eu/ontology/bb>
{
?class rdfs:label ?label.
FILTER(LANGMATCHES(LANG(?label),"en"))
BIND(<http://www.snik.eu/ontology/bb/chapter10.4> as ?chapter)
{?class meta:chapter ?chapter}
UNION
{?class meta:chapter/meta:subChapterOf+ ?chapter.}
}
Почему это так?
- Не верно ли мое предположение, что
elt1/elt2* = elt1 UNION elt1/elt2+
? - Не правильно ли я перевел это предположение в запросы SPARQL? Или есть какая-то ошибка в запросе, которая не перехватывается анализатором запросов?
- Или это специфическая для реализации деталь конечной точки SPARQL? Я использую Virtuoso версию 07.20.3217 для Linux (x86_64-unknown-linux-gnu), Single Server Edition.
PS
Я пытался прикрепить график к этому сообщению, чтобы кто-томожет воспроизвести проблему, но когда я выгружаю график и загружаю его в другой график, проблема не возникает на новом графике.
Обновление
У нас есть другие похожие странные результаты в отношениипути собственности и предположим, что это как-то связано со старой версией конечной точки Virtuoso. К сожалению, мы не можем выполнить обновление до последней версии из-за некоторых приложений, использующих библиотеку PHP5.6 ODBC, поэтому сейчас мы попытаемся обойти эту проблему.