只读Jena中本体模型的文件实例

时间:2013-06-25 08:33:47

标签: java jena ontology

我正在阅读Jena Framework的本体论。我有一个文件,其中包含实例和对本体的导入(我在另一个文件中有)。这个本体有几个实例,但我想在模型中只读取实例文件中包含的实例,而不是本体文件中的实例。

我找到了这个方法:

Model base = myOntModel.getBaseModel();

但是这个方法返回了OntModel中的所有内容......有没有办法做到这一点?例如,阅读完整模型然后删除我不想要的实例?或者,是否有任何方法可以区分本体实例与非本体实例之间的模型?

2 个答案:

答案 0 :(得分:3)

在加载Instances Ontology

之前

如果您阅读了模型,但没有处理导入,则您将无法看到导入的本体中声明的任何实例。您仍然拥有与您的本体相对应的本体对象,并且您仍然拥有三元组

yourOntology owl:imports importedOntology

但你不会从importedOntology获得三元组。在调用您的文件之前,似乎只需拨打OntModel.setDynamicImports(当前有false)就可以确保您不会处理这些导入。

加载Instances Ontology

之后

如果由于某种原因你不能阻止 OntModel加载导入(从而使它们从实例本体中可见),你可以利用Jena存储ontologies导入的方式作为子模型一个OntModel。您可以使用OntModel.listSubModels检查OntModel的子模型。当您通过owl:imports语句识别出那里的那个时,您可以使用OntModel.removeSubModel将其从OntModel中删除。

检查实例是否在BaseModel

如果出于某种原因,上述两种方法都不适合你(但我很确定至少其中一种方法应该适用),而你仍然对这个问题感兴趣

  

有没有办法区分本体实例与非本体实例之间的模型?

答案是“是的,你可以这样做。”有两种方法OntModel.isInBaseModel(Statement)OntModel.isInBaseModel(RDFNode)可以告诉你给定的Statement或RDFNode是否出现在基本模型中。当然,某些内容可能会出现在两者中,所以即使isInBaseModel(someIndividual)属于someIndividual,它也不一定意味着someIndividual在实例本体中声明;它本来可以在导入的本体中声明,但在导入本体中也是提到的

答案 1 :(得分:2)

附件是一个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> .