推論する RDF データが大量にあり、独自の推論ルールを開発する必要があります。私の質問は、これを行う方法があるかどうかということです? Jena ルールと SPARQL を使用しても問題ありませんか? Jena ルールと sparql クエリはすべてのデータをメモリにロードする必要がありますか? すぐに回答を得たいと思っています。事前に感謝します!
2 に答える
Jena推論エンジンは、すべてのデータがメモリにロードされている場合に確実に最適に機能します。これは、TDBModel
などの永続ストアを含む任意のJenaに推論エンジンを接続することは可能ですが、推論アルゴリズムはモデル内の特定のトリプルの有無を確認するために多くの呼び出しを行うためです。そのチェックでディスクをヒットする必要がある場合、これは非効率になります。
比較的単純な推論要件がある場合は、慎重に構築されたSPARQLクエリを介して含意を表現できる可能性があります。その場合、TDBまたはSDBストアに直接クエリを実行する必要はありません。クエリの複雑さに依存します。
トリプルストアのコンテンツが適度に安定している場合、または安定した永続的なセットと動的なメモリ内セットに分割できる場合、戦略は推論クロージャを事前に計算し、それを永続的なストアに保存することです。言い換えれば、古典的な空間と時間のトレードオフです。これを行うには2つの方法があります。1つは、可能な限り多くのヒープスペースを使用するメモリ内ストアで推論エンジンを使用することです。次に、JenaのRIOT推論コマンドラインスクリプトを使用します。
大規模なRDF推論の場合、オープンソースのJenaプラットフォームの代わりに、Clark&Parsiaの商用製品Stardogがあります(これにはJenaモデルのコネクターがあると思いますが、私自身は使用していません)。
Ianが言ったことに加えて、あなたのルールに応じて、推論されたすべてのトリプルをストリーミング方式で具体化することが可能である場合は、RIOTの推論ソースコードを見て、RDFS以上のものが必要な場合は、サポートを追加する方法を考えてくださいOWLのサブセット用。ソースコードは次の場所にあります。
- https://svn.apache.org/repos/asf/jena/trunk/jena-arq/src/main/java/riotcmd/infer.java
- https://svn.apache.org/repos/asf/jena/trunk/jena-arq/src/main/java/org/openjena/riot/pipeline/inf/InferenceSetupRDFS.java
- https://svn.apache.org/repos/asf/jena/trunk/jena-arq/src/main/java/org/openjena/riot/pipeline/inf/InferenceProcessorRDFS.java
RIOT の infer コマンドのアプローチは、MapReduce でも使用できます。例は次のとおりです。