我必须一次执行大约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语句,那么我可以减少花费的时间。有什么办法吗?
对我来说,减少时间的任何可能的解决方案都可以挽救生命。
答案 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);
它大大减少了时间。