gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:29:02 27 4
gpt4 key购买 nike

我注意到使用 RepositoryConnection 方法 add 的实例化比使用 SPARQL 查询修改模型进行实例化要慢。尽管存在差异,但即使是 SPARQL 更新方法也需要很长时间来实例化(3.4 分钟到 10,000 个三元组)。执行多个 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 同步值等于 0 的 Sesame 存储库进行了实验

最佳答案

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

正如我所怀疑的那样,问题是您没有使用事务将更新操作一起批处理。实际上,您执行的每个添加操作都变成了一个事务(默认情况下,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 .

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com