On Mon, Apr 15, 2013 at 1:15 PM, aarthi <aarthirajara...@gmail.com> 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

Hope this helps,
//JT
--
Joshua Taylor, http://www.cs.rpi.edu/~tayloj/

Reply via email to