4

トランザクションを利用するために現在のコードを書き直したいと思います。ただし、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に投稿しましたが、回答がありません。ここの誰かが私を助けてくれることを願っています。

4

1 に答える 1

1

入れ子になったトランザクションが TDB でサポートされていないのは事実ですが、WRITE トランザクションで必要な数の読み取りを実行できます。したがって、ReadWrite.WRITE トランザクションを開始し、そこですべての処理を行います。やりたいことのためにネストされたトランザクションは必要ありません。

TDB のトランザクション サポートの詳細については、こちらの公式ドキュメントを参照してください。

于 2012-04-17T07:26:25.620 に答える