【问题标题】:Jena TDB: Nested TransactionsJena TDB:嵌套事务
【发布时间】:2012-04-15 19:01:48
【问题描述】:

我想重写我当前的代码以使用事务。但是,根据 Jena 文档 (http://incubator.apache.org/jena/documentation/tdb/tdb_transactions.html),不支持嵌套事务。

假设,我想从数据库中查询一些数据,并为找到的每个资源添加一个 rdfs:label。我是否必须像下面的代码那样严格分离读写代码,还是有更有效的方法来实现这个例子?

Dataset dataset = ...; 
dataset.begin(ReadWrite.READ);

ArrayList<Resource> res = new ArrayList<Resource>();

try{
    QueryExecution qe = QueryExecutionFactory.create("SELECT ?x WHERE { ?x a <Whatever> . }", dataset); 
    ResultSet rs = qe.execSelect();

    try
    {
        while(rs.hasNext())
        {
            QuerySolution s = rs.nextSolution();
            RDFNode node = s.get("x"); 
            if(node.isResource) res.add(node.asResource()); 
        }

    }finally{ qe.close(); }

}finally{ dataset.end(); }

dataset.begin(ReadWrite.WRITE); 
try{
    Property label = model.getProperty("http://www.w3.org/2000/01/rdf-schema#label"); 
    for(Resource r : res)
    {
        r.addProperty(label, "text"); 
    }
    dataset.commit();

}finally{ dataset.end(); }

我已经在semanticweb.com 上发布了这个问题,但还没有收到任何答案,所以我希望这里有人可以帮助我。

【问题讨论】:

    标签: java transactions jena triplestore


    【解决方案1】:

    TDB 确实不支持嵌套事务,但是您可以在 WRITE 事务中执行任意数量的读取。因此,启动一个 ReadWrite.WRITE 事务并在那里进行所有处理。无需嵌套事务即可完成您想做的事情。

    有关 TDB 事务支持的更多信息,请查看此处的官方文档:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多