Java 一次使用QueryExecutionFactory执行多个Sparql查询
我必须一次执行大约2000个sparql查询。我目前正在一次执行一个查询。每一个大约需要0.3秒。所以,要执行所有查询,我们需要大约600秒。这是我用于执行查询的代码Java 一次使用QueryExecutionFactory执行多个Sparql查询,java,performance,sparql,jena,dbpedia,Java,Performance,Sparql,Jena,Dbpedia,我必须一次执行大约2000个sparql查询。我目前正在一次执行一个查询。每一个大约需要0.3秒。所以,要执行所有查询,我们需要大约600秒。这是我用于执行查询的代码 QueryExecution qExec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query.asQuery()); //query is a ParameterizedSparqlString which returns Query o
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语句,那么我就可以减少所花费的时间。我有什么办法可以做吗
或者任何可能减少时间的解决方案对我来说都是救命稻草 我找到了一个对我有用的解决方案。 首先,我创建了一个可调用类
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;
}
}
public类SparqlQueryCallable实现了可调用{
公共静态最终字符串DBPEDIA\u REPO=”http://dbpedia.org/sparql";
private ParameterizedSparqlString查询=新的ParameterizedSparqlString();
@凌驾
公共模型调用()引发异常{
QueryExecution qExec=QueryExecutionFactory.sparqlService(DBPEDIA_REPO,this.query.asQuery());
Model tempConstruct=qExec.execonstruct();
返回时间结构;
}
}
然后在一个循环中,我创建了所有可调用的对象
List<SparqlQueryCallable> callable_list = new ArrayList<SparqlQueryCallable>();
for(ParameterizedSparqlString param_string: param_strings) {
callable_list.add(new SparqlQueryCallable(param_string));
}
List callable_List=new ArrayList();
for(ParameterizedSparqlString参数字符串:参数字符串){
callable_list.add(新的SparqlQueryCallable(param_字符串));
}
最后执行了它
List<Future<Model>> futures = executorService.invokeAll(callable_list);
List futures=executorService.invokeAll(可调用的列表);
它大大缩短了时间。SPARQL中没有批处理的概念。您可以通过普通Java线程并行运行所有查询
ExecutorService
是一个不错的选择。注意,考虑到公共DBpedia服务是共享介质,我敢肯定,如果并行发送太多查询,您可能会遇到麻烦,它可能会暂时阻塞您的IP—这是有道理的,否则,机器人会很容易关闭服务。如果您非常需要DBpedia,请将其加载到本地三重存储中并使用此存储。您可能会受益于您自己的云数据库中的DBpedia镜像(或),您可以通过JDBC和SPASQL(SQL中的SPARQL)进行配置,对SPARQL端点的限制更少,和/或使用比公共实例更强大的实例类型。@AKSW我使用executorservice在java线程中处理所有查询。效果很好。谢谢