4

我必须使用远程端点和 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'))
}

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

任何有关如何实现该请求分组的提示将不胜感激。

4

1 回答 1

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 引擎。

于 2013-05-07T16:26:57.687 回答