Как добавить квалифицированный кардинал в 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>