【问题标题】:Handle more than one OWL files in a same JENA application在同一个 JENA 应用程序中处理多个 OWL 文件
【发布时间】:2014-11-19 07:32:18
【问题描述】:

我正在制作一个可能需要大约 2-3 个 OWL 文件才能使用的应用程序,以便为同一应用程序提供不同的任务。我使用 Jena 作为我的语义网络框架。我的问题是:我们如何组织/设置这些 owl 文件? 我应该读取同一数据集中的所有猫头鹰文件,还是应该为不同的猫头鹰维护不同的数据集。 注意:我不考虑进口猫头鹰,因为它是由 jena 自己处理的。

如果我使用相同的数据集,我如何区分 OntModel.lisRootHierarchyClasses() 等函数获得的结果;和其他此类功能。 当我将本体读入 OntModel 时,是否可以命名本体。

因此想了解在同一应用程序中处理多个 OWL 文件的最佳做法

例如: 我将我的本体读入一个由 TDB 数据集支持的 ontModel:

public static void loadModel(){
    dataset.begin(ReadWrite.WRITE);
    try{    
        ontModel = ModelToOntModel(model);
        FileManager.get().readModel( ontModel, "SourceOwl1.owk");
        FileManager.get().readModel( ontModel, "SourceOwl2.owl");

        registerListener();
        dataset.commit();
    } catch (Exception e){
        System.out.println("Error in Loading model from source!!");
        e.printStackTrace();
    } finally {

        dataset.end();
    }

}

一旦ontmodel 准备就绪,用户输入会在任何 owl 文件中指定一个特定的类(例如:SourceOWL2_ClassA),我还需要处理它的对象属性和数据类型属性,并在相同的上下文中为用户提供一些信息.

但为了做到这一点,来自 SourceOWL1 的属性也会被列出,因此会导致错误。此外,SourceOWL1 和 SourceOWL2 的结构有很大不同,SourceOWL1 包含大约 3 个导入,而 SourceOWL2 则没有。

【问题讨论】:

  • 我认为对此的任何答案都取决于您实际尝试执行的操作。数据集的概念比 OntModel 更加以 TDB 为中心。我认为您需要提供更多背景信息。
  • 我已经编辑了这个问题,并做了更多的事情。希望有帮助。
  • 好的,根据代码和有关它的讨论(谢谢!),您想将两个 OWL 文件读入不同的模型听起来很清楚。 TDB 支持命名图,那么为什么不将每个 OWL 文件加载到自己的命名图中呢?
  • 您的意思是可以使用相同的数据集/TDB 来存储多个 OntModel,但可以单独访问它们。但是为此我需要处理两个不同的实例 OntModels..??或者一个单一的ontmodel会工作..??你能帮我提供一个相同的示例代码吗?
  • 我试过这个:Ontology ot = ModelGenerator.getModel().getOntology("http://www.semanticweb.org/URI/Of/SourceOWL1"); 使用本体 URI,我能够提取特定于我的要求的本体,但之后我无法从 ot 获取 OntModel 变量。因此想知道命名图的概念。在Jena TDB Doc 中,它说注意如何加载/使用命名图。

标签: java rdf jena owl arq


【解决方案1】:

经过几天的大量实践,我找到了解决方案。

答案是使用Dataset 中的命名模型。 上述代码 sn-p 中犯的错误是使用的model/ontModel 是从 DefaultModel 生成的,即 Model model = dataset.getDefaultModel(); 安装一个应该使用: Model namedmodel = dataset.addNamedModel("NameOfModel"); 其中 NameOfModel 可以是任何便于开发人员使用的字符串。 之后在各自的namedModel 中加载 OWL 文件。

因此上面的函数可以改写如下:

public static void loadModel(){
dataset.begin(ReadWrite.WRITE);
try{    
    Model namedModel1 = dataset.addNamedModel("NamedModel1");
    OntModel ontModel1 = ModelFactory.createOntologyModel();
    FileManager.get().readModel( ontModel1, "SourceOwl1.owl");
// Load second Model    
    Model namedModel1 = dataset.addNamedModel("NamedModel2");
    OntModel ontModel1 = ModelFactory.createOntologyModel();
    FileManager.get().readModel( ontModel, "SourceOwl2.owl");
// Similarly you can load many other models within same dataset.

    dataset.commit();
} catch (Exception e){
    System.out.println("Error in Loading model from source!!");
    e.printStackTrace();
} finally {

    dataset.end();
}

}

要回答问题中所述的问题: 数据集创建完成后,我们可以使用dataset.getNamedModel("NamedModel1") 访问特定于我们要求的不同本体/OntModel,因此将其视为独立于其他的 ontModel。 由于问题中使用的ontModel 是通过dataset.getDefaultModel() 生成的,因此ontModel.lisRootHierarchyClasses() 用于生成来自所有源猫头鹰的根类。但现在可以使用命名模型概念访问所需模型,ontModel.lisRootHierarchyClasses() 将只回答特定于该本体的根类。

有关命名模型的更多信息,您可以参考here 它帮助我理清了我的概念..希望它也能帮助你..

【讨论】:

  • 好问题,好答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2010-12-02
  • 2013-03-21
相关资源
最近更新 更多