我有一个相当小的图,包含大约500k个三元组。我还生成了stats.opt文件,并在一台速度相当快的计算机(四核、16 on内存、固态硬盘)上运行我的代码。但是,对于我在OP接口的帮助下构建的查询,遍历结果集需要花费很长时间。结果集大约有15000行,迭代需要4秒,这对最终用户来说是不可接受的。执行查询只需要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 )
} (有没有更好的方式查询那些bnode:?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(); ...发布于 2013-08-30 03:31:20
在ARQ查询引擎上
首先,您似乎误解了ARQ引擎的工作原理:
ResultSet resultSet = queryExecution.execSelect();上面所做的一切只是为引擎如何评估查询准备了一个查询计划,它实际上并不评估查询,因此它几乎是即时的。
在开始调用hasNext()和next()之前,不会进行实际的回答问题的工作
while ( resultSet.hasNext() ) {
QuerySolution solution = resultSet.next(); ...所以你引用的时间是不正确的,查询需要4秒来计算,因为这是迭代所有结果所需的时间。
关于你的实际问题
您还没有展示buildQuery()方法的作用,但是您说要以编程方式将查询构建为Op结构,而不是字符串?如果是这种情况,那么查询引擎可能实际上并没有应用优化,尽管我不认为这是问题所在。您可以尝试在返回构建的Op之前添加一个op = Algebra.optimize(op);,但我不知道这会有多大不同。
看起来优化器只要给定原始查询就应该做得很好(这并不是说您的查询除了连接重新排序之外还有很多优化空间),但是如果您是通过编程构建它的,那么您可能正在构建一个不寻常的代数,优化器很难处理这个代数。
类似地,我不确定您的stats.opt文件是否会受到欢迎,因为您查询的是特定的模型,而不是TDB数据集,因此查询引擎可能是通用的,而不是TDB引擎。我不是TDB方面的专家,所以我不知道是不是这样。
底线
通常,您的问题中没有足够的信息来诊断您的设置中是否存在实际问题,或者您的查询是否非常昂贵。将此作为最小测试用例(最小完整代码加上样本数据)报告到user@jena.apache.org列表以进行进一步分析将非常有用。
作为对查询的一般注释,执行大量范围过滤器的成本很高,这很可能是大部分时间都用到的地方。
https://stackoverflow.com/questions/18517185
复制相似问题