Sparql 从RDF4j本机存储中删除三元组似乎相当缓慢

Sparql 从RDF4j本机存储中删除三元组似乎相当缓慢,sparql,rdf4j,Sparql,Rdf4j,我有一个基于RDF4j磁盘的本机存储,大约有900万个三元组。我正在努力提高删除大约4K个三元组的性能,现在大约需要20秒。我试过: 1 Repository rep = new SailRepository(new NativeStore(new File(DATA_DIR + "/db"), "spoc, posc, opsc")); diskRep.initialize(); RepositoryConnection conn = rep.getConnection

我有一个基于RDF4j磁盘的本机存储,大约有900万个三元组。我正在努力提高删除大约4K个三元组的性能,现在大约需要20秒。我试过:

1

    Repository rep = new SailRepository(new NativeStore(new File(DATA_DIR + "/db"), "spoc, posc, opsc"));
    diskRep.initialize();
    RepositoryConnection conn = rep.getConnection();
    conn.remove(statements); // first find statements, then pass them into remove method
2

    // Execute with conn.prepareUpdate(QueryLanguage.SPARQL, query)
    DELETE DATA 
    {
      <#book2> <http://purl.org/dc/elements/1.1/title>   "David Copperfield" ; 
             <http://purl.org/dc/elements/1.1/creator> "Edmund Wells"      .
      // all triples explicitly here
    }
//使用conn.prepareUpdate(QueryLanguage.SPARQL,查询)执行
删除数据
{
“大卫·科波菲尔”;
“埃德蒙·威尔斯”。
//这里所有三元组都是显式的
}
3

    // Execute with conn.prepareUpdate(QueryLanguage.SPARQL, query)
    DELETE { ?person ?property ?value } 
    WHERE 
      { ?person ?property ?value ; <http://xmlns.com/foaf/0.1/givenName> "Fred" }
      // query pattern
//使用conn.prepareUpdate(QueryLanguage.SPARQL,查询)执行
删除{person?property?value}
哪里
{?人?财产?价值;“弗雷德”}
//查询模式

这三种方法都显示了相似的计时。我相信有一种更快的方法可以移除4K三元组。如果你知道我做错了什么,请告诉我。我很乐意提供更多细节。

这原来是由Rdf4j中的一个bug引起的(请参阅)。它已在版本2.5.2中修复

盲目猜测:在第一段代码摘录中,尝试通过添加
conn.begin()来包装remove语句
连接提交()。(这可能没什么帮助,但值得一试。)@cygri是的,很抱歉我忽略了细节。我尝试过这个,甚至设置了隔离级别。无-总是相同的结果。你可以在这里等到@JeenBroekstra,或者直接打开Github票证。至少,我看不出在一个小数据集上进行这些简单的操作可以改变什么。我也找不到本机存储w.r.t.SPARQL更新操作的任何设置。也只有一张与性能问题有某种关联的公开票据,但不是直接的,因为它是用于
CLEAR
操作的:您是否碰巧使用了推断或旋转规则?他们倾向于在RDF4J.FWIW上进行缓慢的删除。我们已经成功地重现了这一点,它看起来像是一个错误,在不久前引入了事务缓冲区处理。我们正在寻找解决办法。看见