尝试在Wikidata endpoint的末尾使用带或不带limit子句的查询。
现在看到区别...我认为这是因为第一个子查询的投影中的?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
答案 0 :(得分:3)
是否有一种解决方法可以使LIMIT正常工作?
是的。如果您从第一个子查询的to_excel
子句中删除?duration
,则该查询将与SELECT
一起使用。
Blazegraph中是否存在错误?
是的。删除LIMIT
不应更改查询的结果,但是如果存在?duration
,显然会更改结果。
我们知道LIMIT
在第一个子查询的所有解决方案中都是未绑定的,无论我们是否从SELECT子句中删除了?duration
。因此,这两个查询之间的唯一区别是变量是否在范围内 。而且SPARQL的join操作的定义根本不涉及变量范围。它仅取决于解决方案中实际绑定的变量。因此,更改范围内的变量不应更改查询的结果。
如果我们在解决方案领域中不存在的变量上进行投影,然后使用该变量进行联接(例如示例中的“持续时间”),那么行为应该是什么?
应将变量始终视为未绑定,但应在范围内。这意味着:
?duration
应该始终为bound(?var)
false
应该包含一个SELECT *
列,该列始终为空?var
应该会导致语法错误,因为SELECT ... ("xxx" AS ?var)
已经在范围内