java - 如何在芝麻2.7.7中更快速地添加100万个三元组

标签 java rdf sparql sesame

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

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++;
}

版本 我已经对 In MemoryNative Store Sesame 存储库进行了实验,同步值等于 0

最佳答案

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

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

要更改此设置,请启动事务(使用 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 .

顺便说一句:由于您正在通过 HTTP 进行工作,因此存在这样的风险:如果您的事务变得太大,它将开始消耗客户端中的大量内存。如果这种情况开始发生,您可能需要将更新分解为多个事务。但我认为,通过包含一百万个三元组的更新,您应该仍然没问题。

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

相关文章:

sparql - 在 SPARQL 中使用数字值作为字符串值

Java:使用符合我的接口(interface)的外部类

rdf - 从dbpedia查询城市和国家

javascript - 从 javascript 进行插入查询时,Jena Fuseki 不工作。无更新参数错误

rdf - 多语言 OpenCalais 之类的系统?

sparql - geoSPARQL 距离产生空结果

relationship - SPARQL 可以描述一个不存在某种关系的对象吗?

不同类字段的 JavaFX TreeItem css 样式

java - NLP中的数据字典是什么?

java - 连接异常 : Connection refused: connect