我必须使用远程端点和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'))
}
是一个糟糕的主意,因为它会使端点在过滤之前浏览所有实例。
非常感谢任何关于如何实现该请求分组的提示。
答案 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引擎。