Sparql UNION返回Virtuoso 37000错误SP031

时间:2019-03-17 14:02:09

标签: sparql rdf virtuoso openlink-virtuoso dcat

我有如下所示的查询:

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'" }
    }

从语义上讲,该查询应该返回所有在其“标题”或“描述”(这是第一个UNION子句)中具有“ keyword_1”且在其“ title”或“ description”中具有“ keyword_2”的所有数据集(第二个UNION子句)。目的是将这两个UNION子句相交,即,仅获取同时满足这两个子句的那些数据集。

validator告诉我该查询在语法上是正确的。但是,将查询发送到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 

您知道发生了什么吗?当我说“三元模式和ft谓词之间的连接丢失”时,我不明白维塔索想告诉我什么。

谢谢!

1 个答案:

答案 0 :(得分:0)

可能是查询执行程序或优化程序中的错误。像TallTed这样的Virtuoso专家会了解更多,并会给您支持。 我至少可以在例如在Virtuoso version 07.20.3230 on Linux (x86_64-unknown-linux-gnu), Single Server Edition上运行的https://www.europeandataportal.eu/sparql

但是,更重要的是:您的查询看起来太复杂了,因为您可以将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'"))
  } 
 }     
}