繁体   English   中英

Jena ARQ / TDB查询优化

[英]Jena ARQ/TDB Query Optimization

我有一个相当小的图表,包含大约500k三元组。 我还生成了stats.opt文件并在一台相当快的计算机上运行我的代码(四核,16gb ram,ssd驱动器。)但是对于我在OP接口的帮助下构建的查询,它需要永远迭代结果集。 结果集大约有15000行,迭代需要4s,这对最终用户来说是不可接受的。 执行查询只需要90ms(我想真正的工作是通过游标迭代完成的吗?)。 为什么这么慢,我该怎么做才能加速结果集迭代?

这是查询:

SELECT  ?apartment ?price ?hasBalcony ?lat ?long ?label ?hasImage ?park ?supermarket ?rooms ?area ?street
WHERE
  { ?apartment dssd:hasBalcony ?hasBalcony .
    ?apartment wgs84:lat ?lat .
    ?apartment wgs84:long ?long .
    ?apartment rdfs:label ?label .
    ?apartment dssd:hasImage ?hasImage .
    ?apartment dssd:hasNearby ?hasNearbyPark .
    ?hasNearbyPark dssd:hasNearbyPark ?park .
    ?apartment dssd:hasNearby ?hasNearbySupermarket .
    ?hasNearbySupermarket dssd:hasNearbySupermarket ?supermarket .
    ?apartment dssd:price ?price .
    ?apartment dssd:rooms ?rooms .
    ?apartment dssd:area ?area .
    ?apartment vcard:hasAddress ?address .
    ?address vcard:streetAddress ?street
    FILTER ( ?hasBalcony = true )
    FILTER ( ?price <= 1000.0e0 )
    FILTER ( ?price >= 650.0e0 )
    FILTER ( ?rooms <= 4.0e0 )
    FILTER ( ?rooms >= 3.0e0 )
    FILTER ( ?area <= 100.0e0 )
    FILTER ( ?area >= 60.0e0 )
  }    

(有没有更好的方法来查询这些bnodes:?hasNearbyPark,?hasNearbySupermarket)

以及执行查询的代码:

dataset.begin(ReadWrite.READ);
Model model = dataset.getNamedModel("http://example.com");
QueryExecution queryExecution = QueryExecutionFactory.create(buildQuery(), model);
ResultSet resultSet = queryExecution.execSelect();
while ( resultSet.hasNext() ) {
    QuerySolution solution = resultSet.next(); ...

在ARQ查询引擎上

首先,你似乎误解了ARQ引擎的工作原理:

ResultSet resultSet = queryExecution.execSelect();

以上所做的就是为引擎如何评估查询准备一个查询计划,它实际上并没有评估查询,因此它几乎是瞬时的。

在您开始调用hasNext()next()之前,不会发生回答问题的实际工作:

while ( resultSet.hasNext() ) {
   QuerySolution solution = resultSet.next(); ...

因此,您引用的时间不正确,查询需要4秒来评估,因为这是迭代所有结果所需的时间。

在你的实际问题上

你没有展示你的buildQuery()方法做了什么,但你说你是以编程方式而不是字符串形式构建一个Op结构? 如果是这种情况,那么查询引擎可能实际上并没有应用优化,虽然我不认为这将是问题。 您可以尝试添加op = Algebra.optimize(op); 在你返回内置Op ,我不知道这会有很大的不同。

看起来优化器应该在给出原始查询的情况下做得很好(并不是说您的查询除了连接重新排序之外还有很多优化空间)但是如果您以编程方式构建它,那么您可能正在构建一个优化器正在努力解决的不寻常代数。

类似地,我不确定您stats.opt会尊重stats.opt文件,因为您查询特定模型而不是TDB数据集,因此查询引擎可能是通用目的而不是TDB引擎。 我不是TDB的专家所以我不知道是不是这种情况。

底线

一般情况下,您的问题中没有足够的信息来诊断您的设置中是否存在实际问题,或者您的查询是否非常昂贵。 将此作为最小测试用例(最小完整代码加样本数据)报告给user@jena.apache.org列表以进行进一步分析将非常有用。

作为对您的查询的一般评论,许多范围过滤器的执行成本很高,这在大多数情况下可能会发生。

暂无
暂无

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

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