Добавление более сложной аксиомы подкласса
Я наткнулся на другую проблему...
Я хочу добиться чего-то похожего на это:
Я хотел сделать это с помощью RDFList, добавив необходимые свойства в список, а затем вызвать метод createUnionClass (или createIntersectionClass) и объединить его вместе. Затем результат этого метода будет добавлен в определенный ontClass с помощью addSuperClass().
Это неправильно? Я начал с чего-то действительно простого, например:
RDFList rdfList = ontModel.createList();
rdfList.addProperty(ExampleResource1);
rdfList.addProperty(ExampleResource2);
UnionClass uc = ontModel.createUnionClass(null, rdfList);
ExampleClass.addSuperClass(uc);
Но результатом был не подкласс объединения обоих указанных ранее, а только подкласс nil.
Любая помощь будет оценена.
1 ответ
Создать его в Jena немного сложно, потому что поддержка ограничений по количеству кардинальных чисел является функцией OWL2, а Jena имеет ограниченную поддержку OWL2:
Jena Ontology API
Обратите внимание, что в настоящее время API-интерфейс Jena для онтологий имеет ограниченную поддержку ограниченных ограничений мощности в OWL2 (то есть cardinalityQ, 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://stackru.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://stackru.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://stackru.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://stackru.com/q/20561994/1281433/B"/>
<owl:Class rdf:about="https://stackru.com/q/20561994/1281433/C"/>
</owl:unionOf>
</owl:Class>
</owl:allValuesFrom>
<owl:onProperty>
<owl:ObjectProperty rdf:about="https://stackru.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://stackru.com/q/20561994/1281433/q"/>
</owl:onProperty>
</owl:Restriction>
</owl:intersectionOf>
</owl:Class>
</rdfs:subClassOf>
</owl:Class>
</rdf:RDF>
Загружен в Protégé: