SPARQL:将BGP划分为多个组

SPARQL:将BGP划分为多个组,sparql,Sparql,在之前的一篇文章中,有评论指出 select ?x ?y where { {?x rdf:type ex:someType} {?x ex:someProperty ?y} } 类似于(不完全相同): 使用相同的三重模式。但是,第一个查询包含两个BGP(每个都在一个组模式中),而第二个查询包含一个BGP(没有组模式)。 第一个查询的代数是两个BGP之间的JOIN,而第二个查询的代数只是BGP 第一查询代数(ApacheJena) (项目(?x

在之前的一篇文章中,有评论指出

 select ?x  ?y where {
      {?x rdf:type ex:someType}        
      {?x ex:someProperty ?y}
    }
类似于(不完全相同):

使用相同的三重模式。但是,第一个查询包含两个BGP(每个都在一个组模式中),而第二个查询包含一个BGP(没有组模式)。 第一个查询的代数是两个
BGP
之间的
JOIN
,而第二个查询的代数只是
BGP

第一查询代数(ApacheJena)

(项目(?x?y)
(加入
(bgp(三重x))
(bgp(三重x?y)))
第二个查询代数(ApacheJena):

(项目(?x?y)
(bgp
(三倍x)
(三倍x?y)
))
在最初的问题中,答案表明它们不完全相同,并进行了论证

  • 如果支持SPARQL蕴涵,那么将分别对独立的{}进行蕴涵计算
  • 如果在查询中使用标签bnodes,则限制会跨越{}
  • 如果添加筛选器,则它们不会在写入它们的{}之外应用
  • 这是一个不同的抽象语法树。所有次要问题,但可能会在以后发挥作用

  • 现在我们把空白节点(2)和不同的语法树放在一起(4),并问如下:<强>这两个查询在任何情况下都会因过滤器(3)或蕴涵(1)< /强>而产生不同的结果吗?我看不出有任何可能性。好的,那些有不同意见的人,请你,用一些例子来说明吗?

    过滤器的范围受到影响

    在:

    筛选器始终为false,因为
    ?y
    未绑定,因此表达式为error,而筛选器为false,而不管
    ?x ex:someProperty?y


    (3) 和(4)是相关的。

    1。关于过滤器,让我们假设一个不会导致错误或未绑定变量的情况。。。两个查询结果(带组和不带组)之间会有什么区别吗。你能举一个例子,说明蕴涵对这两种情况之间的解决方案有何影响?我知道蕴涵适用于单个BGP,但我不确定它将如何产生不同的解决方案,并冲击我的头脑,但仍然无法想出一个例子…另一个区别是可变范围。如果目标变量以前使用过,通常不能使用BIND。但如果另一个用途在组外,则可以在组内使用它。
    select ?x  ?y where {
      ?x rdf:type ex:someType.
      ?x ex:someProperty ?y.
    }
    
    (project (?x ?y)
      (join
        (bgp (triple ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.example.com/someType>))
        (bgp (triple ?x <http://www.example.com/someProperty> ?y))))
    
    (project (?x ?y)
      (bgp
        (triple ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.example.com/someType>)
        (triple ?x <http://www.example.com/someProperty> ?y)
      ))
    
       select ?x  ?y where {
            {?x rdf:type ex:someType FILTER (?y > 0 ) }        
            {?x ex:someProperty ?y}
       }