SPARQL:投影在一个不存在的变量上

SPARQL: Projecting on a non-existing variable

Wikidata endpoint.

上尝试在末尾添加和不添加 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 已经在范围