【发布时间】: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)
))
在原始问题中,答案表明它们不相同并争论
- 如果支持 SPARQL 蕴涵,则单独评估单独的 {} 的蕴涵。
- 如果您在查询中使用标签 bnode,则存在跨界限制{}
- 如果您添加 FILTERS,则它们不适用于写入它们的 {} 之外。
- 它是一个不同的抽象语法树。所有次要问题,但可能会在以后发挥作用。
现在让我们将空白节点 (2) 和不同的语法树 (4) 放在一边,然后问以下问题:在任何情况下,这两个查询是否会因为过滤器 (3) 或蕴涵而产生不同的结果(1)?我不认为有任何可能性。好吧,那些有不同意见的人,可以举个例子吗?
【问题讨论】:
-
另一个区别是变量范围。如果以前使用过目标变量,通常不能使用 BIND。但是,如果其他用途在该组之外,您可以在该组内使用它。
标签: sparql