ya thanks Taylor...  is it possible to map without creating a 3rd ontology?


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
>
> Hope this helps,
> //JT
> --
> Joshua Taylor, http://www.cs.rpi.edu/~tayloj/
>

Reply via email to