0

Hermit OWL推論器を使用してユーザー入力データを推論するアプリケーションを作成しようとしています。さまざまな OWLAPI メソッドを使用して、OWL クラスから Java クラスへのマッピング、およびその他の方法でのマッピングを既に作成しました。

あとは、オントロジーから抽出された多数の OWL 個体を、Java プログラムが関連する Java クラスに自動的に変換できるようにする何らかのマッピングを作成するだけです。

現在、私は次のことを念頭に置いています: OWL クラスの名前のリストをキーとして含み、キーの値として Java クラスの名前を含むハッシュマップ。キーを検索すると、Java リフレクションを使用してクラスをインスタンス化できます。この方法の唯一の欠点は、おそらく非常に遅くなるということですか?

誰かが上記を行うためのより良いアイデアを持っていますか?

前もって感謝します!

トム DC

編集:

Java クラスに変換した OWL クラスの例 (クラスが大きすぎてここに投稿できませんでした): http://pastebin.com/aEsjvDN7

例でわかるように、OWL IRI を見て、どのオブジェクトを選択する必要があるかを決定する関数を作成することで、マッピングを簡単にすることを既に試みました。JAXB または hashmap を使用する場合、この関数はおそらく時代遅れで役に立ちません。

4

2 に答える 2

1

マップ内の一致から開始して特定の Java クラスをインスタンス化する必要がある場合は、リフレクションによって構築されるクラス名ではなく、これらのクラスのビルダーを値として配置します。これにより、柔軟性が向上し、パフォーマンスが向上する可能性があります。

そのようなビルダーの例:

public interface BuilderClass<O, P>{
    O build(P parameter);
}

public class BuilderSpecificClass<SpecificClass, Object>{
    @Override
    public SpecificClass build(Object parameter){
        return new SpecificClass(parameter);
    }
}

次に、マップは次のようになります。

Map<String, BuilderClass<SpecificClass, Object>> map=new HashMap<String, BuilderClass<SpecificClass, Object>>();
map.put("<class_iri>", new BuilderSpecificClass<SpecificClass, Object>());

とはいえ、特定のクラスがどのように機能するかは明確ではないため、より良い方法があるかもしれません。それらをどのように構築したかの例を追加できますか?

トムの追加の詳細の後に編集:

わかりました。あなたのクラスが何をしているのか理解できれば、私が説明したアプローチの半分はすでに実装されています。あなたのクラスは基本的に、表明または推論された OWL アサーション公理のセットをラップしています。つまり、フィールドの値は、オントロジーまたは推論のいずれかから取得され、個人を個人または値と関連付けます。また、オントロジーと推論からクラス インスタンスを設定するメソッドもあります。これらは、私が方法として上で提案したものに対応してbuild()おり、パラメータはオントロジーと推論者になります。OWLOntologyManager のインスタンスはすでにオントロジーを介してアクセスできるため、オントロジー マネージャーを渡すことをスキップできます。ontology.getOWLOntologyManager()

ここで行うことは、説明したのとほとんど同じようにビルダーを作成し、それらにメソッドを呼び出してオブジェクトを設定させることです。

パフォーマンスに関しては、重大なホット スポットがあるかどうかを判断するのは困難です。おそらく、このコードには特に難しいことは何もないはずです。オントロジーは、通常、このような問題が発生する場所です。このクラスで私が提案できることは次のとおりです。

private final String personURI = ThesisOntologyTools.PERSON_URI + "Person";

このようなメンバー変数がいくつかあります。これらは定数だと思うので、インスタンスごとにコピーを作成するのではなく、それらを static final にすることでメモリを節約できます。

OWLDataProperty isLocationConfirmed = dataFactory.getOWLDataProperty(IRI.create(isLocationConfirmedURI));

これと同様の方法で多数のオブジェクトを作成しています。IRI.create()は不変オブジェクトと を返すことに注意してください。そのdataFactory.getOWLDataProperty()ため、そのようなオブジェクトを再利用できるたびにデータ ファクトリにアクセスするのではありません。データ ファクトリによって生成されるすべてのオブジェクトは、特定のオントロジーにリンクされておらず、不変であるため、クラス間で自由に再利用して、作成される新しいオブジェクトの数を減らすことができます。データ ファクトリはそれらの一部をキャッシュする場合がありますが、他の一部は呼び出しごとに最初から再作成される可能性があるため、呼び出しの数を減らすと、速度とメモリ要件が改善されます。

これ以外は、アプローチは問題ないようです。必要なメモリまたは速度が高すぎる (または低すぎる) 場合は、プロファイラーを使用して問題を特定することをお勧めします。ホットスポットが OWL API にある場合は、OWLAPI イシュー トラッカーで問題を提起してください:-) 実際のユーザーから十分なパフォーマンス レポートが得られません。

于 2013-10-13T19:37:26.437 に答える
0

Reflection は強力ですが、代わりにJAXBを使用することを強くお勧めします。これにより、XML スキーマに基づいて Java クラスを派生させることができます。OWL は、その特定のインスタンスにすぎません。

それ以外の場合は、Web を参照してください。そんなことを望んでいるのはあなたが初めてではないように感じます。

于 2013-10-13T00:25:18.490 に答える