Получить значение свойства Пересечение двух объектов в онтологии с использованием OWL API

Я новичок в OWL API и пытаюсь с ним поэкспериментировать. Я создал простую онтологию в протеже и взаимное приложение в eclipse, используя OWL API. Структура онтологии выглядит следующим образом:

----------------------------------------------------------------------------------------  
 Class                Object       (Data Property)StringValue  ObjectProperty relatedTo    
----------------------------------------------------------------------------------------  
 WordString             WS1                    "One"                   DS1
                        WS2                    "Two"                   DS2
                        WS3                    "Three"                 DS3

 DigiString             DS1                    "1"  
                        DS2                    "2"  
                        DS3                    "3"  
----------------------------------------------------------------------------

Полная онтология выглядит следующим образом:

<rdf:RDF xmlns="http://localhost:3030/DigiWord.owl#"
 xml:base="http://localhost:3030/DigiWord.owl"
 xmlns:DigiWord="http://localhost:3030/DigiWord.owl#"
 xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
 xmlns:owl="http://www.w3.org/2002/07/owl#"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<owl:Ontology rdf:about="http://localhost:3030/DigiWord.owl"/>
<!-- 
// Object Properties
///////////////////////////////////////////////////////////////////////////////////////
 -->
<!-- http://localhost:3030/DigiWord.owl#relatedTo -->
<owl:ObjectProperty rdf:about="&DigiWord;relatedTo">
    <rdfs:domain rdf:resource="&DigiWord;DigiString"/>
    <rdfs:range rdf:resource="&DigiWord;WordString"/>
</owl:ObjectProperty>
<!-- 
//
// Data properties
///////////////////////////////////////////////////////////////////////////////////////
 -->
<!-- http://localhost:3030/DigiWord.owl#stringValue -->

<owl:DatatypeProperty rdf:about="&DigiWord;stringValue">
    <rdfs:domain rdf:resource="&DigiWord;DigiString"/>
    <rdfs:domain rdf:resource="&DigiWord;WordString"/>
    <rdfs:range rdf:resource="&xsd;string"/>
</owl:DatatypeProperty>
<!-- 
// Classes
///////////////////////////////////////////////////////////////////////////////////////
 -->
<!-- http://localhost:3030/DigiWord.owl#DigiString -->
<owl:Class rdf:about="&DigiWord;DigiString"/>
<!-- http://localhost:3030/DigiWord.owl#WordString -->
<owl:Class rdf:about="&DigiWord;WordString"/>
<!-- 
// Individuals
///////////////////////////////////////////////////////////////////////////////////////
 -->
<!-- http://localhost:3030/DigiWord.owl#DS1 -->
<owl:NamedIndividual rdf:about="&DigiWord;DS1">
    <rdf:type rdf:resource="&DigiWord;DigiString"/>
    <stringValue rdf:datatype="&xsd;string">1</stringValue>
    <relatedTo rdf:resource="&DigiWord;WS1"/>
</owl:NamedIndividual>
<!-- http://localhost:3030/DigiWord.owl#DS2 -->
<owl:NamedIndividual rdf:about="&DigiWord;DS2">
    <rdf:type rdf:resource="&DigiWord;DigiString"/>
    <stringValue rdf:datatype="&xsd;string">2</stringValue>
    <relatedTo rdf:resource="&DigiWord;WS2"/>
</owl:NamedIndividual>
<!-- http://localhost:3030/DigiWord.owl#DS3 -->
<owl:NamedIndividual rdf:about="&DigiWord;DS3">
    <rdf:type rdf:resource="&DigiWord;DigiString"/>
    <stringValue rdf:datatype="&xsd;string"></stringValue>
    <relatedTo rdf:resource="&DigiWord;WS3"/>
</owl:NamedIndividual>
<!-- http://localhost:3030/DigiWord.owl#WS1 -->
<owl:NamedIndividual rdf:about="&DigiWord;WS1">
    <rdf:type rdf:resource="&DigiWord;WordString"/>
    <stringValue rdf:datatype="&xsd;string">One</stringValue>
</owl:NamedIndividual>
<!-- http://localhost:3030/DigiWord.owl#WS2 -->
<owl:NamedIndividual rdf:about="&DigiWord;WS2">
    <rdf:type rdf:resource="&DigiWord;WordString"/>
    <stringValue rdf:datatype="&xsd;string">Two</stringValue>
</owl:NamedIndividual>
<!-- http://localhost:3030/DigiWord.owl#WS3 -->
<owl:NamedIndividual rdf:about="&DigiWord;WS3">
    <rdf:type rdf:resource="&DigiWord;WordString"/>
    <stringValue rdf:datatype="&xsd;string">Three</stringValue>
</owl:NamedIndividual>
</rdf:RDF>

Я хочу получить объект WS1 для DS1, WS2 для DS2, т.е. при предоставлении строк «1», «2» и т. д. мой код должен получить «Один», «Два» соответственно. Я не сталкивался с каким-либо соответствующим кодом этого типа в сети. Буду признателен за любую помощь. Заранее спасибо.


person learner    schedule 15.09.2014    source источник
comment
Не очень понятно, как выглядит ваша онтология. Можете ли вы просто добавить аксиомы в манчестерском или функциональном синтаксисе?   -  person mikrohelen    schedule 16.09.2014
comment
@mikrohelen Сэр, я разместил полную онтологию. Спасибо.   -  person learner    schedule 16.09.2014


Ответы (1)


Следующий пример (OWLAPI 4) должен помочь:

    OWLOntology o = ... your ontology here
    String ns = "http://localhost:3030/DigiWord.owl#";
    OWLDataFactory df = o.getOWLOntologyManager().getOWLDataFactory();
    OWLObjectProperty relatedto = df.getOWLObjectProperty(IRI.create(ns + "relatedTo"));
    OWLDataProperty stringValue = df.getOWLDataProperty(IRI.create(ns + "stringValue"));
    SimpleRenderer renderer = new SimpleRenderer();
    for (OWLNamedIndividual i : o.getIndividualsInSignature()) {
        for (OWLLiteral lit : EntitySearcher.getDataPropertyValues(i, stringValue, o)) {
            System.out.println(i + " has values " + renderer.render(lit));
        }
        for (OWLIndividual related : EntitySearcher.getObjectPropertyValues(i, relatedto, o)) {
            for (OWLLiteral lit : EntitySearcher.getDataPropertyValues(related, stringValue, o)) {
                System.out.println(i + " related to " + related + " which has values " + renderer.render(lit));
            }
        }
    }

Изменить: чтобы найти совпадения для вашего запроса:

    for (OWLNamedIndividual i : o.getIndividualsInSignature()) {
        for (OWLIndividual related : EntitySearcher.getObjectPropertyValues(i, relatedto, o)) {
            for (OWLLiteral lit : EntitySearcher.getDataPropertyValues(related, stringValue, o)) {
                if(lit.getLexicalForm().equals("1")){
                    for (OWLLiteral lit : EntitySearcher.getDataPropertyValues(i, stringValue, o)) {
                        System.out.println(i + " has values " + renderer.render(lit));
                    }
                }
            }
        }
    }
person Ignazio    schedule 16.09.2014
comment
Это печатает все. Моя проблема с доступом к отдельным классам. например, если я ввожу 1 с консоли. приложение должно распечатать один. Это означает, что сначала осуществляется доступ к DS1, поскольку его строковое значение равно 1, затем извлекается WS1, поскольку DS1 связан с WS1, и, наконец, один из них будет напечатан. Пожалуйста, помогите с этим, так как не повезло с документацией и гуглом. Бесконечно благодарен. - person learner; 17.09.2014
comment
вам нужно сопоставить значение литерала с человеком. Под этим я подразумеваю, что вам нужно найти i в моем примере, где lit имеет лексическую форму 1, и получить другие значения для stringValue для этого индивидуума. - person Ignazio; 17.09.2014