На самом деле я только что столкнулся с этим, решая другой вопрос: Добавление более сложной аксиомы подкласса. Создать это в Jena немного сложно, потому что поддержка ограниченных количественных ограничений является функцией OWL2, а Jena имеет ограниченную поддержку OWL2:
Обратите внимание, что в настоящее время 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>
В Протеже:
person
Joshua Taylor
schedule
13.12.2013