我注意到,使用RepositoryConnection方法add的实例化比通过使用SPARQL查询修改模型实例化的实例要慢。尽管存在差异,但即使是SPARQL更新方法也需要花费很长时间进行实例化(3.4分钟到10,000个三元组)。执行多个insert(每个三元组一个查询)或一个大的insert查询不会改变方法的性能。它仍然很慢。是否有另一种方法适合添加一百万个三元组,或者有任何特殊的配置可以帮助您?

RepositoryConnection的代码

Repository myRepository = new HTTPRepository(serverURL, repositoryId);
myRepository.initialize();
RepositoryConnection con = myRepository.getConnection();
ValueFactory f = myRepository.getValueFactory();

i = 0;
j = 1000000;

while(i < j)(
    URI event    = f.createURI(ontologyIRI + "event"+i);
    URI hasTimeStamp    = f.createURI(ontologyIRI + "hasTimeStamp");
    Literal timestamp   = f.createLiteral(fields.get(0));
    con.add(event, hasTimeStamp, timestamp);
    i++
}


SPARQL的代码

Repository myRepository = new HTTPRepository(serverURL, repositoryId);
myRepository.initialize();
RepositoryConnection con = myRepository.getConnection();

i = 0;
j = 1000000;

while(i < j)(
    query = "INSERT {";
    query += "st:event"+i+" st:hasTimeStamp     '"+fields.get(0)+"'^^<http://www.w3.org/2001/XMLSchema#float> .\n"
    + "}"
      + "WHERE { ?x ?y ?z }";
    Update update = con.prepareUpdate(QueryLanguage.SPARQL, query);
    update.execute();

    i++;
}



我已经用同步值等于0的In MemoryNative Store芝麻存储库进行了实验

最佳答案

(我只是注意到您添加了所请求的其他信息,因此此回复很晚)

正如我所怀疑的那样,问题在于您没有使用事务来将更新操作分批处理。实际上,您执行的每个添加操作都会变成一个事务(默认情况下,芝麻存储库连接以自动提交模式运行),这是缓慢且效率低下的。

要更改此设置,请启动事务(使用RepositoryConnection.begin()),然后添加数据,最后调用RepositoryConnection.commit()完成事务。

这是修改第一个代码示例的方法:

Repository myRepository = new HTTPRepository(serverURL, repositoryId);
myRepository.initialize();
RepositoryConnection con = myRepository.getConnection();
ValueFactory f = myRepository.getValueFactory();

i = 0;
j = 1000000;

try {
  con.begin(); // start the transaction
  while(i < j) {
      URI event    = f.createURI(ontologyIRI + "event"+i);
      URI hasTimeStamp    = f.createURI(ontologyIRI + "hasTimeStamp");
      Literal timestamp   = f.createLiteral(fields.get(0));
      con.add(event, hasTimeStamp, timestamp);
      i++;
  }
  con.commit(); // finish the transaction: commit all our adds in one go.
}
finally {
  // always close the connection when you're done with it.
  con.close();
}


使用SPARQL更新的代码也是如此。有关如何处理事务的更多信息,请参阅Sesame手册,尤其是the chapter about using the Repository API

顺便说一句:由于您使用的是HTTTP,因此如果您的交易量太大,就有可能开始消耗客户端大量的内存。如果开始发生这种情况,您可能需要将更新分成几个事务。但是,我认为,通过包含一百万个三元组的更新,您应该还可以。

关于java - 如何更快地添加芝麻2.7.7中的100万个三元组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19783537/

10-11 13:11