2

Apache Jena TDB に問題があります。基本的に、新しいデータセットを作成し、RDF/XML ファイルから「http://example.com/model/filename」という名前の名前付きモデルにデータをロードします。ファイル名は XML/RDF ファイルの名前です。データをロードした後、名前付きモデルのすべてのステートメントがデフォルト モデルに挿入されます。名前付きモデルは、バックアップのためにデータセットに保持されます。

データセット内の名前付きモデルをクエリしようとすると、TDB がフリーズし、アプリケーションが無限ループで実行されているように見えるため、アプリケーションは終了せず、例外もスローしません。

そのフリーズの原因は何ですか?どうすればそれを防ぐことができますか?

コード例:

Dataset ds = TDBFactory.createDataset("tdb");
Model mod = ds.getDefaultModel();

File f = new File("example.rdf");
FileInputStream fis = new FileInputStream(f);

ds.begin(ReadWrite.WRITE);

// Get a new named model to load the data into
Model nm = ds.getNamedModel("http://example.com/model/example.rdf");
nm.read(fis, null);

// Do some queries on the Model using the utility methods of Model, no SPARQL used

// Add all statements from the named model to the default model
mod.add(nm);

ds.commit();
ds.end();

// So far everything works as expected, but the following line causes the freeze
Iterator<String> it = ds.listNames();

既存の名前付きモデルにアクセスするメソッド呼び出しは、同じフリーズ反応を引き起こしgetNamedModel("http://example.com/model/example.rdf");ます。たとえば、これは同じです。呼び出しによる新しい名前付きモデルの追加getNamedModel("http://example.com/model/example123.rdf");は正常に機能するため、既存のモデルへのアクセスのみが中断されます。

使用環境:Linux 64bit、Oracle Java 1.7.0_09、Jena 2.7.4(TDB 0.9.4含む)

助けてくれてありがとう!

編集:コードフラグメントの誤りを修正

Edit2: 解決策 (AndyS の回答に対する私の最後のコメント)

OK、プログラム全体を調べて、不足しているすべてのトランザクションを追加しました。期待どおりに機能していません。プログラムのシャットダウン シーケンス中に Jena が例外をスローしたと思われますが、その例外は適切に報告されておらず、「フリーズ」は他のスレッドが正しく終了していないことが原因でした。誤ったトランザクションの使用法を指摘していただきありがとうございます。

4

1 に答える 1

1

これをテスト ケースにして jena users メーリング リストに送信していただけますか?

トランザクション内でデフォルト モデルを取得する必要があります。外部で取得しました。

また、データセットをトランザクションで使用した場合、 のように非トランザクションで使用することはできませんds.listNames。フリーズするべきではありません - 何らかの警告が表示されるはずです。

于 2012-12-22T18:17:58.030 に答える