繁体   English   中英

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

[英]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的本机三重存储TDBTDB2 它旨在更有效地执行SPARQL查询所需的联接类型,并且它存储数据的方式使它可以更快地执行更复杂的过滤器(如日期范围)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM