SPARQL:投影到不存在的变量

问题描述 投票:0回答:1

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 
sparql wikidata
1个回答
3
投票

是否有解决方法可以使 LIMIT 发挥作用?

是的。如果您从第一个子查询的

?duration
子句中删除
SELECT
,则该查询将使用
LIMIT

Blazegraph 有错误吗?

是的。删除

?duration
不应更改查询结果,但如果存在
LIMIT
,则显然会更改结果。

我们知道,无论我们是否从 SELECT 子句中删除

?duration
?duration
在第一个子查询的所有解决方案中都是未绑定的。因此,两个查询之间的唯一区别在于变量是否“在范围内”。而且SPARQL的join操作的定义根本不涉及变量范围。它仅取决于解决方案中实际绑定的变量。因此,更改范围内的变量不应更改查询的结果。

如果我们投影解决方案域中不存在的变量,然后使用该变量进行连接(如示例中的?duration),那么行为应该是什么?

该变量应被视为始终未绑定,但在范围内。这意味着:

    bound(?var)
  • 应该始终是
    false
  • SELECT *
  • 应包含始终为空的
    ?var
  • SELECT ... ("xxx" AS ?var)
  • 应该会导致语法错误,因为
    ?var
    已经在范围内
    
        
© www.soinside.com 2019 - 2024. All rights reserved.