Как добавить квалифицированную кардинальность в JENA

Как я могу добавить квалифицированное ограничение количества элементов в Йене? Я не могу использовать createCardinalityQRestriction, потому что OntModelSpec предназначен для первой версии OWL, а не OWL2. В createOntologyModel ModelFactory есть способ создать онтологию OWL2? Мне нужно выражение класса, например

ДжеВыследком точно 1 Колик_Фазовый

Я пробовал использовать этот код:

OntModel ontModel = ModelFactory.createOntologyModel();
OntClass ret = ontModel.createCardinalityQRestriction(null, ontProperty, cardinality,    ontClass2 );
ontClass.addSuperClass(ret);

но я получаю это исключение:

com.hp.hpl.jena.ontology.ProfileException: Попытка использовать языковую конструкцию CARDINALITY_Q, которая не поддерживается в текущем языковом профиле: OWL Full


person Michal Joštiak    schedule 13.12.2013    source источник


Ответы (3)


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

Jena Ontology API

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

Кроме того, Javadoc для словаря OWL2 класс говорит:

Словарь OWL2. ПРИМЕЧАНИЕ. Jena не обеспечивает вывод OWL2 или поддержку OntModel. Эти константы предоставлены для удобства пользователей, которые работают с OWL2 с текущей поддержкой OWL1 и нуждаются в подходящем наборе имен.

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

Но вы все равно хотите его создать? Тогда вы один из тех «пользователей, которые используют OWL2, работают с текущей поддержкой OWL1 и нуждаются в подходящем наборе имен». Чтобы узнать, как конструкция OWL2 должна быть сериализована в RDF, нам нужно взглянуть на Сопоставление языка веб-онтологий OWL 2 с RDF-графами (второе издание), особенно раздел 2 Сопоставление структурной спецификации с RDF-графиками, что говорит нам о том, что выражение класса

ObjectExactCardinality( n OPE CE )

сериализуется как следующий набор троек

_:x rdf:type owl:Restriction .
_:x owl:onProperty T(OPE) .
_:x owl:qualifiedCardinality "n"^^xsd:nonNegativeInteger .
_:x owl:onClass T(CE) .

где _:x — это ресурс, являющийся классом. Дело без квалификации, которым уже занимается Йена, превращается

ObjectExactCardinality( n OPE )

в

_:x rdf:type owl:Restriction .
_:x owl:onProperty T(OPE) .
_:x owl:cardinality "n"^^xsd:nonNegativeInteger .

Если бы у нас было одно из последних, мы могли бы заменить его свойство owl:cardinality на свойство owl:qualifiedCardinality и добавить соответствующее свойство owl:onClass. Вот некоторый код Java, который делает именно это:

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.Property;
import com.hp.hpl.jena.vocabulary.OWL;
import com.hp.hpl.jena.vocabulary.OWL2;

public class QualifiedRestrictionExample {
    public static OntClass createCardinalityQRestriction(
            OntModel model,
            String uri,
            Property prop,
            int cardinality, 
            OntClass clas ) {
        OntClass klass = model.createCardinalityRestriction( uri, prop, cardinality );
        klass.removeAll( OWL.cardinality );
        klass.addLiteral( OWL2.qualifiedCardinality, cardinality );
        klass.addProperty( OWL2.onClass, clas );
        return klass;
    }

    public static void main(String[] args) {
        String NS = "https://stackoverflow.com/q/20562107/1281433/";
        OntModel model = ModelFactory.createOntologyModel( OntModelSpec.OWL_DL_MEM );
        OntClass test = model.createClass( NS+"Test" );
        OntProperty j = model.createObjectProperty( NS+"JeVysledkom" );
        OntClass k = model.createClass( NS+"Kolik_Fazovy" );
        OntClass x = createCardinalityQRestriction(model, null, j, 1, k);
        test.addSuperClass( x );
        model.write( System.out, "RDF/XML-ABBREV" );
    }
}

Выход:

<rdf:RDF
    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/20562107/1281433/Kolik_Fazovy"/>
  <owl:Class rdf:about="https://stackoverflow.com/q/20562107/1281433/Test">
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:onClass rdf:resource="https://stackoverflow.com/q/20562107/1281433/Kolik_Fazovy"/>
        <owl:qualifiedCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#long"
        >1</owl:qualifiedCardinality>
        <owl:onProperty>
          <owl:ObjectProperty rdf:about="https://stackoverflow.com/q/20562107/1281433/JeVysledkom"/>
        </owl:onProperty>
      </owl:Restriction>
    </rdfs:subClassOf>
  </owl:Class>
</rdf:RDF>

В Протеже:

аксиома подкласса в Protege

person Joshua Taylor    schedule 13.12.2013
comment
Привет. Благодарю за ваш ответ. Ваш код (образец) работает отлично, но в моей онтологии он не работает. - person Michal Joštiak; 16.12.2013
comment
Привет. Благодарю за ваш ответ. Ваш код (образец) работает отлично, но в моей онтологии он не работает. OWL выглядит одинаково в обоих случаях, но в моей онтологии (с большим количеством классов, OP, ...) это выглядит так: oi39.tinypic.com/zoc7ti.jpg - person Michal Joštiak; 16.12.2013
comment
Привет. Проблема решена. Я использовал createOntProperty вместо createObjectProperty. Спасибо еще раз. - person Michal Joštiak; 16.12.2013

    private void createOneToMany(OntModel ontoModel, OntClass ontoClass, OntProperty prop, Resource resource) {
        OntClass allValuesFromRestriction = ontoModel.createAllValuesFromRestriction(null, prop, resource);
        ontoClass.addSuperClass(allValuesFromRestriction);

        OntClass minCardinalityRestriction = ontoModel.createMinCardinalityRestriction(null, prop, 1);
        ontoClass.addSuperClass(minCardinalityRestriction);
    }

    private void createZeroToMany(OntModel ontoModel, OntClass ontoClass, OntProperty prop, Resource resource) {
        OntClass allValuesFromRestriction = ontoModel.createAllValuesFromRestriction(null, prop, resource);
        ontoClass.addSuperClass(allValuesFromRestriction);

        OntClass minCardinalityRestriction = ontoModel.createMinCardinalityRestriction(null, prop, 0);
        ontoClass.addSuperClass(minCardinalityRestriction);
    }

    private void createZeroToOne(OntModel ontoModel, OntClass ontoClass1, OntProperty prop, OntClass ontoClass2) {

        OntClass minCardinalityRestriction = ontoModel.createMinCardinalityRestriction(null, prop, 0);
        ontoClass1.addSuperClass(minCardinalityRestriction);

        OntClass maxCardinalityRestriction = ontoModel.createMaxCardinalityRestriction(null, prop, 1);
        ontoClass1.addSuperClass(maxCardinalityRestriction);
    }

    private void createOneToOne(OntModel ontoModel, OntClass ontoClass1, OntProperty prop, OntClass ontoClass2) {
        OntClass minCardinalityRestriction = ontoModel.createMinCardinalityRestriction(null, prop, 1);
        ontoClass1.addSuperClass(minCardinalityRestriction);

        OntClass maxCardinalityRestriction = ontoModel.createMaxCardinalityRestriction(null, prop, 1);
        ontoClass1.addSuperClass(maxCardinalityRestriction);
    }

Тогда вы можете просто сделать:

OntModel ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
OntClass task = ontModel.createClass(OWL.NS + "Task");
OntClass actor = ontModel.createClass(OWL.NS + "Actor");
OntProperty propTask = ontModel.createObjectProperty( OWL.NS + "Task-performedBy-Actor");
OntProperty propActor = ontModel.createObjectProperty( OWL.NS + "Actor-performs-Task");

Звонить:

   createOneToMany(ontModel, task, prop, actor);
   createZeroToMany(ontModel, task, prop, actor);
   createOneToOne(ontModel, task, propTask, actor);
   createZeroToOne(ontModel, actor, propActor, task);

Образец результата:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#">
  <owl:Class rdf:about="http://www.w3.org/2002/07/owl#Task">
    <rdfs:subClassOf>
      <owl:Restriction rdf:nodeID="A0">
        <owl:minCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
        >1</owl:minCardinality>
        <owl:onProperty>
          <owl:ObjectProperty rdf:about="http://www.w3.org/2002/07/owl#Actor-performs-Task"/>
        </owl:onProperty>
      </owl:Restriction>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:Class rdf:about="http://www.w3.org/2002/07/owl#Actor">
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:maxCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
        >1</owl:maxCardinality>
        <owl:onProperty rdf:resource="http://www.w3.org/2002/07/owl#Actor-performs-Task"/>
      </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf rdf:nodeID="A0"/>
  </owl:Class>
  <owl:ObjectProperty rdf:about="http://www.w3.org/2002/07/owl#Task-performedBy-Actor"/>
</rdf:RDF>
person Svitlana    schedule 24.04.2017

Теперь есть также ONT-API, расширение Jena для OWL2:

    String ns = "https://stackoverflow.com/q/20562107/1281433/";
    OntModel model = OntModelFactory.createModel()
            .setNsPrefixes(OntModelFactory.STANDARD)
            .setNsPrefix("test", ns);

    OntClass c = model.createOntClass(ns + "Kolik_Fazovy");
    OntObjectProperty p = model.createObjectProperty(ns + "JeVysledkom");
    model.createOntClass(ns + "Test").addSuperClass(model.createObjectCardinality(p, 1, c));

    // list all class expressions (2 owl classes, 1 restriction):
    Assert.assertEquals(3, model.ontObjects(OntClass.class).count());
    // print model
    model.write(System.out, "ttl");

Выход:

@prefix test:  <https://stackoverflow.com/q/20562107/1281433/> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .

test:Kolik_Fazovy  a  owl:Class .

test:JeVysledkom  a  owl:ObjectProperty .

test:Test  a             owl:Class ;
        rdfs:subClassOf  [ a                         owl:Restriction ;
                           owl:onClass               test:Kolik_Fazovy ;
                           owl:onProperty            test:JeVysledkom ;
                           owl:qualifiedCardinality  "1"^^xsd:nonNegativeInteger
                         ] .
person ssz    schedule 05.09.2018