package org.mindswap.swoop.refactoring; import java.io.File; import java.io.FileWriter; import java.io.StringWriter; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.mindswap.swoop.SwoopModel; import org.mindswap.swoop.utils.owlapi.CorrectedRDFRenderer; import org.semanticweb.owl.model.OWLClass; import org.semanticweb.owl.model.OWLDataProperty; import org.semanticweb.owl.model.OWLDescription; import org.semanticweb.owl.model.OWLDisjointClassesAxiom; import org.semanticweb.owl.model.OWLException; import org.semanticweb.owl.model.OWLIndividual; import org.semanticweb.owl.model.OWLObjectProperty; import org.semanticweb.owl.model.OWLOntology; import org.semanticweb.owl.model.change.AddClassAxiom; import org.semanticweb.owl.model.change.AddDomain; import org.semanticweb.owl.model.change.AddEntity; import org.semanticweb.owl.model.change.AddIndividualClass; import org.semanticweb.owl.model.change.AddObjectPropertyRange; import org.semanticweb.owl.model.change.AddSuperClass; import org.semanticweb.owl.model.change.ChangeVisitor; import org.semanticweb.owl.model.change.OntologyChange; /* * Created on May 10, 2004 */ /** * @author Evren Sirin */ public class TestRefactoring { public static void main(String[] args) { try { run(args); } catch (Throwable e) { System.out.println("********* error **********"); printStackTrace(e); } finally { System.out.println("finished"); } } public static void printStackTrace(Throwable e) { StackTraceElement[] ste = e.getStackTrace(); System.out.println(e); System.out.println("Stack length: " + ste.length); if(ste.length > 100) { for(int i = 0; i < 10; i++) System.out.println(" " + ste[i]); System.out.println(" ..."); for(int i = ste.length - 60; i < ste.length; i++) System.out.println(" " + ste[i]); } else { for(int i = 0; i < ste.length; i++) System.out.println(" " + ste[i]); } } public static void run(String[] args) throws Exception { URI uri = (args.length > 0) ? new URI(args[0]) : //new URI("http://www.cs.man.ac.uk/~horrocks/OWL/Ontologies/tambis-full.owl"); //new URI("http://protege.stanford.edu/plugins/owl/owl-library/koala.owl"); //new URI("http://www.purl.org/net/ontology/beer"); new URI("http://www.mindswap.org/dav/ontologies/sweet.owl"); Map linkExpressivity = new HashMap(); System.out.println("Refactoring " + uri); String EconnExpressivity = "C("; int linkProperties = 0; SwoopModel swoopModel = new SwoopModel(); // swoopModel.setDefaultReasoner(new SwoopToldReasoner()); /* File ontFile1 = null; String fileName1 = "C:/nciOncology.owl"; ontFile1 = new File(fileName1); String filePath = ontFile1.toURI().toString(); URI uri1 = new URI(filePath); //This ontology is the source ontology OWLOntology ontology = swoopModel.addOntology(uri1); */ OWLOntology ontology = swoopModel.addOntology(uri); swoopModel.getReasoner().setOntology(ontology); System.out.println("Number of classes " + ontology.getClasses().size()); System.out.println("Number of Object Properties " + ontology.getObjectProperties().size()); System.out.println("Number of Datatype Properties " + ontology.getDataProperties().size()); System.out.println("Number of Individuals " + ontology.getIndividuals().size()); AutoEconnPartitioning suggestions = new AutoEconnPartitioning(null, swoopModel, ontology, true); linkExpressivity = suggestions.getLinkExpressivity(); // pass applychanges?, debug?, saveToDisk?(all boolean) suggestions.findPartitions( true, false, false, false); System.out.println("Expressivity of the original Ontology " + suggestions.getSourceExpressivity()); String links = ""; if(linkExpressivity.containsKey("Functionality")){ links+="F"; } else{ if(linkExpressivity.containsKey("Cardinality")) links+="N"; } if(linkExpressivity.containsKey("Inverse")) links+="I"; // display class trees for debugging int counting = 1; HashMap modules = new HashMap(); // key - partition hashcode, value - no. of modules for(Iterator i = suggestions.partitions.iterator(); i.hasNext(); ) { OWLOntology partition = (OWLOntology) i.next(); StringWriter st = new StringWriter(); CorrectedRDFRenderer rdfRenderer = new CorrectedRDFRenderer(); rdfRenderer.renderOntology(partition, st); String partitionSource = st.toString(); // save partition to disk if partition size is large String fName = "partitions/"+getPartitionQName(partition.getURI()); FileWriter writer = new FileWriter(new File(fName)); writer.write(partitionSource); writer.close(); } //Recover source ontology with disjoint Statements System.out.println(" Adding disjoint and different-from statements"); OWLOntology sourceModified = addDisjoints(suggestions.partitions,swoopModel.addOntology(uri)); //Save it to disk StringWriter st = new StringWriter(); CorrectedRDFRenderer rdfRenderer = new CorrectedRDFRenderer(); rdfRenderer.renderOntology(sourceModified, st); String partitionSource = st.toString(); // save partition to disk if partition size is large String fName = "partitions/" + "Modified" +getPartitionQName(sourceModified.getURI()); FileWriter writer = new FileWriter(new File(fName)); System.out.println("File " + fName + " saved successfully"); writer.write(partitionSource); writer.close(); } /** This method is for evaluating Pellet wrt Econns * We generate all the explicit disjoint statements * We pass the result of a partitioning as a List of ontologies and the source ontology */ private static OWLOntology addDisjoints(List partitions, OWLOntology source) throws OWLException, URISyntaxException{ List changeList = new ArrayList(); Map tops = new HashMap(); Set topClasses = new HashSet(); int count = 0; OWLClass top; for(Iterator j = partitions.iterator(); j.hasNext();){ count++; OWLOntology partition = (OWLOntology)j.next(); String claStr = "Top" + count; claStr = partition.getLogicalURI()+ "#" + claStr; URI claURI = new URI(claStr); top = partition.getOWLDataFactory().getOWLClass(claURI); tops.put(partition,top); topClasses.add(top); OntologyChange oc = new AddEntity(source,top,null); System.out.println("Adding top class " + top.getURI().toString()); changeList.add(oc); } for(Iterator i = partitions.iterator(); i.hasNext();){ OWLOntology partition = (OWLOntology)i.next(); top = (OWLClass)tops.get(partition); Set classSet = partition.getClasses(); Set indSet = partition.getIndividuals(); //Remove extra classes Set foreign = partition.getForeignEntities().keySet(); classSet.removeAll(foreign); indSet.removeAll(foreign); for(Iterator k = classSet.iterator(); k.hasNext(); ){ OWLClass clazz = (OWLClass)k.next(); OWLClass cl = source.getClass(clazz.getURI()); boolean b = false; if(clazz.getSuperClasses(partition).isEmpty()) b=true; if(!b){ b= true; for(Iterator t= clazz.getSuperClasses(partition).iterator(); t.hasNext(); ){ OWLDescription desc = (OWLDescription)t.next(); if(desc instanceof OWLClass) b=false; } } if(b){ OntologyChange oc2 = new AddSuperClass(source,cl,top,null); changeList.add(oc2); } } for(Iterator t = partition.getObjectProperties().iterator(); t.hasNext(); ){ OWLObjectProperty prop = (OWLObjectProperty)t.next(); OWLObjectProperty p = source.getObjectProperty(prop.getURI()); OntologyChange oc3 = new AddDomain(source,p,top,null); changeList.add(oc3); if(!prop.isLink()){ OntologyChange oc0 = new AddObjectPropertyRange(source,p,top,null); changeList.add(oc0); } else{ URI u = prop.getLinkTarget(); for(Iterator r = tops.keySet().iterator(); r.hasNext();){ OWLOntology o = (OWLOntology)r.next(); if(o.getURI().equals(u)){ OWLClass foreignTop = (OWLClass)tops.get(o); OntologyChange oc0 = new AddObjectPropertyRange(source,p,foreignTop,null); changeList.add(oc0); } } } } for(Iterator y = partition.getDataProperties().iterator(); y.hasNext(); ){ OWLDataProperty prop = (OWLDataProperty)y.next(); OWLDataProperty p = source.getDataProperty(prop.getURI()); OntologyChange oc9 = new AddDomain(source,p,top,null); changeList.add(oc9); } for(Iterator m = indSet.iterator(); m.hasNext(); ){ OWLIndividual ind = (OWLIndividual)m.next(); OWLIndividual indiv = source.getIndividual(ind.getURI()); OntologyChange oc8 = new AddIndividualClass(source,indiv,top,null); changeList.add(oc8); } //Add disjoint axioms between tops OWLDisjointClassesAxiom disAxiom = source.getOWLDataFactory().getOWLDisjointClassesAxiom(topClasses); OntologyChange o = new AddClassAxiom(source,disAxiom,null); changeList.add(o); } for(Iterator h = changeList.iterator(); h.hasNext(); ){ OntologyChange oc = (OntologyChange)h.next(); oc.accept((ChangeVisitor)source); } return source; } private static String getPartitionQName(URI uri) { String uriStr = uri.toString(); return uriStr.substring(uriStr.lastIndexOf("/")+1, uriStr.length()); } }