使用QueryExecutionFactory一次执行多个Sparql查询

时间:2018-07-30 08:00:44

标签: java performance sparql jena dbpedia

我必须一次执行大约2000个sparql查询。我目前一次执行一次查询。每个耗时约0.3s。因此,要执行所有查询,大约需要600秒钟。这是我用于查询执行的代码

QueryExecution qExec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query.asQuery());
//query is a ParameterizedSparqlString which returns Query object
ResultSet resultSet = qExec.execSelect();

上面的代码在循环内。循环运行2000次,代码执行2000次。

因此,我想减少运行2000个查询所花费的时间

我在想,是否可以像批量插入一样一次执行多个查询来执行多个sql语句,那么我可以减少花费的时间。有什么办法吗?

对我来说,减少时间的任何可能的解决方案都可以挽救生命。

1 个答案:

答案 0 :(得分:0)

我找到了一个对我有用的解决方案。 首先,我创建了一个可调用类

public class SparqlQueryCallable implements Callable<Model> {
    public static final String DBPEDIA_REPO = "http://dbpedia.org/sparql";
    private ParameterizedSparqlString query = new ParameterizedSparqlString();
    @Override
    public Model call() throws Exception {
        QueryExecution qExec = QueryExecutionFactory.sparqlService(DBPEDIA_REPO, this.query.asQuery());
        Model tempConstruct = qExec.execConstruct();
        return tempConstruct;
    }
}

然后在循环中创建了所有可调用对象

List<SparqlQueryCallable> callable_list = new ArrayList<SparqlQueryCallable>();
for(ParameterizedSparqlString param_string: param_strings) {
    callable_list.add(new SparqlQueryCallable(param_string));
}

最终执行

List<Future<Model>> futures = executorService.invokeAll(callable_list);

它大大减少了时间。

相关问题