5

プログラムで変更している Jena オントロジー モデル ( OntModel ) があります。このモデルは、デフォルトの ModelFactory メソッドを使用して最初に作成され、オントロジー モデル (パラメーターなし) を作成しました。問題は、プログラムが実行され、モデルが変更されたときに、デフォルトの Jena Reasoner が実行される (実行して実行して実行する) ことでした。このプロセスは私が必要としているものに対して完全に遅すぎて、大規模なデータ セットではメモリが不足していました。

プログラムを変更して、別のオントロジー モデル ファクトリ メソッドを使用して、推論機能のないモデルを作成しました。これは非常に高速に実行され、以前に見たメモリの問題はまったく発生しませんでした (非常に大きなデータ セットの場合でも)。このアプローチの問題は、直接クラス型を直接使用することによってのみデータにアクセスできることです (親クラスを使用してオブジェクトにアクセスすることはできません)。

たとえば、「花」と「種」という 2 つのクラス リソースがあるとします。これらは、共通の親である「植物材料」から継承します。私のプログラムはすべての「種」を取り、「種」オブジェクトを「花」オブジェクトに変換する「grow」というメソッドを実行します。Reasoner (マイクロ Reasoner でさえも) を使用すると、「grow」メソッドの実行が遅すぎてメモリ不足になります。Reasoner をオフにすると、「植物材料」クラスを使用してすべての「花」と「種」にアクセスできなくなります。

これを行うための好ましい方法(幸せな媒体)はありますか...スーパークラスを使用してオブジェクトにアクセスできるようにすると同時に、高速でメモリを浪費しないようにすることはできますか?

「成長」メソッドを実行している間は「推論をオフ」にして、メソッドが完了したら元に戻す方法を探していました。これはどういうわけか可能ですか?

4

1 に答える 1

5

私はいくつかの助けと提案を得て、これが私がこの問題を解決した方法です。

基本的に、Reasoner を使用せずに別のモデルにアクセスし、すべての変更を基本モデルにバッチ処理してから、完全なモデルを Reasoner で再バインドして更新を取得しました。

ここにいくつかの疑似コードがあります。私の「実際の」シナリオと完全に一致するわけではありませんが、アイデアはわかります。

// Create a model with a reasoner and load the full model from owl files or
// whatever
OntModel fullModel = ModelFactory.createOntologyModel();
fullModel.read(...);

// create a model without a reasoner and load it from the full model with
// reified statements
OntModel basicModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
basicModel.add(fullModel);

// batch modifications to the basic model programatically
//(**** RUNS REALLY QUICK *****)

// rebind the full model
fullModel.rebind();

// continue on....
于 2009-03-18T20:34:25.747 に答える