Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一次使用QueryExecutionFactory执行多个Sparql查询_Java_Performance_Sparql_Jena_Dbpedia - Fatal编程技术网

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

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

我必须一次执行大约2000个sparql查询。我目前正在一次执行一个查询。每一个大约需要0.3秒。所以,要执行所有查询,我们需要大约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语句,那么我就可以减少所花费的时间。我有什么办法可以做吗


或者任何可能减少时间的解决方案对我来说都是救命稻草

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

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线程中处理所有查询。效果很好。谢谢