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

时间:2013-05-07 15:11:52

标签: sparql

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

我的查询非常简单:

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT * WHERE
{
  <my_id> skos:prefLabel ?prefLabel
}

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

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'))
}

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

非常感谢任何关于如何实现该请求分组的提示。

1 个答案:

答案 0 :(得分: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
}

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

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