Java 使用OWLAPi和JFact reasoner获取特定类的所有个体

Java 使用OWLAPi和JFact reasoner获取特定类的所有个体,java,owl-api,Java,Owl Api,是否有任何方法可以使用reasoner获取特定类别的所有个人? 推理机,因为我想得到该类的所有推断和评估的个体。 我正在使用JFact reasoner,我正在尝试循环和if语句。我想找到类中的个体,例如“person”。但我看不到这些人。你对下面的代码有什么想法,或者有什么方法可以达到这个目的吗 for (OWLClass c : myPizza.getClassesInSignature()) { NodeSet<OWLNamedIndividual> insta

是否有任何方法可以使用reasoner获取特定类别的所有个人? 推理机,因为我想得到该类的所有推断和评估的个体。 我正在使用JFact reasoner,我正在尝试循环和if语句。我想找到类中的个体,例如“person”。但我看不到这些人。你对下面的代码有什么想法,或者有什么方法可以达到这个目的吗

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;

    }
for(OWLClass:myPizza.getClassesInSignature()){
NodeSet instances=reasoner.getInstances(c,true);
System.out.println(c.getIRI().getFragment());
如果(c.getIRI().getFragment().equals(“Person”)){
对于(OWLNamedIndividual i:instances.getFlatten()){
System.out.println(i.getIRI().getFragment());
}
}
否则{
继续;
}
打破
}

感谢您致电
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()); 
        }
    }
}
for(OWLClass:myPizza.getClassesInSignature()){
如果(c.getIRI().getFragment().equals(“Person”)){
NodeSet instances=reasoner.getInstances(c,false);
System.out.println(c.getIRI().getFragment());
对于(OWLNamedIndividual i:instances.getFlatten()){
System.out.println(i.getIRI().getFragment());
}
}
}

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

请尝试此方法。您可以使用下面的方法获取特定类的所有个体

 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()); 
            }
        }
    }
}
私有静态void printIndividualsByclass(OWLOntology本体,字符串owlClass){
OWLReasonerFactory reasonerFactory=新的PelletReasonerFactory();
OWLReasoner-reasoner=reasonerFactory.createNonBufferingReasoner(本体);
for(OWLClass:ontology.getClassesInSignature()){
if(c.getIRI().getShortForm().equals(owlClass)){
NodeSet instances=reasoner.getInstances(c,false);
System.out.println(“类:+c.getIRI().getShortForm());
对于(OWLNamedIndividual i:instances.getFlatten()){
System.out.println(i.getIRI().getShortForm());
}
}
}
}

谢谢。我尝试了你的代码,但我只得到了断言的个人。我没有得到推断的个体。你知道一个解决方案吗?你能分享本体吗?通过分享,你的意思是我向你发送owl文件还是仅仅是我的本体的一些描述?我应该在这里提到,推断出的个体是通过swrl规则生成的。通过分享,我的意思是能够将本体放在这里或链接到它,这样问题就可以重现。但您的另一条评论解释了这个问题:JFact不支持SWRL规则,因此JFact不会计算推断出的个体。旁注:您是在生成新的实例,还是只是在断言关于现有个体的新公理?如果我正确地记住了DL安全规则,SWRL规则就不能创建新的个体。