在 Wikidata 端点上尝试使用或不使用 limit 子句的查询。
有 LIMIT 子句这里,没有 LIMIT 子句在这里这里。
现在看看差异...我认为其原因是第一个子查询投影中的
?duration
变量,它确实没有绑定,也不在解决方案映射的域中。现在我认为 Blazegraph 中肯定存在一个错误。但问题仍然是:如果我们投影解决方案域中不存在的变量,然后使用该变量进行连接(如示例中的 ?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 发挥作用?
是的。如果您从第一个子查询的
?duration
子句中删除 SELECT
,则该查询将使用 LIMIT
。
Blazegraph 有错误吗?
是的。删除
?duration
不应更改查询结果,但如果存在 LIMIT
,则显然会更改结果。
我们知道,无论我们是否从 SELECT 子句中删除
?duration
,?duration
在第一个子查询的所有解决方案中都是未绑定的。因此,两个查询之间的唯一区别在于变量是否“在范围内”。而且SPARQL的join操作的定义根本不涉及变量范围。它仅取决于解决方案中实际绑定的变量。因此,更改范围内的变量不应更改查询的结果。
如果我们投影解决方案域中不存在的变量,然后使用该变量进行连接(如示例中的?duration),那么行为应该是什么?该变量应被视为始终未绑定,但在范围内。这意味着:
bound(?var)
false
SELECT *
?var
列SELECT ... ("xxx" AS ?var)
?var
已经在范围内