> On Tue, Apr 16, 2013 at 5:57 AM, Joshua TAYLOR <[email protected]> > wrote: >> >> On Mon, Apr 15, 2013 at 1:15 PM, aarthi <[email protected]> >> wrote: >> > hi i have two ontology.. consider ont1 and ont2. if both ont1 and ont2 >> > have a class named employee. And ont1's employee class have a sub >> > class named age. but ont2's employee class doesn't have that class. i >> > need to specify a relation that age "is-a" subclass of ont2's employee >> > class. how to do that using jena? anyone help me >> >> I don't know how much sense it makes to talk about "Age" being a >> subclass of "Employee", since ages aren't employees (in any meaningful >> sense that I'm aware of, anyhow). But it's not hard to state that >> ont1's Employees is an equivalent class to ont2's Employee, and >> thereby be able to infer that ont2's Employee has the same subclasses. >> Here's some code that does just that. The output is: >> >> 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.rdf.model.ModelFactory; >> import com.hp.hpl.jena.rdf.model.StmtIterator; >> import com.hp.hpl.jena.util.iterator.ExtendedIterator; >> import com.hp.hpl.jena.vocabulary.OWL; >> import com.hp.hpl.jena.vocabulary.RDFS; >> >> public class MappingOntologies { >> public static void main(String[] args) { >> // In most cases, the ontologies already exist, but since >> we do not have >> // sample data here, we create minimal ontologies that >> have the classes >> // that were mentioned, namely Ont1 that has a class >> Employee with a >> // subclass Age, and Ont2 that has a class Employee. >> >> // Ont1 >> String NS1 = "http://www.example.com/ont1/"; >> OntModel ont1 = ModelFactory.createOntologyModel( >> OntModelSpec.OWL_DL_MEM ); >> OntClass employee1 = ont1.createClass( NS1 + "Employee" >> ); >> OntClass age1 = ont1. createClass( NS1 + "Age" ); >> employee1.addSubClass( age1 ); >> >> // Ont2 >> String NS2 = "http://www.example.com/ont2/"; >> OntModel ont2 = ModelFactory.createOntologyModel( >> OntModelSpec.OWL_DL_MEM ); >> OntClass employee2 = ont2.createClass( NS2 + "Employee" >> ); >> >> // Usually when we merge or map ontologies, we are not >> modifying either >> // ontology, but actually creating some third ontology >> that imports the >> // others, and adding the mapping axioms to that third >> ontology. In OWL >> // we would probably do this using owl:imports, but in >> the >> Jena API we >> // can just create the third model and add the first two >> as submodels. >> >> // Ont3; we make this one an inference model so that we >> can get the >> // inference that employee2 has age1 is a subclass of >> employee2. >> OntModel ont3 = ModelFactory.createOntologyModel( >> OntModelSpec.OWL_DL_MEM_RULE_INF ); >> >> // add the submodels >> ont3.addSubModel( ont1 ); >> ont3.addSubModel( ont2 ); >> >> // assert that employee1 is equivalent to employee2 >> ont3.add( employee1, OWL.equivalentClass, employee2 ); >> >> // To see the subclasses of employee2 in the >> merged/mapped >> ontology, >> // ask for statements of the form [x, rdfs:subClassOf, >> employee2]. Each >> // x is a subclass of employee2. >> StmtIterator axioms = ont3.listStatements( null, >> RDFS.subClassOf, employee2 ); >> System.out.println( "Subclasses of "+employee2 ); >> while ( axioms.hasNext() ) { >> System.out.println( >> "\t"+axioms.next().getSubject() ); >> } >> >> // Alternatively, you could get the employee2 OntClass >> from the merged >> // model and list its subclasses. It is important to >> retrieve the >> // OntClass from the merged model, because that is the >> model that >> // OntClass#listSubClasses will query. >> // >> // Note: when I run this query, I only one less result >> than I do >> // in the previous query. I do not see the (trivial) >> result that >> // employee2 is a subclass of itself. Depending on your >> intended >> // use, this might be a reason to favor the first >> approach. >> OntClass employee32 = ont3.getOntClass( NS2 + "Employee" >> ); >> ExtendedIterator<OntClass> subclasses = >> employee32.listSubClasses(); >> System.out.println( "Subclasses of "+employee32 ); >> while ( subclasses.hasNext() ) { >> System.out.println( "\t"+subclasses.next() ); >> } >> } >> } >> >> This outputs the following. See the comments in the code to explain >> the different results from different query methods. >> >> Subclasses of http://www.example.com/ont2/Employee >> http://www.example.com/ont1/Age >> http://www.example.com/ont1/Employee >> http://www.example.com/ont2/Employee >> Subclasses of http://www.example.com/ont2/Employee >> http://www.example.com/ont1/Age >> http://www.example.com/ont1/Employee
On Tue, Apr 16, 2013 at 9:35 AM, aarthi <[email protected]> wrote: > ya thanks Taylor... is it possible to map without creating a 3rd > ontology? Strictly speaking, we didn't create a third ontology, just a third OntModel (which is not exactly the same thing as a third ontology). Essentially, an ontology is a set of axioms. The mapping between two ontologies is another set of axioms. In general, you'll all the axioms from both ontologies as well as the axioms in the mapping. You're going to need *something* that has all the axioms, and an OntModel is probably what you want there. You could, certainly, add those axioms to one of your existing ontologies, but you'll still need an ontology/OntModel that imports both of the ontologies that you're mapping. If you don't create a third OntModel or ontology that includes the axioms from the other two and the mapping axioms, where could those axioms be stored? //JT -- Joshua Taylor, http://www.cs.rpi.edu/~tayloj/
