Как добавить квалифицированный кардинал в JENA

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

JeVysledkom ровно 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

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://stackru.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://stackru.com/q/20562107/1281433/Kolik_Fazovy"/>
  <owl:Class rdf:about="https://stackru.com/q/20562107/1281433/Test">
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:onClass rdf:resource="https://stackru.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://stackru.com/q/20562107/1281433/JeVysledkom"/>
        </owl:onProperty>
      </owl:Restriction>
    </rdfs:subClassOf>
  </owl:Class>
</rdf:RDF>

В протеже:

аксиома подкласса в протеже

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

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

        OntClass c = model.createOntEntity(OntClass.class, ns + "Kolik_Fazovy");
        OntNOP p = model.createOntEntity(OntNOP.class, ns + "JeVysledkom");
        model.createOntEntity(OntClass.class, ns + "Test")
                .addSubClassOf(model.createObjectCardinality(p, 1, c));

        model.write(System.out, "ttl");
    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>
Другие вопросы по тегам