Sparql UNION возвращает Virtuoso 37000 Ошибка SP031
У меня есть запрос, показанный ниже:
SELECT DISTINCT ?dataset ?title WHERE {
?dataset a dcat:Dataset ;
dcterms:title ?title ;
dcterms:description ?description .
{ ?dataset dcterms:title ?title .
?title bif:contains "'keyword_1'" }
UNION
{ ?dataset dcterms:description ?description .
?description bif:contains "'keyword_1'" }
{ ?dataset dcterms:title ?title .
?title bif:contains "'keyword_2'" }
UNION
{ ?dataset dcterms:description ?description .
?description bif:contains "'keyword_2'" }
}
Семантически этот запрос должен возвращать все наборы данных, которые имеют "keyword_1" в своем "заголовке" или "описании" (это первое предложение UNION) и "keyword_2" в их "заголовке" или "описании" (второе UNION пункт). Намерение состоит в том, чтобы пересекать эти два предложения UNION вместе, то есть получать только те наборы данных, которые удовлетворяют обоим предложениям.
Этот валидатор говорит мне, что запрос синтаксически правильный. Однако при отправке запроса в Virtuoso возвращается следующая ошибка:
Virtuoso 37000 Error SP031: SPARQL compiler: Internal error: sparp_find_triple_with_var_obj_of_freetext(): lost connection between triple pattern and an ft predicate
SPARQL query:
define sql:big-data-const 0
output-format:text/html<br>
define sql:signal-void-variables 1
У вас есть идея, что происходит? Я не понимаю, что Virtuoso пытается сказать мне, когда заявляет "потеря связи между тройным шаблоном и предикатом ft"...
Заранее спасибо!
1 ответ
Возможно ошибка в исполнителе запросов или оптимизаторе. Эксперты Virtuoso, такие как TallTed, знают лучше и окажут вам поддержку. Я могу по крайней мере воспроизвести это, например, на https://www.europeandataportal.eu/sparql который работает на Virtuoso version 07.20.3230 on Linux (x86_64-unknown-linux-gnu), Single Server Edition
,
Но, что более важно: ваш запрос выглядит слишком сложным, так как вы могли бы использовать FILTER
с логическим ||
в комбинации с &&
- по крайней мере, я так думал.
К сожалению, это не с ошибкой
Virtuoso 37000 Error SP031: SPARQL compiler: No suitable triple pattern is found for a variable $description in special predicate bif:contains() at line 7 of query
и ни
SELECT DISTINCT ?dataset ?title WHERE {
?dataset a dcat:Dataset ;
dcterms:title ?title ;
dcterms:description ?description .
filter( (bif:contains(?title, "'keyword_1'") || bif:contains(?description,"'keyword_1'"))
&&
(bif:contains(?title, "'keyword_2'") || bif:contains(?description,"'keyword_2'"))
)
}
ни
SELECT DISTINCT ?dataset ?title WHERE {
?dataset a dcat:Dataset ;
dcterms:title ?title ;
dcterms:description ?description .
filter(bif:contains(?title, "'keyword_1'") || bif:contains(?description,"'keyword_1'"))
filter(bif:contains(?title, "'keyword_2'") || bif:contains(?description,"'keyword_2'"))
}
делай работу, как я ожидал.
(Подробный) обходной путь с использованием подзапросов:
SELECT DISTINCT ?dataset ?title WHERE {
{
select ?dataset ?title {
?dataset a dcat:Dataset ;
dcterms:title ?title ;
dcterms:description ?description .
filter( bif:contains(?title, "'keyword_1'") || bif:contains(?description,"'keyword_1'"))
}
}
{
select ?dataset ?title {
?dataset a dcat:Dataset ;
dcterms:title ?title ;
dcterms:description ?description .
filter( bif:contains(?title, "'keyword_2'") || bif:contains(?description,"'keyword_2'"))
}
}
}