我正在使用 Jena 框架阅读本体。我有一个文件,其中包含实例和对本体的导入(我在另一个文件中有)。这个本体有几个实例,但我想在模型中只读取我的实例文件中包含的实例,而不是本体文件中的实例。
我找到了这个方法:
Model base = myOntModel.getBaseModel();
但是这个方法返回 OntModel 中的所有内容......有什么办法吗?例如,阅读完整模型,然后删除我不想要的实例?或者,有没有办法在模型中区分本体实例和不在本体中的实例?
如果您阅读您的模型,但不处理导入,您将看不到在导入的本体中声明的任何实例。您仍将拥有与您的本体相对应的本体对象,并且您仍将拥有三元组
yourOntology owl:imports importedOntology
但你不会有来自的三元组importedOntology
。在调用读取文件之前,似乎调用OntModel.setDynamicImports(false
当然是 )应该确保您不处理这些导入。
如果由于某种原因您无法阻止OntModel 加载导入(从而使它们在实例本体中可见),您可以利用 Jena 将本体导入存储为 OntModel 的子模型的方式。您可以使用OntModel.listSubModels检查 OntModel 的子模型。当您确定由于该owl:imports
语句而存在的那个时,您可以使用OntModel.removeSubModel将其从 OntModel 中删除。
如果由于某种原因上述两种方法都不适合您(但我很确定至少其中一种应该),并且您仍然对这个问题感兴趣
有没有办法在模型中区分本体实例和不在本体中的实例?
答案是“是的,你可以做到”。有两种方法,OntModel.isInBaseModel(Statement)和OntModel.isInBaseModel(RDFNode)将告诉您给定的 Statement 或 RDFNode 是否出现在基本模型中。当然,两者都可能出现某些东西,因此即使isInBaseModel(someIndividual)
对于 是正确的someIndividual
,也不一定意味着在实例本体中someIndividual
已声明;它可以在导入的本体中声明,但在导入的本体中也有提及。
附件是一个 JUnit 测试用例,展示了 OntModel 的子模型及其导入的分离。演示了仅打印/查询与导入它的文档分开的导入模型的内容的能力。JUnit 测试用例中的断言展示了导入中的语句与实际本体中的语句之间的区别。
请注意,如果您不调用 model.getBaseModel().contains(...) 而不是 model.contains(...),那么您将看到基础模型和所有子模型的并集。导入构建为子模型(如 Joshua Taylor 所述)
@Test
public final void test() {
// Create a doc manager / modelspec to resolve imports
final OntDocumentManager docManager = new OntDocumentManager();
final OntModelSpec modelSpec = new OntModelSpec(OntModelSpec.OWL_DL_MEM);
modelSpec.setDocumentManager(docManager);
// Create an imported model that can be referenced by the docManager
final OntModel imprt = ModelFactory.createOntologyModel(modelSpec);
docManager.addModel("x-model://a", imprt);
// Populate imported model with some content
final Ontology imprtOnt = imprt.createOntology("x-model://a");
final OntClass clazz = imprt.createClass("x-model://a/class");
assertTrue("delcared class should exist in a", imprt.contains(clazz, RDF.type, OWL.Class));
System.out.println("x-model://a before");
System.out.println("-------------------------------------------");
imprt.write(System.out, "N3");
System.out.println("\n");
// Create a model which imports x-model://a
final OntModel model = ModelFactory.createOntologyModel(modelSpec);
model.setDynamicImports(true);
final Ontology modelOnt = model.createOntology("x-model://b");
modelOnt.addImport(imprtOnt);
assertTrue("import b->a does not exist", model.hasLoadedImport("x-model://a"));
assertTrue("triples in a should be acessible through b", model.contains(clazz, RDF.type, OWL.Class));
assertFalse("triples in a should not be acessible through b's baseModel", model.getBaseModel().contains(clazz, RDF.type, OWL.Class));
// Populate this new model
final Individual ind = model.createIndividual("x-model://b/individual", clazz);
assertTrue("delcared individual should exist in b", model.contains(ind, RDF.type, clazz));
System.out.println("x-model://a after");
System.out.println("-------------------------------------------");
imprt.write(System.out, "N3");
System.out.println("\n");
System.out.println("x-model://b");
System.out.println("-------------------------------------------");
model.write(System.out, "N3");
}
下面是编写模型的三个调用的示例输出。请注意,x-model://b 从不包含来自 x-model://a 的任何三元组。write 的默认行为是仅参考基本模型。要编写所有子模型,您将使用 writeAll(...)。
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
<x-model://a/class>
a owl:Class .
<x-model://a>
a owl:Ontology .
x-model://a after
-------------------------------------------
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
<x-model://a/class>
a owl:Class .
<x-model://a>
a owl:Ontology .
x-model://b
-------------------------------------------
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
<x-model://b/individual>
a <x-model://a/class> .
<x-model://b>
a owl:Ontology ;
owl:imports <x-model://a> .