我必须使用远程端点和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)
是一个糟糕的主意,因为它会使端点在过滤之前浏览所有实例.
任何关于如何实现该请求分组的提示都将不胜感激.
假设您的端点支持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引擎.