本文介绍了使用OWL API 4.0检索具有相同对象属性的OWL个体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Eclipse 4中使用OWL Api 4.0,在Protege 4中使用简单的本体。我有两个类Ward和Gaurdian。这些类的个体通过对象属性isWardOf相关联。我如何检索与类Gaurdian相关的Ward类的个体。考虑下图: -

I am using OWL Api 4.0 in eclipse 3.4 with a simple ontology in Protege 4. I have two classes "Ward" and "Gaurdian". Individuals of these classes are related by object property isWardOf. How can i retrieve the individuals of class Ward that are related to same individual of Class Gaurdian. consider the following figure:-

我想检索Peter和Allice相关的事实或兄弟姐妹,因为他们都连接到杰克。关于如何使用OWL API 4.0实现此目的的任何粗略线索。

I want to retrieve the Fact that Peter and Allice are related or siblings as they both are connected to Jack. Any rough clue as to how to achieve this using OWL API 4.0.

我的完整owl文件已贴上: -

My complete owl file is affixed:-

<?xml version="1.0"?>


<!DOCTYPE Ontology [
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
<!ENTITY xml "http://www.w3.org/XML/1998/namespace" >
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
]>


<Ontology xmlns="http://www.w3.org/2002/07/owl#"
 xml:base="http://www.semanticweb.org/antonio/ontologies/2014/11/untitled-ontology-46"
 xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:xml="http://www.w3.org/XML/1998/namespace"
 ontologyIRI="http://www.semanticweb.org/antonio/ontologies/2014/11/untitled-ontology-
 46">
 <Prefix name="rdf" IRI="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/>
 <Prefix name="rdfs" IRI="http://www.w3.org/2000/01/rdf-schema#"/>
 <Prefix name="xsd" IRI="http://www.w3.org/2001/XMLSchema#"/>
 <Prefix name="owl" IRI="http://www.w3.org/2002/07/owl#"/>
 <Declaration>
    <Class IRI="#Gaurdian"/>
 </Declaration>
 <Declaration>
    <Class IRI="#Ward"/>
 </Declaration>
 <Declaration>
    <ObjectProperty IRI="#isWardOf"/>
 </Declaration>
 <Declaration>
    <NamedIndividual IRI="#Allice"/>
 </Declaration>
 <Declaration>
    <NamedIndividual IRI="#Amber"/>
 </Declaration>
 <Declaration>
    <NamedIndividual IRI="#Jack"/>
 </Declaration>
 <Declaration>
    <NamedIndividual IRI="#Paul"/>
 </Declaration>
 <Declaration>
     <NamedIndividual IRI="#Peter"/>
 </Declaration>
 <ClassAssertion>
    <Class IRI="#Ward"/>
    <NamedIndividual IRI="#Allice"/>
 </ClassAssertion>
 <ClassAssertion>
    <Class IRI="#Gaurdian"/>
    <NamedIndividual IRI="#Amber"/>
 </ClassAssertion>
 <ClassAssertion>
    <Class IRI="#Gaurdian"/>
    <NamedIndividual IRI="#Jack"/>
 </ClassAssertion>
 <ClassAssertion>
    <Class IRI="#Ward"/>
    <NamedIndividual IRI="#Paul"/>
 </ClassAssertion>
 <ClassAssertion>
    <Class IRI="#Ward"/>
    <NamedIndividual IRI="#Peter"/>
 </ClassAssertion>
 <ObjectPropertyAssertion>
    <ObjectProperty IRI="#isWardOf"/>
    <NamedIndividual IRI="#Allice"/>
    <NamedIndividual IRI="#Jack"/>
 </ObjectPropertyAssertion>
 <ObjectPropertyAssertion>
    <ObjectProperty IRI="#isWardOf"/>
    <NamedIndividual IRI="#Amber"/>
    <NamedIndividual IRI="#Jack"/>
 </ObjectPropertyAssertion>
 <ObjectPropertyAssertion>
    <ObjectProperty IRI="#isWardOf"/>
    <NamedIndividual IRI="#Paul"/>
    <NamedIndividual IRI="#Amber"/>
 </ObjectPropertyAssertion>
 <ObjectPropertyDomain>
    <ObjectProperty IRI="#isWardOf"/>
    <Class IRI="#Ward"/>
  </ObjectPropertyDomain>
  <ObjectPropertyRange>
    <ObjectProperty IRI="#isWardOf"/>
    <Class IRI="#Gaurdian"/>
  </ObjectPropertyRange>
  </Ontology> >




推荐答案

这是我能想到的最简单的方法。它涉及与名义推理,所以它可能在计算上很昂贵。但是,如果本体论不是太大,这种方法是可行的。

Here is the simplest way I could think of. It involves reasoning with nominals, so it might be computationally expensive. However, if the ontology is not too big, this approach is feasible.

这个想法是获得每个Gaurdian的所有实例。然后,对于每个这样的个人,通过isWard属性获得与之相关的所有个体。如果它们的大小大于1(如果设置的大小为1,那么这些集合将是您正在寻找的集合,而不是给定的Gaurdian只有一个Ward)。用于此的OWL API代码类似于:

The idea is to get all the instances of every Gaurdian. Then for every such individual get all the individuals that are connected with it by isWard property. These sets will be what you are looking for, if their size is larger than 1 (if the set size is one, than there is only one Ward of a given Gaurdian). The OWL API code for this would be similar to:

// load an ontology
OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
OWLOntology ontology = manager.loadOntologyFromOntologyDocument(ONTOLOGY_IRI);
OWLDataFactory df = manager.getOWLDataFactory();

// We need a reasoner to ask for individuals
OWLReasoner reasoner = createReasoner(ontology);
reasoner.precomputeInferences(InferenceType.CLASS_ASSERTIONS);

// get all the gaurdians in the ontology
OWLClass gaurdian = df.getOWLClass(IRI.create("#Gaurdian"));
Set<OWLNamedIndividual> gaurdians = reasoner.getInstances(gaurdian, false).getFlattened();


for (OWLNamedIndividual g : gaurdians) {
    // all wards of a given gaurdian g
    OWLObjectProperty isWardOf = df.getOWLObjectProperty(IRI.create("#isWardOf"));
    OWLClassExpression wardsOfG = df.getOWLObjectHasValue(isWardOf, g);
    // get all the wards related to a given gaurdian
    Set<OWLNamedIndividual> wards = reasoner.getInstances(wardsOfG, false).getFlattened();
    if ( wards.size() > 1 ) {
        // this set of wards is connected to the same gaurdian
    }
}

这篇关于使用OWL API 4.0检索具有相同对象属性的OWL个体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-05 03:48