Java 在同一个JENA应用程序中处理多个OWL文件

Java 在同一个JENA应用程序中处理多个OWL文件,java,rdf,jena,owl,arq,Java,Rdf,Jena,Owl,Arq,我正在制作一个可能需要2-3个OWL文件才能使用的应用程序,以便为同一应用程序提供不同的任务。我使用Jena作为我的语义web框架。我的问题是:我们如何组织/设置这些owl文件? 我应该读取同一数据集中的所有owl文件,还是应该为不同的owl维护不同的数据集。 注意:我不考虑进口猫头鹰,因为它是由jena自己处理的 如果使用相同的数据集,如何区分由OntModel.lisRootHierarchyClasses()等函数获得的结果;以及其他类似类型的功能。 当我将本体读入模型时,是否可以命名它们

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

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

因此,我想知道在同一个应用程序中处理多个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\u ClassA),我还需要处理它的对象属性和数据类型属性,并在相同的上下文中为用户提供一些信息


但为了做到这一点,还将列出SourceOWL1中的属性,从而导致错误。此外,SourceOWL1和SourceOWL2的结构也有很大不同,其中SourceOWL1包含大约3个导入,SourceOWL2不包含任何导入。

经过几天的广泛实践,我找到了解决方案

答案是使用
数据集中的命名模型。
上述代码片段中犯的错误是使用的
model
/
ontModel
是从DefaultModel生成的,即。
Model Model=dataset.getDefaultModel()
相反,应利用:
modelnamedmodel=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()
上用于从所有源OWL生成根类。但是现在可以使用命名模型概念访问设计模型,并且
ontModel.lisRootHierarchyClasses()
将只回答特定于该本体的根类

有关命名模型的详细信息,请参考
它帮助我理清了自己的概念。。希望这对你也有帮助。

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