我正在使用 Jena Framework 阅读本体。我有一个包含实例和本体导入的文件(我在另一个文件中有)。这个本体有几个实例,但我只想在模型中读取我的实例文件中包含的实例,而不是本体文件中的实例。
我找到了这个方法:
Model base = myOntModel.getBaseModel();
但是这个方法返回 OntModel 中的所有内容......有什么办法吗?例如,读取完整模型然后删除我不想要的实例?或者,有什么方法可以在模型中区分本体的实例和不在本体中的实例吗?
最佳答案
加载实例本体之前
如果您阅读您的模型,但不处理导入,您将看不到导入本体中声明的任何实例。你仍然会有与你的本体相对应的本体对象,你仍然会有三元组
yourOntology owl:imports importedOntology
但是您不会拥有来自importedOntology
的三元组。好像是给OntModel.setDynamicImports打的电话(当然,使用 false
)在调用读取文件之前应确保您不处理这些导入。
加载实例本体后
如果出于某种原因您无法阻止 OntModel 加载导入(从而使它们从实例本体中可见),您可以利用 Jena 将本体导入存储为子模型的方式一个 OntModel。您可以使用 OntModel.listSubModels 检查 OntModel 的子模型.当您确定由于 owl:imports
语句而存在的那个时,您可以使用 OntModel.removeSubModel将其从 OntModel 中删除。
检查实例是否在 BaseModel 中
如果由于某种原因上述两种方法都不适合你(但我很确定至少其中一种应该),而你仍然对这个问题感兴趣
is there any way to differentiate in the model between the instances of the ontology and those that are not in the ontology?
答案是“是的,你可以做到”。有两种方法,OntModel.isInBaseModel(Statement)和 OntModel.isInBaseModel(RDFNode)这将告诉您给定的 Statement 或 RDFNode 是否出现在基本模型中。当然,某些东西可能出现在两者中,所以即使 isInBaseModel(someIndividual)
对于 someIndividual
是真的,它并不一定意味着 someIndividual
在实例本体中声明;它可能已在导入本体中声明,但在导入本体中也提及。
关于java - 耶拿本体模型的只读文件实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17292675/