[英]How to improve the SPARQL query performance of SDB?
在我的应用程序中,我使用的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)
}
像SDB这样的任何Triplestore的查询性能总是会比本机Triplestore差,因为像SDB这样的SQL支持的Triplestore必须将SPARQL向下编译为SQL,这通常会创建极其复杂的SQL查询。
因此,以您的示例为例,您要求匹配9个三元模式,这将生成一个包含9个INNER JOIN
操作的SQL SELECT,这将花费很多时间。
然后,您将FILTER
应用于这些三重模式,那么您的问题是,除非过滤器表达式非常简单或足够接近SQL才能转换为SQL,否则必须使用内存中的Java代码来评估FILTER
。 实际上,这意味着您要在三元组中选择所有可能的事件,然后使用Java筛选内存中的日期范围,这总是会使查询变慢。
除非有特定原因要使用SDB,否则我真的建议您查看Jena的本机三重存储TDB或TDB2 。 它旨在更有效地执行SPARQL查询所需的联接类型,并且它存储数据的方式使它可以更快地执行更复杂的过滤器(如日期范围)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.