我从 Protege 以 TURTLE 表示法创建了一个 OWL 文件,它使用两个导入:
owl:imports <http://localhost/imported1.owl> ,
<http://localhost/imported2.owl> .
我已经在 Jena 上加载了这个。当我查询文件时,我没有从导入中得到任何答案,而只是从文件本身中得到答案。例如,如果我有一个类“Person”并且我查询模型(使用 SPARQL 或使用推理器)以查找该类的个人,我只会在我的文件中获取个人,而不是从导入的文件“imported1.owl”和“imported2.owl”。
我已阅读默认加载导入的文件(导入处理)我还有什么需要做的吗?
例如,如果我将三个文件合二为一,而不是使用导入,我会得到预期的结果。
==== 编辑 ====
这两个文件(imported1.owl 和imported2.owl)都可以通过Web 服务器访问(如果我输入了URL,我就可以正确地得到文件)。
这是代码:
Model model = ModelFactory.createDefaultModel();
OntModel ontology = ModelFactory.createOntologyModel();
InputStream in = FileManager.get().open(file);
if (in == null) {
return;
} else {
ontology.read(in, null, "TURTLE");
}
Reasoner owlReasoner = ReasonerRegistry.getOWLReasoner();
Reasoner reasoner = owlReasoner.bindSchema(ontology);
InfModel infModel = ModelFactory.createInfModel(reasoner, ontology);
String queryString = " PREFIX eg: <http://eg.owl#>"
+ " SELECT ?p WHERE { ?p <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> eg:Person }";
Query query = QueryFactory.create(queryString);
QueryExecution qe = QueryExecutionFactory.create(query, ontology);
ResultSet results = qe.execSelect();
ResultSetFormatter.out(System.out, results, query);
如果此代码使用“owl:imports”针对 owl 文件运行,我将仅获得文件本身中定义的 Person 实例,但忽略导入文件中定义的实例。
==== 编辑 2====
[无关]
似乎我做错了什么 - 由于原始 .owl 文件中的错误而未加载导入,或者 Jena 仅使用基本文档。
==== 编辑 3====
似乎模型已正确加载(我还检查了 hasLoadedImport()):
本体.countSubModels(): 2
所以我丢弃了没有正确加载的导入。不知何故,Jena 似乎只使用基本文件而不是导入的文件......