简体   繁体   English

使用OWL API 4.0检索具有相同对象属性的OWL个体

[英]Retrieve OWL Individuals with same Object Properties using OWL API 4.0

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". 我在Eclipse 4中使用OWL Api 4.0,在Protege 4中使用简单的本体。我有两个类“Ward”和“Gaurdian”。 Individuals of these classes are related by object property isWardOf. 这些类的个体通过对象属性isWardOf相关联。 How can i retrieve the individuals of class Ward that are related to same individual of Class Gaurdian. 我如何检索与类Gaurdian相关的Ward类的个体。 consider the following figure:- 考虑下图: -

在此输入图像描述

I want to retrieve the Fact that Peter and Allice are related or siblings as they both are connected to Jack. 我想要检索Peter和Allice相关的事实或兄弟姐妹,因为他们都与杰克有关。 Any rough clue as to how to achieve this using OWL API 4.0. 关于如何使用OWL API 4.0实现此目的的任何粗略线索。

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. 但是,如果本体不是太大,这种方法是可行的。

The idea is to get all the instances of every Gaurdian. 这个想法是为了获得每个Gaurdian的所有实例。 Then for every such individual get all the individuals that are connected with it by isWard property. 然后,对于每个这样的个体,通过isWard属性获得与之相关的所有个体。 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). 如果它们的大小大于1(如果设置的大小是1,那么这些集合将是您正在寻找的集合,而不是给定的Gaurdian只有一个Ward)。 The OWL API code for this would be similar to: 用于此的OWL API代码类似于:

// 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
    }
}

in the OWL API documentation there's a reference to the source code for the Rough Guide tutorial here OWL的API文档中有对源代码的引用的粗糙指南教程这里

One of the tests retrieves assertions for an object property you should be able to adapt it to your needs: 其中一个测试检索对象属性的断言,您应该能够根据需要调整它:

@Test
public void testIndividualAssertions() throws OWLException {
    OWLOntologyManager m = create();
    OWLOntology o = m.createOntology(EXAMPLE_IRI);
    // We want to state that matthew has a father who is peter.
    OWLIndividual matthew = df.getOWLNamedIndividual(IRI.create(EXAMPLE_IRI
            + "#matthew"));
    OWLIndividual peter = df.getOWLNamedIndividual(IRI.create(EXAMPLE_IRI
            + "#peter"));
    // We need the hasFather property
    OWLObjectProperty hasFather = df.getOWLObjectProperty(IRI
            .create(EXAMPLE_IRI + "#hasFather"));
    // matthew --> hasFather --> peter
    OWLObjectPropertyAssertionAxiom assertion = df
            .getOWLObjectPropertyAssertionAxiom(hasFather, matthew, peter);
    // Finally, add the axiom to our ontology and save
    AddAxiom addAxiomChange = new AddAxiom(o, assertion);
    m.applyChange(addAxiomChange);
    // matthew is an instance of Person
    OWLClass personClass = df.getOWLClass(IRI.create(EXAMPLE_IRI
            + "#Person"));
    OWLClassAssertionAxiom ax = df.getOWLClassAssertionAxiom(personClass,
            matthew);
    // Add this axiom to our ontology - with a convenience method
    m.addAxiom(o, ax);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM