Sparql UNION returns Virtuoso 37000 错误 SP031
Sparql UNION returns Virtuoso 37000 Error 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'" }
}
从语义上讲,此查询应该 return 所有在 "title" 或 "description" 中具有 "keyword_1" 的数据集(这是第一个 UNION 子句)和 "keyword_2" 在它们的 "title" 或 "description" (第二个 UNION 子句)中。目的是将这两个 UNION 子句交叉在一起,即只获取满足这两个子句的数据集。
这 validator 告诉我查询在语法上是正确的。但是,将查询发送到 Virtuoso 时,出现以下错误 returned:
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 在说 "lost connection between triple pattern and an ft predicate"...
时试图告诉我什么
提前致谢!
可能是查询执行器或优化器中的错误。像 TallTed 这样的 Virtuoso 专家更了解并会为您提供支持。
我至少可以在例如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'"))
}
}
}
我有如下所示的查询:
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'" }
}
从语义上讲,此查询应该 return 所有在 "title" 或 "description" 中具有 "keyword_1" 的数据集(这是第一个 UNION 子句)和 "keyword_2" 在它们的 "title" 或 "description" (第二个 UNION 子句)中。目的是将这两个 UNION 子句交叉在一起,即只获取满足这两个子句的数据集。
这 validator 告诉我查询在语法上是正确的。但是,将查询发送到 Virtuoso 时,出现以下错误 returned:
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 在说 "lost connection between triple pattern and an ft predicate"...
时试图告诉我什么提前致谢!
可能是查询执行器或优化器中的错误。像 TallTed 这样的 Virtuoso 专家更了解并会为您提供支持。
我至少可以在例如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'"))
}
}
}