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

时间:2013-11-15 15:47:32

标签: performance rdf sparql

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

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

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

SELECT * 
WHERE {
    <id_value> ?property ?value .
    ?value a ?type .
    ?type rdfs:label ?type_value .
}

它仅检索多个id的所有值,最后消除了对结果的过滤,但我无法弄清楚如何编写查询以便返回id_value的所有值。当我为另一个id_value添加另一行时,它会过滤掉我期望的其他值,所以我认为我写得不正确。我怎么能这样做?

2 个答案:

答案 0 :(得分:4)

使用values,您可以写:

SELECT * WHERE {
  values ?id { <id1> <idi> <idn> }
  ?id ?property ?value .
  ?value a ?type .
  ?type rdfs:label ?type_value .
}

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 .
}

答案 1 :(得分:2)

尝试使用VALUES子句,如下所示:

SELECT * 
WHERE {
    VALUES ?id { ...list of ids... }
    ?id ?property ?value .
    ?value a ?type .
    ?type rdfs:label ?type_value .
}

使用FILTER方法可能会更有效率。