使用OWLAPi和JFact推理器获取特定类的所有个体

时间:2015-01-21 16:57:52

标签: java owl-api

有没有办法让使用推理器的特定班级的所有人? 推理因为我想获得该类的所有推断和认定的个体。 我正在使用JFact推理器,我正在尝试循环和if语句。而且我想找到班级的人,例如“人”。但我无法看到这些人。关于下面代码的任何想法,或者是否有任何方法用于此目的?

for (OWLClass c : myPizza.getClassesInSignature()) {
        NodeSet<OWLNamedIndividual> instances = reasoner.getInstances(c, true);
        System.out.println(c.getIRI().getFragment());
        if (c.getIRI().getFragment().equals("Person")){

            for (OWLNamedIndividual i : instances.getFlattened()) {
                System.out.println(i.getIRI().getFragment()); 

        }
    }
        else {
            continue;
        }
        break;

    }

由于

2 个答案:

答案 0 :(得分:6)

调用reasoner.getInstances(c, true);只会为您提供c的/ direct /实例;如果你所追求的个体是c的子类的实例,它们将被跳过。切换到reasoner.getInstances(c, false);以包含子类的实例。

您在第一次迭代后也在调用break;。如果person不是签名中的第一个类,那么您永远不会查找person的实例。

您可以稍微更改代码以减少推理工作:

for (OWLClass c : myPizza.getClassesInSignature()) {
    if (c.getIRI().getFragment().equals("Person")){
        NodeSet<OWLNamedIndividual> instances = reasoner.getInstances(c, false);
        System.out.println(c.getIRI().getFragment());
        for (OWLNamedIndividual i : instances.getFlattened()) {
            System.out.println(i.getIRI().getFragment()); 
        }
    }
}

编辑:请注意,如果您希望看到SWRL推断的个人,您需要使用支持SWRL的推理器,如Pellet或HermiT。 JFact不支持SWRL规则。

答案 1 :(得分:2)

试试这个方法。您可以使用以下方法获取特定班级的所有个人。

 private static void printIndividualsByclass(OWLOntology ontology, String owlClass){
    OWLReasonerFactory reasonerFactory = new PelletReasonerFactory();
    OWLReasoner reasoner = reasonerFactory.createNonBufferingReasoner(ontology);
    for (OWLClass c : ontology.getClassesInSignature()) {
        if (c.getIRI().getShortForm().equals(owlClass)){
            NodeSet<OWLNamedIndividual> instances = reasoner.getInstances(c, false);
            System.out.println("Class : "+ c.getIRI().getShortForm());
            for (OWLNamedIndividual i : instances.getFlattened()) {
                System.out.println(i.getIRI().getShortForm()); 
            }
        }
    }
}