Jenaの推論機能を使用したいのですが、InfModelを使用しているときにパフォーマンスの問題が発生します。
これが私のオントロジーの簡略化された概要です:
プロパティ:
hasX (Ranges(intersection): X, inverse properties: isXOf)
|-- hasSpecialX (Ranges(intersection): X, inverse properties: isSpecialXOf)
isXOf (Domains(intersection): X, inverse properties: hasX)
|--isSpecialXOf (Domains(intersection): X, inverse properties: hasSpecialX)
さらに、クラス'Object'があります。
Object hasSpecialX some X
明示的に保存されるのは次のデータです。
SomeObject a Object
SomeX a X
SomeObject hasSpecialX SomeX
次のクエリを使用して、インスタンスがどのクラスに属しているかを確認したいと思います。行われた仮定によれば、「SomeObject」のみが返されます。
SELECT ?x WHERE { ?x :hasX :SomeX . }
ds.getDefaultModel()
ただし、データが明示的に保存されていないため、クエリは機能しません。infModel
一方、使用している場合、クエリは終了しません。せいぜい25分待ってから中止しました。(トリプルストアのサイズは約180 MBです)
これは私のコードです:
OntModel ont = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM_MICRO_RULE_INF, null);
ont.read("file:..." , "RDF/XML");
Reasoner reasoner = ReasonerRegistry.getOWLMicroReasoner();
reasoner = reasoner.bindSchema(ont);
Dataset dataset = TDBFactory.createDataset(...);
Model model = dataset.getDefaultModel();
InfModel infModel = ModelFactory.createInfModel(reasoner, model);
QueryExecution qe = null;
ResultSet rs;
try {
String qry = "SELECT ?x WHERE { ?x :hasX :SomeX . }";
qe = QueryExecutionFactory.create(qry, infModel);
rs = qe.execSelect();
while(rs.hasNext()) {
QuerySolution sol = rs.nextSolution();
System.out.println(sol.get("x"));
}
} finally {
qe.close();
infModel.close();
model.close();
dataset.close();
}
上記のコードに何か問題がありますか、それともそれが機能しない理由は他に何がありますか?
それ以外に、「推測された公理をオントロジーとしてエクスポートする」(Protegeが提供)を実行すると、パフォーマンスを向上できるかどうかを知りたいですか?
編集: 私はその間にペレットを使用しようとしましたが、他の質問で説明したように、推測されたモデルを取得できません:理由としてペレットを使用するOutOfMemoryError。では、他に何ができますか?