como associar um recurso a outro usando a API do Jena

Eu criei uma ontologia contendo duas classs, a primeira delas é chamada de Father e a segunda é uma subclass chamada Son . Eu gostaria de definir as seguintes condições para o pai de class usando Jena

Tem apenas filho.
Tem algum filho.

Então eu faria o mesmo para a aula Son :

tem exatamente algum pai.

Minha segunda questão é que eu não sei como associar a instância da class Son à class Father usando também Jena. Eu sei que é possível manipular minhas aulas usando Protégé, mas eu quero explorar Jena.

As coisas que você está tentando fazer não são muito difíceis em Jena, mas parece que há alguma confusão sobre o OWL. Dadas duas classs B e C , se B é subclass de C , isso significa que todo é B também é um C. Então, enquanto é verdade que

(1) pai subclass de filho

já que todo pai é filho de outra pessoa, não é verdade que

(2) subclass do filho do pai

já que nem todo filho é pai. As restrições que você descreveu também não fazem muito sentido. Uma restrição de cardinalidade pode ser usada para afirmar que cada instância de uma class está relacionada a exatamente (ou pelo menos, ou no máximo) algum número de instâncias de outra class por alguma propriedade particular. Assim, você provavelmente diria que

(3) subclass de Filho (tem o Pai exatamente 1 Pai)

afirmar que cada instância do Filho está relacionada com exatamente um exemplo do Pai. Você também pode dizer que cada pai deve ter pelo menos pelo menos um filho (e eu usaria criança aqui, ao invés de filho, uma vez que uma criança também poderia ser uma filha) por

(4) pai subClassOf (hasChild alguma criança)

mas se você está apenas modelando pessoas do sexo masculino, eu acho que você poderia dizer

(5) pai subclass de (tem algum filho)

ou

(6) pai subclassOf (hasSon min 1 Filho)

Vamos criar um OntModel que inclua as classs Filho e Pai e os axiomas (1), (3) e (5). Em seguida, adicionaremos uma instância de Father, Abraham Lincoln e uma instância de Son, RobertToddLincoln e os relacionamentos apropriados entre eles:

(7) RobertToddLincoln tem o pai Abraham Lincoln
(8) Abraham Lincoln tem Sons RobertToddLincoln

Agora, vamos nos deparar com um problema imediatamente: as restrições quantificadas de cardinalidade fazem parte do OWL2, mas não do OWL1, e o Jena ainda não suporta o OWL2. Felizmente, neste caso, podemos contornar isso, mas dizendo que os Filhos só têm pais como pais e que os Filhos têm exatamente um pai:

(3’a) Filho subClassOf (tem Pai apenas Pai)
(3’b) Filho subClassOf (hasFather exactamente 1)

O código que você acaba com é:

 import com.hp.hpl.jena.ontology.Individual; 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; public class FatherSonOntology { public static void main(String[] args) { final String ns = "http://example.org/"; final OntModel model = ModelFactory.createOntologyModel( OntModelSpec.OWL_DL_MEM ); model.setNsPrefix( "ex", ns ); final OntClass son = model.createClass( ns+"Son" ); final OntClass father = model.createClass( ns+"Father" ); final OntProperty hasFather = model.createObjectProperty( ns+"hasFather" ); final OntProperty hasSon = model.createObjectProperty( ns+"hasSon" ); // (1) Father subClassOf Son son.addSubClass( father ); // (3'a) Son subClassOf (hasFather only Father) son.addSubClass( model.createAllValuesFromRestriction( null, hasFather, father )); // (3'b) Son subClassOf (hasFather exactly 1) son.addSubClass( model.createCardinalityRestriction( null, hasFather, 1 )); // (5) Father subClassOf (hasSon min 1 Son) father.addSubClass( model.createSomeValuesFromRestriction( null, hasSon, son )); // You can create individuals of a given type using Individual#createIndividual, // or with Model#createIndividual. final Individual abe = father.createIndividual( ns+"AbrahamLincoln" ); final Individual rob = model.createIndividual( ns+"RobertToddLincoln", son ); // You can add properties to individuals using Individual#addProperty, or you can // use the various Model#add methods to add statements to the model. rob.addProperty( hasFather, abe ); // (7) model.add( abe, hasSon, rob ); // (8) model.write( System.out, "RDF/XML-ABBREV" ); } } 

que imprime a ontologia no final (que você pode salvar e abrir no Protégé para verificar se tudo aparece como esperado):

                     1           
Intereting Posts