Sparql two-nested-opt dawg 测试查询结果难以理解

Sparql two-nested-opt dawg test query results hard to understand

DAWG测试查询two-nested-opt.rq是这样的:

PREFIX :    <http://example/>

SELECT *
{ 
    :x1 :p ?v .
    OPTIONAL
    {
      :x3 :q ?w .
      OPTIONAL { :x2 :p ?v }
    }
}

测试数据为:

@prefix   :         <http://example/> .
@prefix xsd:        <http://www.w3.org/2001/XMLSchema#> .

:x1 :p "1"^^xsd:integer .
:x2 :p "2"^^xsd:integer .
:x3 :q "3"^^xsd:integer .
:x3 :q "4"^^xsd:integer .

如果我运行查询,预期结果只有一条记录?v=1(简称)。不太明白自从评论了第二个optional,结果是两条记录:

  1. v=1,w=3
  2. v=1,w=4

我发现一些可能的解释提到第二个可选是空操作,因为 ?v 绑定在第二个可选和主 bgp 之间不匹配。但是不明白这是怎么解释的。无论第二个可选的结果是什么,第一个可选的结果不应该总是包含在解决方案中吗?

此测试用例是关于功能评估(也称为自下而上)以及 ?v 的早期(最内层)设置如何影响结果。在测试中,最里面的 ?v 设置会阻塞第一个 OPTIONAL 并且 ?w = 3 和 ?w = 4 不是结果。

一般情况是有一个外层的 ?v(OPTIONAL 的左边),然后是一个没有提到 ?v 的 OPTIONAL 部分,它本身有一个使用 ?v 的 OPTIONAL。

如果从上到下思考查询,答案就会不同。

评价为:

:x3 :q ?w leftjoin :x2 :p ?v 
    Two rows:
         ?w = 3; ?v = 2
         ?w = 4; ?v = 2

:x1 :p ?v 
   ?v = 1

现在将“?v = 1”与“?w = 3;?v = 2”左连接 -- OPTIONAL 不连接,因此结果是一行,“?v = 1”,没有 ?w绑定。

如果省略“:x2 :p ?v”,第一个

:x3 :q ?w
    Two rows:
         ?w = 3
         ?w = 4

两者都与 ?v = 1 连接,给出两行 ?v 和 ?w。