在SPARQL中对多个查询进行分组的正确方法

m09*_*m09 4 sparql

我必须使用远程端点和SPARQL检索大量数据.问题是:这非常慢.我想将我的请求分组,以减少网络延迟对全球性能方案的影响.

我的查询非常简单:

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT * WHERE
{
  <my_id> skos:prefLabel ?prefLabel
}
Run Code Online (Sandbox Code Playgroud)

但我不确定如何正确分组.例如,我想:

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT * WHERE
{
  ?id skos:prefLabel ?prefLabel .
  FILTER(?id IN ('my_id1', 'my_id2', 'my_id3'))
}
Run Code Online (Sandbox Code Playgroud)

是一个糟糕的主意,因为它会使端点在过滤之前浏览所有实例.

任何关于如何实现该请求分组的提示都将不胜感激.

Rob*_*obV 6

假设您的端点支持SPARQL 1.1,您可以使用如下VALUES子句:

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT * WHERE
{
  VALUES ( ?id )
  {
    ( <id1> )
    ( <id2> )
    ( <id3> )
    # etc.
  }
  ?id skos:prefLabel ?prefLabel
}
Run Code Online (Sandbox Code Playgroud)

假设您的端点后面的底层SPARQL引擎使用散列连接而不是嵌套循环连接来评估与共享变量的连接(如果没有最新的实现,我会非常惊讶)这应该比等效FILTER (?id IN ( <id1>, <id2>, <id3> ) )形式更高性能

注意 - 一个好的优化器可能会将FILTER (?id IN ( <id1> ))表单转换为类似上面的内容,因此YMMV取决于端点后面的SPARQL引擎.