当前位置: 首页 > 知识库问答 >
问题:

如何获得具有相同对象属性断言的OWLINDIVUTOAL集?

姚树
2023-03-14

我有一个本体,是使用Protegé4.3.0创建的,我将使用reasoner来检索具有相同对象属性断言的owlindividual个体。

>

  • 本体论包含一组代表某种动物的个体(老鼠、猫、狗)。

    本体包含一组与不同类(眼睛、耳朵、腿)相关联的个体(mouseEyes,mouseEars,mouseLegs,catEyes,catEars,catLegs,dogEyes,dogEars,dogLegs)。

    • 个体mouseEyes、catEyes和dogEyes与类eyes相关联。
    • 个体mouseEars、catEars和dogEars与类ears相关联。
    • 鼠腿、猫腿和狗腿与腿类相关联。

    给定mouseEys,mouseEars,mouseLegs,catEyes,catEars,catLegs,dogEyes,dogEars,dogLegs中的一个指定个体,我将检索具有相同对象属性断言的个体集。对于esample,如果指定的个体是catEyes,则推理器应该检索catEyes,catEars,Catlegs。

    我如何使用推理器来完成这件事?

  • 共有1个答案

    隆康平
    2023-03-14

    我发现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在这里不完