SPARQL:将BGP分为多个组

时间:2019-05-12 19:43:28

标签: sparql

在上一个question中,有一条注释表明

 select ?x  ?y where {
      {?x rdf:type ex:someType}        
      {?x ex:someProperty ?y}
    }

类似于(不完全相同):

select ?x  ?y where {
  ?x rdf:type ex:someType.
  ?x ex:someProperty ?y.
}

使用相同的三重图案。但是,第一个查询包含两个BGP(每个以组模式),而第二个查询包含一个BGP(无组模式)。 第一个查询的代数是两个JOIN之间的BGPs,而第二个查询的代数仅为BGP

第一个查询代数(Apache Jena)

(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))))

第二查询代数(Apache Jena):

(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)
  ))

在最初的问题中,答案表明它们并不相同并且会争论

  
      
  1. 如果支持SPARQL包含,则分别评估单独的{}包含的内容。
  2.   
  3. 如果您在查询中使用标签bnodes,则限制将跨越{}
  4.   
  5. 如果您添加FILTERS,则它们不适用于所写的{}。
  6.   
  7. 具有不同的抽象语法树。所有次要点,但稍后可能会起作用。
  8.   

现在让我们将空白节点(2)和不同的语法树放在一边(4),并询问以下内容:在任何情况下,这两个查询是否会由于过滤器(3)或包含而产生不同的结果? (1)?我认为没有任何可能性。好吧,那些有不同意见的人,你可以请举一些例子吗?

1 个答案:

答案 0 :(得分:1)

FILTER的范围受到影响。

在:

   select ?x  ?y where {
        {?x rdf:type ex:someType FILTER (?y > 0 ) }        
        {?x ex:someProperty ?y}
   }

由于?y是未绑定的,所以FILTER始终为假,因此无论?x ex:someProperty ?y是什么,表达式都是错误的并且FILTER为false。

(3)和(4)相关。