当试图找出为什么某个查询没有产生预期结果时,我在 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”,询问所有日期则不会产生任何结果。这是一个错误还是我在这里遗漏了一些明显的东西?
代表
您提到的问题已在 GraphDB 的更高版本(10.3.0)中得到修复,计划在未来几周内发布。 GraphDB 还有一封支持邮件,可以在紧急情况下以更快的方式讨论和解决所提供的问题: