Sparql两个嵌套的opt dawg测试查询结果难以理解

Sparql两个嵌套的opt dawg测试查询结果难以理解,sparql,optional,Sparql,Optional,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: <ht

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的记录。由于对第二个可选项进行了注释,因此无法真正理解,结果是两条记录:

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

这个测试用例是关于功能性评估的,也称为自底向上,以及最早的内部设置对结果的影响。在测试中,最内部的?v设置会阻止第一个可选设置,并且?w=3和?w=4不是结果

一般情况下,在可选部分的左侧有一个外部的?v,然后是一个可选部分,该可选部分没有提到?v,它本身有一个可选的使用?v

如果查询被认为是自上而下的,那么答案就会不同

评价是:

: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-可选项未联接,因此结果为一行,v=1,且无w绑定

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

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

这两个连接都使用?v=1进行连接,给出两行?v和?w。

如果您来自SQL世界,请将可选连接视为左外连接。而求值是左关联的。查询代数树是leftjoin quadpattern quad:x1:p?v leftjoin quadpattern quad:x3:q?w quadpattern quad:x2:p?vb但这正是我的观点。从关系的角度来看,删除最后一个左外部联接/可选联接不会增加结果的数量。。