我注意到使用RepositoryConnection方法add
的实例化比通过使用SPARQL查询修改模型实例化时更慢。尽管存在差异,但即使是SPARQL更新方法也需要很长时间才能实例化(3.4分钟到10,000个三元组)。多个insert
s(每个三元组一个查询)或一个大insert
查询的执行不会改变方法的性能。它仍然很慢。是否有另一种适合添加100万个三元组的方法,或者是否有任何可以提供帮助的特殊配置?
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++
}
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 Memory
和Native Store
芝麻存储库的实验,同步值等于0
答案 0 :(得分:3)
(我只是注意到你添加了所请求的附加信息,因此这个相当晚的回复)
问题是,正如我所怀疑的那样,您没有使用事务来批量更新操作。实际上,您执行的每个添加操作都将成为单个事务(默认情况下,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更新的代码。有关如何使用事务的更多信息,请查看芝麻手册,尤其是the chapter about using the Repository API。
顺便说一句:由于您正在使用HTTTP,因此如果您的交易变得太大,它将开始在您的客户端消耗大量内存。如果这种情况开始发生,您可能希望将更新分解为多个事务。但是,如果更新包含一百万个三元组,我认为你应该还可以。