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

getting all individuals of a specific class using OWLAPi and JFact reasoner

有没有什么方法可以使用 reasoner 获取特定 class 的所有个体? Reasoner 因为我想得到那个 class 的所有推断和断言的个体。 我正在使用 JFact reasoner,我正在尝试循环和 if 语句。我想找到 class 的个体,例如 "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;

    }

谢谢

调用reasoner.getInstances(c, true);只会给你c的/direct/实例;如果你追寻的个体是 c 的 subclasses 的实例,他们将被跳过。切换到 reasoner.getInstances(c, false); 以包含 subclasses.

的实例

您还在第一次迭代后调用 break;。如果 person 不是签名中的第一个 class,您将永远不会查找 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 规则。

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

 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()); 
            }
        }
    }
}