有没有办法让使用推理器的特定班级的所有人?推理因为我想获得该类的所有推断和认定的个体.我正在使用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)
谢谢
通话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规则.