我正在阅读一个关于Jena框架的本体。我有一个文件,其中包含实例和到本体的导入(我在另一个文件中)。这个本体有几个实例,但我只想在模型中读取我的实例文件中包含的实例,而不是本体文件中的实例。
我发现了这个方法:
Model base = myOntModel.getBaseModel();但此方法返回OntModel中的所有内容...有没有办法做到这一点?例如,读取完整的模型,然后删除我不需要的实例?或者,有没有办法在模型中区分本体的实例和不在本体中的实例?
发布于 2013-06-28 22:31:42
附件是一个JUnit测试用例,演示了OntModels及其子模型和导入的分离。演示了仅打印/查询导入模型的内容与导入它的文档分开的能力。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> .发布于 2013-06-25 18:36:24
在加载实例本体之前
如果您读取了您的模型,但没有处理导入,那么您将看不到在导入的本体中声明的任何实例。您仍然拥有与您的本体相对应的本体对象,并且您仍然拥有三元组
yourOntology owl:imports importedOntology但是你不会有来自importedOntology的三元组。这看起来像是在调用之前调用OntModel.setDynamicImports (当然是使用false ),读取您的文件应该确保您不会处理这些导入。
加载实例Ontology之后
如果由于某种原因您不能阻止OntModel加载导入(从而使它们在实例本体中可见),您可以利用Jena将本体导入存储为OntModel的子模型的方式。您可以使用OntModel.listSubModels检查OntModel的子模型。当您确定了由于owl:imports语句而存在的值时,可以使用OntModel.removeSubModel将其从OntModel中删除。
检查实例是否在BaseModel中
如果由于某种原因,上面的两种方法对你都不起作用(但我很确定至少有一种对你有效),而你仍然对这个问题感兴趣
有没有办法在模型中区分本体的实例和不在本体中的实例?
答案是“是的,你可以做到。”有两个方法OntModel.isInBaseModel(Statement)和OntModel.isInBaseModel(RDFNode)可以告诉您给定的语句或RDFNode是否出现在基本模型中。当然,有些东西可以出现在两者中,所以即使isInBaseModel(someIndividual)对于someIndividual是真的,也不一定意味着someIndividual是在实例本体中声明的;它可以在导入的本体中声明,但也可以在导入的本体中提到。
https://stackoverflow.com/questions/17292675
复制相似问题