Как получить эквивалентный класс Dataype в OWL API?

В OWL API я не могу найти способ получить эквивалентный класс для типа данных, который определяет перечисление допустимых значений. Когда у меня есть OWLDatatype, как мне получить набор допустимых значений?

[Я пробовал вставить сюда RDF / XML как блок кода, но это не сработало. Я даже посмотрел справку по уценке. Подскажите, пожалуйста, как это сделать.]

Онтология использует следующую конструкцию:

  • rdfs:Datatype
    • owl:equivalentClass
      • rdfs:Datatype
        • owl:oneOf
          • rdf:Description
            • rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#List"

person Jim L.    schedule 10.03.2015    source источник
comment
Вы имеете в виду, что для каждого объекта DataProperty необходимо получить DataType? Потому что набор допустимых значений определяется в домене и диапазонах свойств данных.   -  person Artemis    schedule 11.03.2015
comment
Я хочу знать, является ли OWLDatatype перечислением значений, и если это так, я хочу что-то сделать с этими значениями.   -  person Jim L.    schedule 11.03.2015
comment
Могу я получить вашу онтологию?   -  person Artemis    schedule 11.03.2015
comment
У меня нет разрешения поделиться им, поэтому мне придется его вычистить. Это примерно похоже на маркированный список в вопросе. Ключ - owl:equivalentClass и owl:oneOf с необычным способом RDF перечисления значений.   -  person Jim L.    schedule 11.03.2015
comment
Проблема в том, что я не уверен, как вы определяете эквивалентные классы для типов данных. Я попробовал, посмотрите, что вы думаете.   -  person Artemis    schedule 11.03.2015


Ответы (2)


Если вы правильно поняли, у вас есть определенный класс «c», который был определен как эквивалент одного из многих людей, тогда я думаю, что это один из способов получить эти «допустимые значения»:

    Set<OWLClassAxiom> allAx=localOntology.getAxioms(c);
    for(OWLClassAxiom ax: allAx){
        if(ax.getAxiomType()==AxiomType.EQUIVALENT_CLASSES)
            for(OWLClassExpression nce :ax.getNestedClassExpressions())
                if(nce.getClassExpressionType()==ClassExpressionType.OBJECT_ONE_OF)
                    for(OWLNamedIndividual temp: nce.getIndividualsInSignature())
                        System.out.println(temp);
    }
person Artemis    schedule 10.03.2015
comment
Собственно, это не решает проблемы. Чтобы познакомиться с конструкциями OWL API, я создал пронумерованный OWLDatatype. Это включало использование OWLDataOneOf, OWLDatatype и OWLDatatypeDefinitionAxiom. - person Jim L.; 11.03.2015
comment
Вы должны опубликовать свое решение. Это может быть полезно для других, и я бы тоже не прочь его увидеть! - person Artemis; 11.03.2015
comment
Хорошо, мне пришлось немного поиграться в отладчике, но я думаю, что разобрался. Я выложил свое решение. - person Jim L.; 11.03.2015

Вот что я придумал:

    for (OWLDatatype dt : o.getDatatypesInSignature(Imports.INCLUDED)) {
        logger.info("found datatype {} labeled '{}'", dt, getOWLEntityLabel(dt));
        Set<OWLDatatypeDefinitionAxiom> datatypeDefinitions = o.getDatatypeDefinitions(dt);
        for (OWLDatatypeDefinitionAxiom definitionAxiom : datatypeDefinitions) {
            logger.info("found datatype definition '{}'", definitionAxiom);
            OWLDataRange dataRange = definitionAxiom.getDataRange();
            if ( ! dataRange.isDatatype()) {
                logger.info("looks like an enumeration");
                OWLDataOneOf owlDataOneOf = (OWLDataOneOf) dataRange;
                Set<OWLLiteral> values = owlDataOneOf.getValues();
                for (OWLLiteral value : values) {
                    logger.info("Found literal value '{}'", value.getLiteral());
                }
            }
        }
    }

Мне действительно не нравится состав OWLDataOneOf. Должен быть способ получше.

person Jim L.    schedule 11.03.2015