在上一个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)
))
在最初的问题中,答案表明它们并不相同并且会争论
- 如果支持SPARQL包含,则分别评估单独的{}包含的内容。
- 如果您在查询中使用标签bnodes,则限制将跨越{}
- 如果您添加FILTERS,则它们不适用于所写的{}。
- 具有不同的抽象语法树。所有次要点,但稍后可能会起作用。
现在让我们将空白节点(2)和不同的语法树放在一边(4),并询问以下内容:在任何情况下,这两个查询是否会由于过滤器(3)或包含而产生不同的结果? (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)相关。