如何使用 FILTER (?id IN ( … ) ) 改进慢查询

rch*_*euk 3 performance rdf sparql

我刚开始使用 SPARQL,我正在尝试创建一个查询来检索所有信息,其中 id 具有多个预定义值之一?我有这样的事情:

SELECT *
WHERE {
    ?id ?property ?value .
    ?value a ?type .
    ?type rdfs:label ?type_value .
    FILTER ( ?id IN (<id1>,<idi>,<idn> ) )
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当 id 列表越来越大时,查询变得非常慢。我凭直觉认为有更好的方法来编写此查询,但我无法弄清楚如何创建此类查询。我在思考这样的事情:

SELECT * 
WHERE {
    <id_value> ?property ?value .
    ?value a ?type .
    ?type rdfs:label ?type_value .
}
Run Code Online (Sandbox Code Playgroud)

它仅检索多个 id 的所有值,最后消除了对结果的过滤,但我不知道如何编写查询,以便它返回 id_value 的所有值。当我为另一个 id_value 添加另一行时,它会过滤掉我期望的其他值,所以我认为我写错了。我怎样才能做到这一点?

Jos*_*lor 5

使用values,你可以写:

SELECT * WHERE {
  values ?id { <id1> <idi> <idn> }
  ?id ?property ?value .
  ?value a ?type .
  ?type rdfs:label ?type_value .
}
Run Code Online (Sandbox Code Playgroud)

SPARQL 1.1 说values

数据可以直接写入图形模式或使用 VALUES 添加到查询中。VALUES 提供内联数据作为解决方案序列,这些数据通过连接操作与查询评估结果相结合。应用程序可以使用它来提供对查询结果的特定要求,也可以被 SPARQL 查询引擎实现使用,这些实现通过 SERVICE 关键字提供联合查询以将更受约束的查询发送到远程查询服务。

其中一个示例实际上与您已经获得的非常接近:

PREFIX dc:   <http://purl.org/dc/elements/1.1/> 
PREFIX :     <http://example.org/book/> 
PREFIX ns:   <http://example.org/ns#> 

SELECT ?book ?title ?price
{
   VALUES ?book { :book1 :book3 }
   ?book dc:title ?title ;
         ns:price ?price .
}
Run Code Online (Sandbox Code Playgroud)