/* Copyright 2008, 2009, 2010 by the Oxford University Computing Laboratory This file is part of HermiT. HermiT is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. HermiT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with HermiT. If not, see <http://www.gnu.org/licenses/>. */ package org.semanticweb.HermiT.hierarchy; import java.io.PrintWriter; import java.util.Comparator; import java.util.SortedSet; import java.util.TreeSet; import org.semanticweb.HermiT.model.AtomicConcept; import org.semanticweb.HermiT.model.AtomicRole; import org.semanticweb.HermiT.model.InverseRole; import org.semanticweb.HermiT.model.Role; public class HierarchyDumperFSS { protected final PrintWriter m_out; public HierarchyDumperFSS(PrintWriter out) { m_out=out; } public void printAtomicConceptHierarchy(Hierarchy<AtomicConcept> atomicConceptHierarchy) { for (HierarchyNode<AtomicConcept> node : atomicConceptHierarchy.getAllNodesSet()) { SortedSet<AtomicConcept> equivs=new TreeSet<AtomicConcept>(AtomicConceptComparator.INSTANCE); equivs.addAll(node.getEquivalentElements()); AtomicConcept representative=equivs.first(); if (equivs.size()>1) { boolean first=true; for (AtomicConcept equiv : equivs) { if (first) { m_out.print("EquivalentClasses( <"); m_out.print(representative.getIRI()); m_out.print(">"); first=false; } else { m_out.print(" <"); m_out.print(equiv.getIRI()); m_out.print(">"); } } m_out.print(" )"); m_out.println(); } if (!representative.equals(AtomicConcept.THING)) { for (HierarchyNode<AtomicConcept> sub : node.getChildNodes()) { AtomicConcept subRepresentative=sub.getRepresentative(); if (!subRepresentative.equals(AtomicConcept.NOTHING)) { m_out.print("SubClassOf( <"); m_out.print(subRepresentative.getIRI()); m_out.print("> <"); m_out.print(representative.getIRI()); m_out.print("> )"); m_out.println(); } } } } m_out.println(); } public void printObjectPropertyHierarchy(Hierarchy<Role> objectRoleHierarchy) { for (HierarchyNode<Role> node : objectRoleHierarchy.getAllNodesSet()) { SortedSet<Role> equivs=new TreeSet<Role>(ObjectRoleComparator.INSTANCE); equivs.addAll(node.getEquivalentElements()); Role representative=equivs.first(); if (equivs.size()>1) { boolean first=true; for (Role equiv : equivs) { if (first) { m_out.print("EquivalentObjectProperties( "); print(representative); first=false; } else { m_out.print(" "); print(equiv); } } m_out.print(" )"); m_out.println(); } if (!representative.equals(AtomicRole.TOP_OBJECT_ROLE)) { for (HierarchyNode<Role> sub : node.getChildNodes()) { Role subRepresentative=sub.getRepresentative(); if (!subRepresentative.equals(AtomicRole.BOTTOM_OBJECT_ROLE)) { m_out.print("SubObjectPropertyOf( "); print(subRepresentative); m_out.print(" "); print(representative); m_out.print(" )"); m_out.println(); } } } } m_out.println(); } public void printDataPropertyHierarchy(Hierarchy<AtomicRole> dataRoleHierarchy) { for (HierarchyNode<AtomicRole> node : dataRoleHierarchy.getAllNodesSet()) { SortedSet<AtomicRole> equivs=new TreeSet<AtomicRole>(DataRoleComparator.INSTANCE); equivs.addAll(node.getEquivalentElements()); AtomicRole representative=equivs.first(); if (equivs.size()>1) { boolean first=true; for (AtomicRole equiv : equivs) { if (first) { m_out.print("EquivalentDataProperties( <"); m_out.print(representative.getIRI()); m_out.print(">"); first=false; } else { m_out.print(" >"); m_out.print(equiv.getIRI()); m_out.print(">"); } } m_out.print(" )"); m_out.println(); } if (!representative.equals(AtomicRole.TOP_DATA_ROLE)) { for (HierarchyNode<AtomicRole> sub : node.getChildNodes()) { AtomicRole subRepresentative=sub.getRepresentative(); if (!subRepresentative.equals(AtomicRole.BOTTOM_DATA_ROLE)) { m_out.print("SubDataPropertyOf( <"); m_out.print(subRepresentative.getIRI()); m_out.print("> <"); m_out.print(representative.getIRI()); m_out.print("> )"); m_out.println(); } } } } m_out.println(); } protected void print(Role role) { if (role instanceof AtomicRole) print((AtomicRole)role); else { m_out.print("ObjectInverseOf( "); print(((InverseRole)role).getInverseOf()); m_out.print(" )"); } } protected void print(AtomicRole atomicRole) { m_out.print("<"); m_out.print(atomicRole.getIRI()); m_out.print(">"); } protected static class AtomicConceptComparator implements Comparator<AtomicConcept> { public static final AtomicConceptComparator INSTANCE=new AtomicConceptComparator(); public int compare(AtomicConcept atomicConcept1,AtomicConcept atomicConcept2) { int comparison=getAtomicConceptClass(atomicConcept1)-getAtomicConceptClass(atomicConcept2); if (comparison!=0) return comparison; return atomicConcept1.getIRI().compareTo(atomicConcept2.getIRI()); } protected int getAtomicConceptClass(AtomicConcept atomicConcept) { if (AtomicConcept.NOTHING.equals(atomicConcept)) return 0; else if (AtomicConcept.THING.equals(atomicConcept)) return 1; else return 2; } } protected static class ObjectRoleComparator implements Comparator<Role> { public static final ObjectRoleComparator INSTANCE=new ObjectRoleComparator(); public int compare(Role role1,Role role2) { int comparison=getRoleClass(role1)-getRoleClass(role2); if (comparison!=0) return comparison; comparison=getRoleDirection(role1)-getRoleDirection(role2); if (comparison!=0) return comparison; return getInnerAtomicRole(role1).getIRI().compareTo(getInnerAtomicRole(role2).getIRI()); } protected int getRoleClass(Role role) { if (AtomicRole.BOTTOM_OBJECT_ROLE.equals(role)) return 0; else if (AtomicRole.TOP_OBJECT_ROLE.equals(role)) return 1; else return 2; } protected AtomicRole getInnerAtomicRole(Role role) { if (role instanceof AtomicRole) return (AtomicRole)role; else return ((InverseRole)role).getInverseOf(); } protected int getRoleDirection(Role role) { return role instanceof AtomicRole ? 0 : 1; } } protected static class DataRoleComparator implements Comparator<AtomicRole> { public static final DataRoleComparator INSTANCE=new DataRoleComparator(); public int compare(AtomicRole atomicRole1,AtomicRole atomicRole2) { int comparison=getAtomicRoleClass(atomicRole1)-getAtomicRoleClass(atomicRole2); if (comparison!=0) return comparison; return atomicRole1.getIRI().compareTo(atomicRole2.getIRI()); } protected int getAtomicRoleClass(AtomicRole atomicRole) { if (AtomicRole.BOTTOM_DATA_ROLE.equals(atomicRole)) return 0; else if (AtomicRole.TOP_DATA_ROLE.equals(atomicRole)) return 1; else return 2; } } }