我正在制作一个可能需要大约2-3个OWL文件才能使用的应用程序,以便为同一个应用程序提供不同的任务。我使用Jena作为我的语义Web框架。我的问题是:我们如何组织/设置这些猫头鹰文件? 我应该读取同一数据集中的所有owl文件,还是应该为不同的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),我还需要处理它的Object属性和数据类型属性,并为用户提供一些信息。相同的背景。
但是为了做到这一点,SourceOWL1中的属性也会被列出,从而导致错误。此外,SourceOWL1和SourceOWL2的结构非常不同,其中SourceOWL1包含大约3个导入而SourceOWL2不包含任何内容。
答案 0 :(得分:1)
经过几天的广泛实践,我找到了解决方案。
答案是在Dataset
中使用命名模型。
上述代码段中提交的错误是使用的model
/ ontModel
是从 DefaultModel 生成的,即
Model model = dataset.getDefaultModel();
Insted应该使用:
Model namedmodel = dataset.addNamedModel("NameOfModel");
其中NameOfModel可以是方便开发人员的任何字符串。
然后在相应的namedModel
。
因此,上述功能可以重写如下:
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();
}
}
回答问题中所述的问题:
完成数据集创建后,我们可以使用OntModel
访问特定于我们要求的不同本体/ dataset.getNamedModel("NamedModel1")
,从而将其视为独立于其他模型的ontModel。
由于问题中使用的ontModel
是通过dataset.getDefaultModel()
生成的,因此ontModel.lisRootHierarchyClasses()
用于生成所有源猫头鹰的根类。但现在可以使用命名模型概念访问desiered模型,ontModel.lisRootHierarchyClasses()
将仅回答特定于该本体的根类。
有关命名模型的详细信息,请参阅here 它帮助我清除了我的概念..希望它也能帮助你......