Sparql UNION возвращает Virtuoso 37000 Ошибка SP031 - PullRequest
0 голосов
/ 17 марта 2019

У меня есть запрос, показанный ниже:

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" в их "title" или "description" (второе предложение 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 Ответ

0 голосов
/ 17 марта 2019

Возможно, ошибка в исполнителе или оптимизаторе запросов. Эксперты 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'"))
  } 
 }     
}
...