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

use*_*529 3 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;

    }
Run Code Online (Sandbox Code Playgroud)

谢谢

Ign*_*zio 6

通话reasoner.getInstances(c, true);只会给你/直接/ c的实例; 如果你所追求的个体是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()); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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