SPARQL:投影不存在的变量

时间:2019-06-06 15:56:04

标签: sparql wikidata

尝试在Wikidata endpoint的末尾使用带或不带limit子句的查询。

有LIMIT子句here,此处没有LIMIT子句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 

1 个答案:

答案 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)已经在范围内
相关问题