【问题标题】:SPARQL: Dividing a BGP into multiple GroupsSPARQL:将 BGP 划分为多个组
【发布时间】:2019-05-13 04:29:45
【问题描述】:

在之前的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(无组模式)。 第一个查询的代数是两个BGPs 之间的JOIN,而第二个查询的代数只是一个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. 如果您在查询中使用标签 bnode,则存在跨界限制{}
  3. 如果您添加 FILTERS,则它们不适用于写入它们的 {} 之外。
  4. 它是一个不同的抽象语法树。所有次要问题,但可能会在以后发挥作用。

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

【问题讨论】:

  • 另一个区别是变量范围。如果以前使用过目标变量,通常不能使用 BIND。但是,如果其他用途在该组之外,您可以在该组内使用它。

标签: sparql


【解决方案1】:

FILTER 的范围受到影响。

在:

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

FILTER 始终为 false,因为 ?y 未绑定,因此表达式是错误的,并且无论 ?x ex:someProperty ?y 如何,FILTER 都是 false。

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

【讨论】:

  • 1.关于过滤器,让我们假设一个不会导致错误或未绑定变量的情况......这两个查询结果(有和没有组)之间会有什么区别吗?
  • 2.您能否举一个例子,其中蕴涵会影响两种情况之间的解决方案?我知道蕴涵适用于单个 BGP,但我不确定它会如何导致不同的解决方案,并且在我脑海中闪过,但仍然想不出一个例子......
猜你喜欢
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 2017-01-21
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
相关资源
最近更新 更多