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}