在我的应用程序中,我使用的是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)
}
答案 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查询所需的连接类型,并且它存储数据的方式允许它以更快的速度执行更复杂的过滤器,例如日期范围。