首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在联邦查询中正确使用值

在联邦查询中正确使用值
EN

Stack Overflow用户
提问于 2018-11-26 14:07:15
回答 1查看 271关注 0票数 1

注意:可能的GrapbDB错误(见注释)

我在GraphDB中有一个知识库:

代码语言:javascript
复制
PREFIX : <http://my_awesome_cats_collection#>
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX owl: <http://www.w3.org/2002/07/owl#>


:foo a :cat ;
     :name 'Marble' ;
     owl:sameAs wd:Q27745011 .
# and many other cats

我尝试过这个联邦查询

代码语言:javascript
复制
select * where { 
    # remote service
    SERVICE <https://query.wikidata.org/sparql> {
        ?cat wdt:P463 ?membership
    }

    ?cat :name ?name .
    VALUES ?name {'Marble'}

} 

我从维基数据(也就是武藏的大理石成员)那里得到了预期的结果。

如果我像这样改变模式的顺序:

代码语言:javascript
复制
select * where { 

    ?cat :name ?name .
    VALUES ?name {'Marble'}

    # remote service
    SERVICE <https://query.wikidata.org/sparql> {
        ?cat wdt:P463 ?membership
    }
} 

我得到了许多假阳性结果(也就是属于武藏的其他猫的数据,而我想得到的只是大理石。)本地模式和远程模式之间的一种交叉产品,我猜)。

官方医生 of SPARQL 1.1中,他们说:

联合查询可以使用VALUES子句来约束从远程端点接收的结果,该结果基于计算查询其他部分的解决方案绑定。 (节选是信息丰富的。感谢@TallTed指出这一点)

因此,当联邦化时,VALUES只能用作最终的筛选器吗?怎么一回事?

编辑:

  • 查询是用GraphDB执行的
  • 它似乎是GraphDB查询优化器的一个bug (感谢: Stanislav )
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-26 19:50:50

您发布的示例演示了SPARQL规范的一个角落案例,它结合了多个相关主题,在我看来非常模糊。下面的详细信息解释了在GraphDB引擎中所做的假设和设计决策。请注意,这可能与其他实现阅读以下规范行的方式不同:

服务与价值观的相互作用

SPARQL联合会1.1有一个非规范的部分,描述在这种情况下应该是什么行为:

SPARQ1.1.1联邦查询的实现者可以使用VALUES子句来约束从远程端点接收的结果,该结果基于来自于评估查询的其他部分的解决方案绑定。

GraphDB的查询优化器无法从远程SPARQL端点检索任何统计信息,因此它采用了将查询天真地抛到远程服务并在本地连接结果的方法。因此,查询优化任务掌握在知道两个存储库中的模式的用户手中,方法是以一种过程的方式重新安排查询(参见下面)。

联邦查询是子查询

每个远程查询都被视为子查询,并以其本身的方式发送到外部端点。以下是等价的语法:

代码语言:javascript
复制
# remote service
SERVICE <https://query.wikidata.org/sparql> {
    SELECT ?cat ?membership {
        ?cat wdt:P463 ?membership
    }
    LIMIT <put any limit>
}

首先对子查询进行评估,所有变量都由自下而上的传播。

根据SPARQL规范,不应从外部在子查询中推送变量绑定:

子查询是将SPARQL查询嵌入到其他查询中的一种方法,通常是为了实现否则无法实现的结果,例如限制查询中某些子表达式的结果数量。 由于SPARQL查询计算的自下而上性质,首先对子查询进行逻辑计算,并将结果投影到外部查询。 请注意,只有从子查询中投射出来的变量才会在外部查询中可见或在作用域上可见。

此时,不再可能使用非常有选择的本地子句有效地执行查询。这就是为什么GraphDB数据库公开一个特殊的配置参数以打破对SPARQL规范的遵从性的原因:

./graphdb -Dreuse.vars.in.subselects

在这种情况下,查询引擎将忽略SPARQL规范,并将变量从子select内部的外部查询推送出去。启用此参数后,查询的正确版本是:

代码语言:javascript
复制
PREFIX : <http://my_awesome_cats_collection#>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>

select * where {
    
    ?cat :name ?name .
    VALUES ?name {
        'Marble'
    }
    
    # remote service
    SERVICE <https://query.wikidata.org/sparql> {
        ?cat wdt:P463 ?membership
    }
}

如何优化远程端点的查询执行计划

值/绑定是程序性的,根据SPARQL规范,它们的位置非常重要。

绑定表单允许从基本图形模式或属性路径表达式将值分配给变量。绑定的使用结束了前面的基本图形模式。BIND子句引入的变量必须没有在组图模式中使用,直到在BIND中使用为止。

在这种情况下,另一种形式的查询效率要低得多,那就是首先执行远程端点查询(即从Wikidata下载所有结果),然后将它们与本地较小的数据集连接起来:

代码语言:javascript
复制
PREFIX : <http://my_awesome_cats_collection#>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>

select * where {
    
    # remote service
    SERVICE <https://query.wikidata.org/sparql> {
        ?cat wdt:P463 ?membership
    }

    ?cat :name ?name .
    VALUES ?name {
        'Marble'
    }
}

我希望这给您提供了关于SPARQL规范的GraphDB解释的全部情况,以及如何优化联邦查询的所有可能性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53482869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档