GraphDB 中奇怪的 SPARQL 行为

问题描述 投票:0回答:1

当试图找出为什么某个查询没有产生预期结果时,我在 GraphDB (10.2.1) 中遇到了一些奇怪的行为。用一小部分测试数据复制了它。

海龟测试数据

@prefix ex: <http://example.com/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

ex:1 ex:hasDate "2022-03-01"^^xsd:date .
ex:2 ex:hasDate "2021-03-01"^^xsd:date .
ex:3 ex:hasDate "2022-08-24"^^xsd:date .

将此数据导入到空存储库中,然后执行以下查询:

PREFIX ex: <http://example.com/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT *
WHERE
{
    BIND("2022-01-01"^^xsd:date AS ?start_period)
    BIND("2022-12-31"^^xsd:date AS ?end_period)    
    ?something ex:hasDate ?date .
    FILTER (?date < ?end_period)
    FILTER (?date > ?start_period)
    {
        BIND("test" AS ?unused)       
    } UNION {
        BIND("test2" AS ?also_unused)
    }
}

现在我得到了预期的结果:

开始_期间 期末 某事 日期 未使用 也_未使用
“2022-01-01”^^xsd:日期 2022-12-31"^^xsd:日期 例如:1 “2022-03-01”^^xsd:日期 “测试”
“2022-01-01”^^xsd:日期 “2022-12-31”^^xsd:日期 例如:3 “2022-08-24”^^xsd:日期 “测试”
“2022-01-01”^^xsd:日期 “2022-12-31”^^xsd:日期 例如:1 “2022-03-01”^^xsd:日期 “测试2”
“2022-01-01”^^xsd:日期 “2022-12-31”^^xsd:日期 例如:3 “2022-08-24”^^xsd:日期 “测试2”

现在,对于奇怪的行为。如果删除任一过滤器,查询将返回空。但如果您随后还删除带有两个 BIND 指令的完整 UNION 语句,您将获得查询结果。

因此,UNION 语句与一个过滤器的组合似乎会导致问题。

此外,在没有得到任何结果的情况下,将

SELECT *
替换为
(MIN(?date) AS ?test)
将产生您期望的结果。所以以下确实产生了结果:

PREFIX ex: <http://example.com/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT (MIN(?date) AS ?test)
WHERE
{
    BIND("2022-01-01"^^xsd:date AS ?start_period)
    BIND("2022-12-31"^^xsd:date AS ?end_period)    
    ?something ex:hasDate ?date .
    FILTER (?date > ?start_period)
    {
        BIND("test" AS ?unused)       
    } UNION {
        BIND("test2" AS ?also_unused)
    }
}

但是如果你使用

SELECT *
来代替,则不会有结果。因此,询问“最小”日期会产生“2022-03-01”,询问所有日期则不会产生任何结果。这是一个错误还是我在这里遗漏了一些明显的东西?

代表

sparql graphdb
1个回答
0
投票

您提到的问题已在 GraphDB 的更高版本(10.3.0)中得到修复,计划在未来几周内发布。 GraphDB 还有一封支持邮件,可以在紧急情况下以更快的方式讨论和解决所提供的问题:

[email protected] .

© www.soinside.com 2019 - 2024. All rights reserved.