我有一个本体,是使用Protegé4.3.0创建的,我将使用reasoner来检索具有相同对象属性断言的owlindividual
个体。
>
本体论包含一组代表某种动物的个体(老鼠、猫、狗)。
本体包含一组与不同类(眼睛、耳朵、腿)相关联的个体(mouseEyes,mouseEars,mouseLegs,catEyes,catEars,catLegs,dogEyes,dogEars,dogLegs)。
给定mouseEys,mouseEars,mouseLegs,catEyes,catEars,catLegs,dogEyes,dogEars,dogLegs中的一个指定个体,我将检索具有相同对象属性断言的个体集。对于esample,如果指定的个体是catEyes,则推理器应该检索catEyes,catEars,Catlegs。
我如何使用推理器来完成这件事?
我发现OWLReasoner
中的GetObjectPropertyValues
方法在使用Reasoner解决问题中暴露的问题时非常有用。正如在这篇评论中指出的那样,SPARQL确实是查询模型的更好方法。
下面是我使用Reasoner实现的解决方案。
import java.io.File;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLClass;
import org.semanticweb.owlapi.model.OWLDataFactory;
import org.semanticweb.owlapi.model.OWLIndividual;
import org.semanticweb.owlapi.model.OWLNamedIndividual;
import org.semanticweb.owlapi.model.OWLObjectPropertyExpression;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyID;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.model.PrefixManager;
import org.semanticweb.owlapi.reasoner.InferenceType;
import org.semanticweb.owlapi.reasoner.OWLReasoner;
import org.semanticweb.owlapi.reasoner.OWLReasonerFactory;
import org.semanticweb.owlapi.reasoner.structural.StructuralReasonerFactory;
import org.semanticweb.owlapi.util.DefaultPrefixManager;
public class Fauna {
private final static OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
private final static OWLDataFactory df = manager.getOWLDataFactory();
private final static OWLReasonerFactory rf = new StructuralReasonerFactory();
private final OWLOntology ontology;
private final OWLOntologyID id;
private final IRI iri;
private final PrefixManager pm;
private final OWLReasoner reasoner;
private final OWLObjectPropertyExpression arePartsOf;
private final TreeSet<OWLClass> clsParts = new TreeSet<>();
/**
*
* @param file
* @throws OWLOntologyCreationException
*/
public Fauna(File file) throws OWLOntologyCreationException {
ontology = manager.loadOntologyFromOntologyDocument(file);
id = ontology.getOntologyID();
iri = id.getOntologyIRI();
pm = new DefaultPrefixManager(iri.toString().concat("#"));
reasoner = rf.createReasoner(ontology);
reasoner.precomputeInferences(InferenceType.OBJECT_PROPERTY_ASSERTIONS);
arePartsOf = df.getOWLObjectProperty(IRI.create(iri + "#arePartsOf"));
for (String s : new String[] { "Eyes", "Ears", "Legs" }) {
OWLClass cls = df.getOWLClass(":" + s, pm);
clsParts.add(cls);
}
}
/**
*
* @param individual
* @return
*/
private Set<OWLNamedIndividual> getPartsOfSameSpecies(OWLNamedIndividual individual) {
if (!ontology.containsIndividualInSignature(individual.getIRI())) {
return null;
}
Set<OWLClass> types = reasoner.getTypes(individual, true).getFlattened();
if (Collections.disjoint(clsParts, types)) {
return null;
}
Set<OWLNamedIndividual> values = reasoner.getObjectPropertyValues(individual, arePartsOf).getFlattened();
if (values == null || values.size() != 1) {
return null;
}
OWLNamedIndividual species = values.iterator().next();
return this.getParts(species);
}
/**
*
* @param species
* @return
*/
public Set<OWLNamedIndividual> getParts(OWLNamedIndividual species) {
HashSet<OWLNamedIndividual> individuals = new HashSet<>();
for (OWLClass cls : clsParts) {
for (OWLIndividual i : cls.getIndividuals(ontology)) {
OWLNamedIndividual part = i.asOWLNamedIndividual();
if (!reasoner.getObjectPropertyValues(part, arePartsOf).containsEntity(species)) {
continue;
}
individuals.add(part);
}
}
return individuals;
}
}
我在本体论中工作,我有以下swhl规则: 我想知道负对象属性断言何时发生(当verifiedAssociation不为true时)。 我在Protégé上找到了tab属性断言,但我希望(推理者)能够推断出这一点。我不知道如何创建一个规则来实现这一点。 有人能帮帮我吗?
获取所有名称为“Sam”的对象。
假设我们有一个这样定义的对象A: 出于某种原因,我需要创建第二个对象B,它只具有对象A的前两个属性: 所以我的问题是:将对象A复制到对象B的最佳方法是什么?我一直在逐个复制获取者和设置者的属性,但有些事情告诉我一定有更好的方法来做到这一点!特别是当对象将具有很多属性时,我必须编写一行又一行的代码,只是为了将它们全部复制到第二个对象B... 多谢了:) 编辑:我一直被一个“另一个问题的可能重复”提醒
我有一个这样的对象数组: 我希望每个人(名字)都有一个对象,并添加他们的对象。 因此,最终阵列将是: 我使用的真正数组非常大,这就是为什么我正在寻找最有效的方法。
如何处理对象的javascript数组,例如: 并通过求和这些值合并重复的键。为了得到这样的东西: 我尝试过迭代并添加到一个新数组中,但这没有起到作用:
假设我有一些本体论创建的蛋白质,有一个类的实例与一些对象属性,和对象属性的列表,已显示在以下图片: 对象属性的层次结构如下所示: 现在,当我打开Reasoner(Hermit)时,我得到了同一个人的以下断言对象属性: 当我点击推断对象属性“dependsUp”客户的解释时,我得到: 我的问题是,我如何使用Java生成它?我已经可以通过以下方法获得某些个人的推断对象属性(abreviety在这里不完