001/** 002 * Copyright (C) 2007 - 2016, Jens Lehmann 003 * 004 * This file is part of DL-Learner. 005 * 006 * DL-Learner is free software; you can redistribute it and/or modify 007 * it under the terms of the GNU General Public License as published by 008 * the Free Software Foundation; either version 3 of the License, or 009 * (at your option) any later version. 010 * 011 * DL-Learner is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 014 * GNU General Public License for more details. 015 * 016 * You should have received a copy of the GNU General Public License 017 * along with this program. If not, see <http://www.gnu.org/licenses/>. 018 */ 019package org.dllearner.algorithms.pattern; 020 021import com.google.common.collect.Sets; 022import org.semanticweb.owlapi.model.*; 023 024import java.util.*; 025 026public class OWLAxiomRenamer implements OWLAxiomVisitor { 027 028 private OWLDataFactory df; 029 private OWLClassExpressionRenamer expressionRenamer; 030 private OWLAxiom renamedAxiom; 031 032 private boolean normalizeABoxAxioms = true; 033 private boolean ignoreTrivialAxioms = true;//ignore Thing(a),SubClassOf(A,Thing),SubPropertyOf(A,TopProperty) 034 035 public OWLAxiomRenamer(OWLDataFactory df) { 036 this.df = df; 037 } 038 039 public OWLAxiom rename(OWLAxiom axiom){ 040 Map<OWLEntity, OWLEntity> renaming = new HashMap<>(); 041 expressionRenamer = new OWLClassExpressionRenamer(df, renaming); 042 boolean multipleClasses = axiom.getClassesInSignature().size() > 1; 043 expressionRenamer.setMultipleClasses(multipleClasses); 044 axiom.accept(this); 045 return renamedAxiom; 046 } 047 048 @Override 049 public void visit(OWLSubClassOfAxiom axiom) { 050 OWLClassExpression subClass = axiom.getSubClass(); 051 subClass = expressionRenamer.rename(subClass); 052 OWLClassExpression superClass = axiom.getSuperClass(); 053 superClass = expressionRenamer.rename(superClass); 054 renamedAxiom = df.getOWLSubClassOfAxiom(subClass, superClass); 055 } 056 057 @Override 058 public void visit(OWLNegativeObjectPropertyAssertionAxiom axiom) { 059 OWLObjectPropertyExpression property = axiom.getProperty(); 060 property = expressionRenamer.rename(property); 061 OWLIndividual subject = axiom.getSubject(); 062 subject = expressionRenamer.rename(subject); 063 OWLIndividual object = axiom.getObject(); 064 object = expressionRenamer.rename(object); 065 renamedAxiom = df.getOWLNegativeObjectPropertyAssertionAxiom(property, subject, object); 066 } 067 068 @Override 069 public void visit(OWLAsymmetricObjectPropertyAxiom axiom) { 070 OWLObjectPropertyExpression property = axiom.getProperty(); 071 property = expressionRenamer.rename(property); 072 renamedAxiom = df.getOWLAsymmetricObjectPropertyAxiom(property); 073 } 074 075 @Override 076 public void visit(OWLReflexiveObjectPropertyAxiom axiom) { 077 OWLObjectPropertyExpression property = axiom.getProperty(); 078 property = expressionRenamer.rename(property); 079 renamedAxiom = df.getOWLReflexiveObjectPropertyAxiom(property); 080 } 081 082 @Override 083 public void visit(OWLDisjointClassesAxiom axiom) { 084 Set<OWLClassExpression> classExpressions = axiom.getClassExpressions(); 085 Set<OWLClassExpression> renamedClassExpressions = new HashSet<>(); 086 for (OWLClassExpression classExpression : classExpressions) { 087 renamedClassExpressions.add(expressionRenamer.rename(classExpression)); 088 } 089 renamedClassExpressions = Sets.newHashSet(df.getOWLClass(IRI.create(PatternConstants.NS + "A_1")), PatternConstants.CLASS_SET); 090 renamedAxiom = df.getOWLDisjointClassesAxiom(renamedClassExpressions); 091 } 092 093 @Override 094 public void visit(OWLDataPropertyDomainAxiom axiom) { 095 OWLDataPropertyExpression property = axiom.getProperty(); 096 property = expressionRenamer.rename(property); 097 OWLClassExpression domain = axiom.getDomain(); 098 domain = expressionRenamer.rename(domain); 099 renamedAxiom = df.getOWLDataPropertyDomainAxiom(property, domain); 100 } 101 102 @Override 103 public void visit(OWLObjectPropertyDomainAxiom axiom) { 104 OWLObjectPropertyExpression property = axiom.getProperty(); 105 property = expressionRenamer.rename(property); 106 OWLClassExpression domain = axiom.getDomain(); 107 domain = expressionRenamer.rename(domain); 108 renamedAxiom = df.getOWLObjectPropertyDomainAxiom(property, domain); 109 } 110 111 @Override 112 public void visit(OWLEquivalentObjectPropertiesAxiom axiom) { 113 Set<OWLObjectPropertyExpression> properties = axiom.getProperties(); 114 Set<OWLObjectPropertyExpression> renamedProperties = new HashSet<>(); 115 for (OWLObjectPropertyExpression property : properties) { 116 renamedProperties.add(expressionRenamer.rename(property)); 117 } 118 renamedAxiom = df.getOWLEquivalentObjectPropertiesAxiom(renamedProperties); 119 } 120 121 @Override 122 public void visit(OWLNegativeDataPropertyAssertionAxiom axiom) { 123 OWLDataPropertyExpression property = axiom.getProperty(); 124 property = expressionRenamer.rename(property); 125 OWLIndividual subject = axiom.getSubject(); 126 subject = expressionRenamer.rename(subject); 127 OWLLiteral object = axiom.getObject(); 128 object = expressionRenamer.rename(object); 129 renamedAxiom = df.getOWLNegativeDataPropertyAssertionAxiom(property, subject, object); 130 } 131 132 @Override 133 public void visit(OWLDifferentIndividualsAxiom axiom) { 134 Set<OWLIndividual> renamedIndividuals = new HashSet<>(); 135 if(normalizeABoxAxioms){ 136 renamedIndividuals.add(df.getOWLNamedIndividual(IRI.create("http://dl-learner.org/pattern/a"))); 137 renamedIndividuals.add(df.getOWLNamedIndividual(IRI.create("http://dl-learner.org/pattern/b"))); 138 } else { 139 for(OWLIndividual ind : axiom.getIndividuals()){ 140 renamedIndividuals.add(expressionRenamer.rename(ind)); 141 } 142 } 143 renamedAxiom = df.getOWLDifferentIndividualsAxiom(renamedIndividuals); 144 } 145 146 @Override 147 public void visit(OWLDisjointDataPropertiesAxiom axiom) { 148 Set<OWLDataPropertyExpression> properties = axiom.getProperties(); 149 Set<OWLDataPropertyExpression> renamedProperties = new HashSet<>(); 150 for (OWLDataPropertyExpression property : properties) { 151 renamedProperties.add(expressionRenamer.rename(property)); 152 } 153 renamedAxiom = df.getOWLDisjointDataPropertiesAxiom(renamedProperties); 154 } 155 156 @Override 157 public void visit(OWLDisjointObjectPropertiesAxiom axiom) { 158 Set<OWLObjectPropertyExpression> properties = axiom.getProperties(); 159 Set<OWLObjectPropertyExpression> renamedProperties = new HashSet<>(); 160 for (OWLObjectPropertyExpression property : properties) { 161 renamedProperties.add(expressionRenamer.rename(property)); 162 } 163 renamedAxiom = df.getOWLDisjointObjectPropertiesAxiom(renamedProperties); 164 } 165 166 @Override 167 public void visit(OWLObjectPropertyRangeAxiom axiom) { 168 OWLObjectPropertyExpression property = axiom.getProperty(); 169 property = expressionRenamer.rename(property); 170 OWLClassExpression range = axiom.getRange(); 171 range = expressionRenamer.rename(range); 172 renamedAxiom = df.getOWLObjectPropertyDomainAxiom(property, range); 173 } 174 175 @Override 176 public void visit(OWLObjectPropertyAssertionAxiom axiom) { 177 OWLObjectPropertyExpression property = axiom.getProperty(); 178 property = expressionRenamer.rename(property); 179 OWLIndividual subject = axiom.getSubject(); 180 subject = expressionRenamer.rename(subject); 181 OWLIndividual object = axiom.getObject(); 182 object = expressionRenamer.rename(object); 183 renamedAxiom = df.getOWLObjectPropertyAssertionAxiom(property, subject, object); 184 } 185 186 @Override 187 public void visit(OWLFunctionalObjectPropertyAxiom axiom) { 188 OWLObjectPropertyExpression property = axiom.getProperty(); 189 property = expressionRenamer.rename(property); 190 renamedAxiom = df.getOWLFunctionalObjectPropertyAxiom(property); 191 } 192 193 @Override 194 public void visit(OWLSubObjectPropertyOfAxiom axiom) { 195 OWLObjectPropertyExpression subProperty = axiom.getSubProperty(); 196 subProperty = expressionRenamer.rename(subProperty); 197 OWLObjectPropertyExpression superProperty = axiom.getSuperProperty(); 198 superProperty = expressionRenamer.rename(superProperty); 199 renamedAxiom = df.getOWLSubObjectPropertyOfAxiom(subProperty, superProperty); 200 } 201 202 @Override 203 public void visit(OWLDisjointUnionAxiom axiom) { 204 OWLClass cls = axiom.getOWLClass(); 205 cls = expressionRenamer.rename(cls).asOWLClass(); 206 Set<OWLClassExpression> classExpressions = axiom.getClassExpressions(); 207 Set<OWLClassExpression> renamedClassExpressions = new HashSet<>(); 208 for (OWLClassExpression classExpression : classExpressions) { 209 renamedClassExpressions.add(expressionRenamer.rename(classExpression)); 210 } 211 renamedAxiom = df.getOWLDisjointUnionAxiom(cls, renamedClassExpressions); 212 } 213 214 @Override 215 public void visit(OWLSymmetricObjectPropertyAxiom axiom) { 216 OWLObjectPropertyExpression property = axiom.getProperty(); 217 property = expressionRenamer.rename(property); 218 renamedAxiom = df.getOWLSymmetricObjectPropertyAxiom(property); 219 } 220 221 @Override 222 public void visit(OWLDataPropertyRangeAxiom axiom) { 223 OWLDataPropertyExpression property = axiom.getProperty(); 224 property = expressionRenamer.rename(property); 225 OWLDataRange range = axiom.getRange(); 226 range = expressionRenamer.rename(range); 227 renamedAxiom = df.getOWLDataPropertyRangeAxiom(property, range); 228 } 229 230 @Override 231 public void visit(OWLFunctionalDataPropertyAxiom axiom) { 232 OWLDataPropertyExpression property = axiom.getProperty(); 233 property = expressionRenamer.rename(property); 234 renamedAxiom = df.getOWLFunctionalDataPropertyAxiom(property); 235 } 236 237 @Override 238 public void visit(OWLEquivalentDataPropertiesAxiom axiom) { 239 Set<OWLDataPropertyExpression> properties = axiom.getProperties(); 240 Set<OWLDataPropertyExpression> renamedProperties = new HashSet<>(); 241 for (OWLDataPropertyExpression property : properties) { 242 renamedProperties.add(expressionRenamer.rename(property)); 243 } 244 renamedAxiom = df.getOWLEquivalentDataPropertiesAxiom(renamedProperties); 245 } 246 247 @Override 248 public void visit(OWLClassAssertionAxiom axiom) { 249 OWLClassExpression classExpression = axiom.getClassExpression(); 250 classExpression = expressionRenamer.rename(classExpression); 251 OWLIndividual individual = axiom.getIndividual(); 252 individual = expressionRenamer.rename(individual); 253 renamedAxiom = df.getOWLClassAssertionAxiom(classExpression, individual); 254 } 255 256 @Override 257 public void visit(OWLEquivalentClassesAxiom axiom) { 258 List<OWLClassExpression> classExpressions = axiom.getClassExpressionsAsList(); 259 List<OWLClassExpression> renamedClassExpressions = new ArrayList<>(); 260 for (OWLClassExpression expr : classExpressions) { 261 renamedClassExpressions.add(expressionRenamer.rename(expr)); 262 } 263 renamedAxiom = df.getOWLEquivalentClassesAxiom(new TreeSet<>(renamedClassExpressions)); 264 } 265 266 @Override 267 public void visit(OWLDataPropertyAssertionAxiom axiom) { 268 OWLDataPropertyExpression property = axiom.getProperty(); 269 property = expressionRenamer.rename(property); 270 OWLIndividual subject = axiom.getSubject(); 271 subject = expressionRenamer.rename(subject); 272 OWLLiteral object = axiom.getObject(); 273 object = expressionRenamer.rename(object); 274 renamedAxiom = df.getOWLDataPropertyAssertionAxiom(property, subject, object); 275 } 276 277 @Override 278 public void visit(OWLTransitiveObjectPropertyAxiom axiom) { 279 OWLObjectPropertyExpression property = axiom.getProperty(); 280 property = expressionRenamer.rename(property); 281 renamedAxiom = df.getOWLTransitiveObjectPropertyAxiom(property); 282 } 283 284 @Override 285 public void visit(OWLIrreflexiveObjectPropertyAxiom axiom) { 286 OWLObjectPropertyExpression property = axiom.getProperty(); 287 property = expressionRenamer.rename(property); 288 renamedAxiom = df.getOWLIrreflexiveObjectPropertyAxiom(property); 289 } 290 291 @Override 292 public void visit(OWLSubDataPropertyOfAxiom axiom) { 293 OWLDataPropertyExpression subProperty = axiom.getSubProperty(); 294 subProperty = expressionRenamer.rename(subProperty); 295 OWLDataPropertyExpression superProperty = axiom.getSuperProperty(); 296 superProperty = expressionRenamer.rename(superProperty); 297 renamedAxiom = df.getOWLSubDataPropertyOfAxiom(subProperty, superProperty); 298 } 299 300 @Override 301 public void visit(OWLInverseFunctionalObjectPropertyAxiom axiom) { 302 OWLObjectPropertyExpression property = axiom.getProperty(); 303 property = expressionRenamer.rename(property); 304 renamedAxiom = df.getOWLInverseFunctionalObjectPropertyAxiom(property); 305 } 306 307 @Override 308 public void visit(OWLSameIndividualAxiom axiom) { 309 Set<OWLIndividual> renamedIndividuals = new HashSet<>(); 310 if(normalizeABoxAxioms){ 311 renamedIndividuals.add(df.getOWLNamedIndividual(IRI.create("http://dl-learner.org/pattern/a"))); 312 renamedIndividuals.add(df.getOWLNamedIndividual(IRI.create("http://dl-learner.org/pattern/b"))); 313 } else { 314 for(OWLIndividual ind : axiom.getIndividuals()){ 315 renamedIndividuals.add(expressionRenamer.rename(ind)); 316 } 317 } 318 renamedAxiom = df.getOWLSameIndividualAxiom(renamedIndividuals); 319 } 320 321 @Override 322 public void visit(OWLSubPropertyChainOfAxiom axiom) { 323 List<OWLObjectPropertyExpression> renamedSubPropertyChain = new ArrayList<>(); 324 for (OWLObjectPropertyExpression owlObjectPropertyExpression : axiom.getPropertyChain()) { 325 renamedSubPropertyChain.add(expressionRenamer.rename(owlObjectPropertyExpression)); 326 } 327 OWLObjectPropertyExpression superProperty = axiom.getSuperProperty(); 328 superProperty = expressionRenamer.rename(superProperty); 329 renamedAxiom = df.getOWLSubPropertyChainOfAxiom(renamedSubPropertyChain, superProperty); 330 } 331 332 @Override 333 public void visit(OWLInverseObjectPropertiesAxiom axiom) { 334 OWLObjectPropertyExpression firstProperty = axiom.getFirstProperty(); 335 firstProperty = expressionRenamer.rename(firstProperty); 336 OWLObjectPropertyExpression secondProperty = axiom.getSecondProperty(); 337 secondProperty = expressionRenamer.rename(secondProperty); 338 renamedAxiom = df.getOWLInverseObjectPropertiesAxiom(firstProperty, secondProperty); 339 } 340 341 @Override 342 public void visit(OWLHasKeyAxiom axiom) { 343 OWLClassExpression classExpression = axiom.getClassExpression(); 344 classExpression = expressionRenamer.rename(classExpression); 345 Set<OWLPropertyExpression> propertyExpressions = axiom.getPropertyExpressions(); 346 Set<OWLPropertyExpression> renamedPropertyExpressions = new HashSet<>(); 347 for (OWLPropertyExpression owlPropertyExpression : propertyExpressions) { 348 renamedPropertyExpressions.add(expressionRenamer.rename(owlPropertyExpression)); 349 } 350 renamedAxiom = df.getOWLHasKeyAxiom(classExpression, renamedPropertyExpressions); 351 } 352 353 @Override 354 public void visit(OWLDatatypeDefinitionAxiom axiom) { 355 } 356 357 @Override 358 public void visit(SWRLRule axiom) { 359 } 360 361 @Override 362 public void visit(OWLAnnotationAssertionAxiom axiom) { 363 } 364 365 @Override 366 public void visit(OWLSubAnnotationPropertyOfAxiom axiom) { 367 } 368 369 @Override 370 public void visit(OWLAnnotationPropertyDomainAxiom axiom) { 371 } 372 373 @Override 374 public void visit(OWLAnnotationPropertyRangeAxiom axiom) { 375 } 376 377 @Override 378 public void visit(OWLDeclarationAxiom axiom) { 379 } 380}