如何提高SDB的SPARQL查询性能?

时间:2011-09-19 07:36:07

标签: performance sparql jena

在我的应用程序中,我使用的是SPARQL数据库是Jena的SDB,而数据库服务器是DB2。但我发现SPARQL的查询性能非常低。

谁能帮我解决这个问题?如何提高sparql查询性能,特别是SDB的查询性能?

以下是我的测试用例数据和SPARQL:

测试用例

总rdf三重计数为13294.查询结果三重计数为420。 查询花了42秒。

SPARQL

SELECT DISTINCT ?s ?name ?ownerId ?status ?time 
  ?value ?startTime ?endTime ?description 
WHERE 
{
  ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> "http://www.w3c.com/schemas/cp#Event" .
  ?s <http://www.w3c.com/schemas/cp#time> ?time .
  ?s <http://www.w3c.com/schemas/cp#ownerId> ?ownerId .
  ?s <http://www.w3c.com/schemas/cp#name>  ?name .
  ?s <http://www.w3c.com/schemas/cp#value> ?value .
  ?s <http://www.w3c.com/schemas/cp#_status> ?status .
  ?s <http://www.w3c.com/schemas/cp#start_Time> ?startTime .
  ?s <http://www.w3c.com/schemas/cp#end_Time> ?endTime .
  ?s <http://www.w3c.com/schemas/cp#description> ?description .
  FILTER(xsd:dateTime(?time) >= "2011-08-12T00:00:00"^^xsd:dateTime  
    && xsd:dateTime(?time) <= "2011-09-18T23:59:59"^^xsd:dateTime) 
}

1 个答案:

答案 0 :(得分:3)

任何Triplestore(如SDB)的查询性能总是比本机三元组更差,因为像SDB这样的SQL支持的三元组必须将SPARQL下编译为SQL,这通常会产生极其复杂的SQL查询。

所以以你的例子为例,你要求匹配9个三重模式,这将产生一个包含9个INNER JOIN操作的SQL SELECT,这将花费大量时间开始。

然后你将FILTER应用于这些三重模式,你遇到的问题是,除非过滤表达式非常简单或足够接近SQL才能转换为它,FILTER具有在内存中的Java代码中进行评估。这在实践中意味着您正在选择我们在triplestore中的所有可能事件,然后使用Java过滤内存中的日期范围,这总是会使您的查询变慢。

除非您有特殊原因想要使用SDB,否则我真的建议您查看Jena的原生三重店TDB。它旨在更有效地执行SPARQL查询所需的连接类型,并且它存储数据的方式允许它以更快的速度执行更复杂的过滤器,例如日期范围。