使用 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());
}
}
}
}
有没有什么方法可以使用 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());
}
}
}
}