我有如下所示的查询:
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谓词之间的连接丢失”时,我不明白维塔索想告诉我什么。
谢谢!
答案 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'"))
}
}
}