Добавление более сложной аксиомы подкласса

Я столкнулся с другой проблемой...

Я хочу добиться чего-то подобного: введите здесь описание изображения

Я хотел сделать это с помощью RDFList, добавив необходимые свойства в список, а затем вызвать метод createUnionClass (или createIntersectionClass) и объединить их вместе. Затем результат этого метода будет добавлен к конкретному ontClass с помощью addSuperClass().

Это неправильно? Я начал с чего-то очень простого, например:

RDFList rdfList = ontModel.createList();
rdfList.addProperty(ExampleResource1);
rdfList.addProperty(ExampleResource2); 
UnionClass uc = ontModel.createUnionClass(null, rdfList);
ExampleClass.addSuperClass(uc);

Но результатом был не союз subClassOf обоих, указанных ранее, а только subClassOf nil.

Любая помощь будет оценена по достоинству.


person Hawk    schedule 13.12.2013    source источник
comment
Очень трудно прочитать текст на вашем изображении. Вы можете опубликовать это в виде текста, пожалуйста? createUnionClass нуждается, что неудивительно, и, как сказано в документации, в списке ресурсов, обозначающих классы объединения. Если Protégé принял показанный вами ввод, то, очевидно, вы определили классы ExampleResource1 и ExampleResource2 (но ресурс предполагает индивидуальность в контексте OWL, так что это плохой выбор имени). uc будет классом ExResource1 or ExResouce2, и вы добавите аксиому ExampleClass subClassOf (ExResource1 or ExResource2). Каков был ваш фактический результат?   -  person Joshua Taylor    schedule 13.12.2013
comment
Я наткнулся на другую проблему..., этот вопрос кажется преследованием предыдущего..   -  person dendini    schedule 13.12.2013


Ответы (1)


Создать это в Jena немного сложно, потому что поддержка ограниченных количественных ограничений является функцией OWL2, а Jena имеет ограниченную поддержку OWL2:

Jena Ontology API

Обратите внимание, что в настоящее время API онтологий Jena имеет лишь ограниченную поддержку квалифицированных ограничений кардинальности OWL2 (т. е. кардинальностиQ, minCardinalityQ и maxCardinalityQ). Квалифицированные ограничения кардинальности инкапсулированы в интерфейсы CardinalityQRestriction, MinCardinalityQRestriction и CardinalityQRestriction. OntModel также предоставляет методы для создания и доступа к квалифицированным ограничениям кардинальности. Поскольку они не являются частью определения языка OWL 1.0, квалифицированные ограничения кардинальности не поддерживаются в онтологиях OWL. Квалифицированные ограничения мощности были добавлены в обновление OWL 2. Со временем будет добавлена ​​поддержка OWL2 в Йене.

Вы также можете увидеть ответ, который я разместил в списке рассылки Jena по аналогичному вопросу, Re: ограничение Owl maxCardinality.

Однако вы можете приблизиться к следующему коду Java. 3. — это код, который мы хотели бы иметь возможность писать, но вместо этого нам приходится использовать 3a.. Вы можете пойти и начать копаться в сериализации RDF и тем самым получить подлинное квалифицированное ограничение. Я показал, как это можно сделать, в связанном вопросе: Как добавить уточненную кардинальность в JENA.

import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.ontology.OntProperty;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.RDFNode;

public class UnionClassExample {
    public static void main(String[] args) throws FileNotFoundException, IOException {
        String NS = "https://stackoverflow.com/q/20561994/1281433/";
        OntModel model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM );
        model.setNsPrefix( "so", NS );

        OntClass a = model.createClass( NS+"A" );
        OntClass b = model.createClass( NS+"B" );
        OntClass c = model.createClass( NS+"C" );

        OntProperty p = model.createObjectProperty( NS+"p" );
        OntProperty q = model.createObjectProperty( NS+"q" );

        // 1. B or C
        OntClass b_or_c = model.createUnionClass( null, model.createList( new RDFNode[] { b, c } ));

        // 2. p only (B or C)
        OntClass p_only_b_or_c = model.createAllValuesFromRestriction( null, p, b_or_c );

        // 3. q exactly 1 C
        // OntClass q_exactly_1_C = model.createCardinalityQRestriction( null, q, 1, c );

        // 3a. q exactly 1
        OntClass q_exactly_1 = model.createCardinalityRestriction( null, q, 1 );

        // (2) and (3a)
        OntClass _2_and_3a = model.createIntersectionClass( null, model.createList( new RDFNode[] { p_only_b_or_c, q_exactly_1 } ));

        // a subClassOf ((p only (B or C)) and (q exactly 1))
        a.addSuperClass( _2_and_3a );

        model.write( System.out, "RDF/XML-ABBREV" );
    }
}

Выход:

<rdf:RDF
    xmlns:so="https://stackoverflow.com/q/20561994/1281433/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <owl:Class rdf:about="https://stackoverflow.com/q/20561994/1281433/A">
    <rdfs:subClassOf>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Restriction>
            <owl:allValuesFrom>
              <owl:Class>
                <owl:unionOf rdf:parseType="Collection">
                  <owl:Class rdf:about="https://stackoverflow.com/q/20561994/1281433/B"/>
                  <owl:Class rdf:about="https://stackoverflow.com/q/20561994/1281433/C"/>
                </owl:unionOf>
              </owl:Class>
            </owl:allValuesFrom>
            <owl:onProperty>
              <owl:ObjectProperty rdf:about="https://stackoverflow.com/q/20561994/1281433/p"/>
            </owl:onProperty>
          </owl:Restriction>
          <owl:Restriction>
            <owl:cardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
            >1</owl:cardinality>
            <owl:onProperty>
              <owl:ObjectProperty rdf:about="https://stackoverflow.com/q/20561994/1281433/q"/>
            </owl:onProperty>
          </owl:Restriction>
        </owl:intersectionOf>
      </owl:Class>
    </rdfs:subClassOf>
  </owl:Class>
</rdf:RDF>

Загружено в Протеже:

введите здесь описание изображения

person Joshua Taylor    schedule 13.12.2013
comment
Большое спасибо, это в значительной степени отвечает на все, что мне нужно было знать... Моя ошибка была в инициализации RDFList. Лучшая документация и некоторые примеры кода очень помогли бы. - person Hawk; 16.12.2013
comment
@Hawk Я думаю, что ваша инициализация RDFList прошла нормально; вы не добавляли к нему элементы правильно. Вы должны были использовать RDFList#add(RDFNode) для добавления элементов (хотя, если они у вас есть заранее, синтаксис массива, который я использовал, тоже может быть довольно удобным ). - person Joshua Taylor; 16.12.2013
comment
@Hawk Хотя, поскольку вы начинаете с пустого RDFList, вы можете использовать RDFList#cons как RDFList list = model.creatList(); list = list.cons(i1); list = list.cons(i2); .... - person Joshua Taylor; 16.12.2013