Rdf 如何仅从Jena本体模型中获取推断数据

Rdf 如何仅从Jena本体模型中获取推断数据,rdf,jena,owl,inference,pellet,Rdf,Jena,Owl,Inference,Pellet,试图通过Jena界面使用PelletReasoner仅列出知识(新的三元组)。我只需要从本体(OWL)应用托盘推理机和InfModel后生成的推断数据。目前,我列出了所有的个人-其中包含断言和推断的知识 因此,我如何才能从owl中获得仅推断知识。提前支付 //Inference Logic// com.hp.hpl.jena.reasoner.Reasoner reasoner = org.mindswap.pellet.jena.PelletReasonerFactory.theIn

试图通过Jena界面使用PelletReasoner仅列出知识(新的三元组)。我只需要从本体(OWL)应用托盘推理机和InfModel后生成的推断数据。目前,我列出了所有的个人-其中包含断言和推断的知识

因此,我如何才能从owl中获得推断知识。提前支付

//Inference Logic//

    com.hp.hpl.jena.reasoner.Reasoner reasoner = org.mindswap.pellet.jena.PelletReasonerFactory.theInstance().create();

    Model infModel = ModelFactory.createInfModel(reasoner, ModelFactory.createDefaultModel());

    OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM, infModel);

    try
    {
        inputStream = new FileInputStream(OWL_File);
    }
    catch (FileNotFoundException p)
    {
        p.printStackTrace();
    }
    model.read(inputStream, null, "RDF/XML");

下面的代码创建了一个简单的OntModel,其中包含类B和a,其中B&SQSubsetq;A、 我是B型个体,我们可以推断,例如,我是A的一个实例,我们会在结果中看到

import org.mindswap.pellet.jena.PelletReasonerFactory;
导入com.hp.hpl.jena.ontology.OntClass;
导入com.hp.hpl.jena.ontology.OntModel;
导入com.hp.hpl.jena.ontology.OntModelSpec;
导入com.hp.hpl.jena.rdf.model.InfModel;
导入com.hp.hpl.jena.rdf.model.model;
导入com.hp.hpl.jena.rdf.model.ModelFactory;
导入com.hp.hpl.jena.rdf.model.Statement;
导入com.hp.hpl.jena.rdf.model.impl.StmtIteratorImpl;
导入com.hp.hpl.jena.util.iterator.ExtendedIterator;
导入com.hp.hpl.jena.util.iterator.Filter;
请给我公务舱{
公共静态void main(字符串[]args){
//创建基本模型。B是a的子类,i是B的实例。
字符串NS=”http://example.org/";
最终的OntModel模型=ModelFactory.createOntologyModel(OntModelSpec.OWL\u DL\u MEM);
OntClass a=model.createClass(NS+“a”);
OntClass b=model.createClass(NS+“b”);
a、 添加子类(b);
模型.createIndividual(NS+“i”,b);
//创建推理模型。
InfModel pModel=ModelFactory.createInfModel(PelletReasonerFactory.theInstance().create(),model);
//对基本模型中*不*的pModel语句的迭代器。
ExtendedIterator stmts=pModel.listStatements().filterDrop(新过滤器(){
@凌驾
公共布尔接受(语句o){
返回模型。包含(o);
}
});
//为了方便打印,我们创建了一个扣减模型。
//(如果stmts是StmtIterator,我们可以直接添加它。它不是,
//因此,我们最终创建了一个新的StmtIteratorImpl,这是一个很难理解的问题,但是
//这比将内容转换为列表更有效。)
模型扣减=ModelFactory.createDefaultModel().add(新的StmtIteratorImpl(stmts));
扣除额。写入(系统输出,“TTL”);
}
}
整个结果有点大,因为有很多纯粹基于OWL的结论。我们最清楚地看到纯演绎结果的地方是我们定义的类和个体。请注意,例如,B被列为自身和owl:Thing的子类,但不是a的子类(因为它在原始模型中),我有owl:Thing和a类型,但不是B类型(因为它也在原始模型中):


,  ;
;
.
,  ;
;
.
A.
.

简短回答:对于某些推理模型,您可以使用,但一般来说,您必须迭代InfModel的语句并跳过基本模型中存在的语句,因为演绎模型仍然可以重复基本模型中的内容。Jena的迭代器也可以使它相对干净。@Joshua:谢谢你的快速回复。当GetDeclarationsModel与InfModel一起使用时,Pellet resasoner似乎返回null。我哪里错了?我刚刚遇到ModelExtractor(Pellet支持),它对语句类型采用一些过滤条件,您认为这是一种合适的方法吗?请建议,你是对的;pellet的InfModel为演绎模型返回null。我提到了这一点,因为对于某些推理模型,getDeclarationsModel是一个有用的东西,但它不是通用的。(不过,直到我检查后才记得。)在本例中,您需要迭代InfModel语句并过滤掉基础模型中的语句。我添加了一个示例。