SPARQL:投影在一个不存在的变量上
SPARQL: Projecting on a non-existing variable
上尝试在末尾添加和不添加 limit 子句的查询
带有 LIMIT 子句 here, and without LIMIT clause here here。
现在看到区别了...我认为这是第一个子查询投影中的 ?duration
变量的原因,它确实没有绑定并且不在解决方案映射的域中。现在我认为 Blazergraph 中肯定存在错误。但无论如何,问题是:如果我们投影在解决方案域中不存在的变量上,然后使用该变量进行连接(如示例中的 ?duration
),行为应该是什么?忽略该变量或将其视为未绑定变量?
SELECT ?film ?duration
WHERE
{
{
select ?film ?duration
where
{?film <http://www.wikidata.org/prop/direct/P31> <http://www.wikidata.org/entity/Q11424>.}
}
{
select ?film ?duration
where
{?film <http://www.wikidata.org/prop/direct/P2047> ?duration .}
}
}
#limit 1000
是否有使 LIMIT 起作用的解决方法?
是的。如果从第一个子查询的 SELECT
子句中删除 ?duration
,则该查询适用于 LIMIT
.
Blazegraph 中有错误吗?
是的。删除 ?duration
不应该改变查询结果,但如果 LIMIT
存在,它显然会改变结果。
我们知道 ?duration
在第一个子查询的所有解决方案中都是未绑定的,无论我们是否从 SELECT 子句中删除了 ?duration
。所以这两个查询之间的唯一区别是变量是否在 范围 内。并且 SPARQL 的连接操作的定义根本没有引用变量范围。它仅取决于实际绑定在解决方案中的变量。因此,更改范围内的变量不应更改查询结果。
如果我们投影在解决方案域中不存在的变量上,然后使用该变量进行连接(如示例中的 ?duration),行为应该是什么?
变量应被视为始终未绑定,但在范围内。这意味着:
bound(?var)
应该总是 false
SELECT *
应该包含一个始终为空的 ?var
列
SELECT ... ("xxx" AS ?var)
应该导致语法错误,因为 ?var
已经在范围 中
带有 LIMIT 子句 here, and without LIMIT clause here here。
现在看到区别了...我认为这是第一个子查询投影中的 ?duration
变量的原因,它确实没有绑定并且不在解决方案映射的域中。现在我认为 Blazergraph 中肯定存在错误。但无论如何,问题是:如果我们投影在解决方案域中不存在的变量上,然后使用该变量进行连接(如示例中的 ?duration
),行为应该是什么?忽略该变量或将其视为未绑定变量?
SELECT ?film ?duration
WHERE
{
{
select ?film ?duration
where
{?film <http://www.wikidata.org/prop/direct/P31> <http://www.wikidata.org/entity/Q11424>.}
}
{
select ?film ?duration
where
{?film <http://www.wikidata.org/prop/direct/P2047> ?duration .}
}
}
#limit 1000
是否有使 LIMIT 起作用的解决方法?
是的。如果从第一个子查询的 SELECT
子句中删除 ?duration
,则该查询适用于 LIMIT
.
Blazegraph 中有错误吗?
是的。删除 ?duration
不应该改变查询结果,但如果 LIMIT
存在,它显然会改变结果。
我们知道 ?duration
在第一个子查询的所有解决方案中都是未绑定的,无论我们是否从 SELECT 子句中删除了 ?duration
。所以这两个查询之间的唯一区别是变量是否在 范围 内。并且 SPARQL 的连接操作的定义根本没有引用变量范围。它仅取决于实际绑定在解决方案中的变量。因此,更改范围内的变量不应更改查询结果。
如果我们投影在解决方案域中不存在的变量上,然后使用该变量进行连接(如示例中的 ?duration),行为应该是什么?
变量应被视为始终未绑定,但在范围内。这意味着:
bound(?var)
应该总是false
SELECT *
应该包含一个始终为空的?var
列SELECT ... ("xxx" AS ?var)
应该导致语法错误,因为?var
已经在范围 中