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.utilities;
020
021import java.util.ArrayList;
022import java.util.Set;
023
024import org.semanticweb.owlapi.model.DataRangeType;
025import org.semanticweb.owlapi.model.OWLClass;
026import org.semanticweb.owlapi.model.OWLClassExpression;
027import org.semanticweb.owlapi.model.OWLClassExpressionVisitor;
028import org.semanticweb.owlapi.model.OWLDataAllValuesFrom;
029import org.semanticweb.owlapi.model.OWLDataExactCardinality;
030import org.semanticweb.owlapi.model.OWLDataHasValue;
031import org.semanticweb.owlapi.model.OWLDataMaxCardinality;
032import org.semanticweb.owlapi.model.OWLDataMinCardinality;
033import org.semanticweb.owlapi.model.OWLDataOneOf;
034import org.semanticweb.owlapi.model.OWLDataRange;
035import org.semanticweb.owlapi.model.OWLDataSomeValuesFrom;
036import org.semanticweb.owlapi.model.OWLLiteral;
037import org.semanticweb.owlapi.model.OWLObjectAllValuesFrom;
038import org.semanticweb.owlapi.model.OWLObjectComplementOf;
039import org.semanticweb.owlapi.model.OWLObjectExactCardinality;
040import org.semanticweb.owlapi.model.OWLObjectHasSelf;
041import org.semanticweb.owlapi.model.OWLObjectHasValue;
042import org.semanticweb.owlapi.model.OWLObjectIntersectionOf;
043import org.semanticweb.owlapi.model.OWLObjectMaxCardinality;
044import org.semanticweb.owlapi.model.OWLObjectMinCardinality;
045import org.semanticweb.owlapi.model.OWLObjectOneOf;
046import org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom;
047import org.semanticweb.owlapi.model.OWLObjectUnionOf;
048
049import fuzzydl.Concept;
050
051/**
052 * @author Lorenz Buehmann
053 *
054 */
055public class OWLClassExpression2FuzzyDLConverter implements OWLClassExpressionVisitor{
056        
057        Concept fuzzyConcept;
058        private FuzzyOwl2 fuzzyOwl2;
059        
060        
061        public OWLClassExpression2FuzzyDLConverter(FuzzyOwl2 fuzzyOwl2) {
062                this.fuzzyOwl2 = fuzzyOwl2;
063        }
064        
065        public Concept convert(OWLClassExpression expr){
066                expr.accept(this);
067                return fuzzyConcept;
068        }
069
070        /* (non-Javadoc)
071         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLClass)
072         */
073        @Override
074        public void visit(OWLClass cls) {
075                if(cls.isOWLThing()){
076                        fuzzyConcept = Concept.CONCEPT_TOP;
077                } else if(cls.isOWLNothing()){
078                        fuzzyConcept = Concept.CONCEPT_BOTTOM;
079                } else {
080                        fuzzyConcept = new Concept(fuzzyOwl2.getClassName(cls));
081                }
082        }
083
084        /* (non-Javadoc)
085         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectIntersectionOf)
086         */
087        @Override
088        public void visit(OWLObjectIntersectionOf expr) {
089                ArrayList<Concept> conjuncts = new ArrayList<>();
090                for (OWLClassExpression operand : expr.getOperands()) {
091                        conjuncts.add(convert(operand));
092                }
093                fuzzyConcept = Concept.and(conjuncts);
094        }
095
096        /* (non-Javadoc)
097         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectUnionOf)
098         */
099        @Override
100        public void visit(OWLObjectUnionOf expr) {
101                ArrayList<Concept> disjuncts = new ArrayList<>();
102                for (OWLClassExpression operand : expr.getOperands()) {
103                        disjuncts.add(convert(operand));
104                }
105                fuzzyConcept = Concept.or(disjuncts);
106        }
107
108        /* (non-Javadoc)
109         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectComplementOf)
110         */
111        @Override
112        public void visit(OWLObjectComplementOf expr) {
113                Concept c = convert(expr.getOperand());
114                fuzzyConcept = Concept.complement(c);
115        }
116
117        /* (non-Javadoc)
118         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom)
119         */
120        @Override
121        public void visit(OWLObjectSomeValuesFrom expr) {
122                Concept filler = convert(expr.getFiller());
123                fuzzyConcept = Concept.some(fuzzyOwl2.getObjectPropertyName(expr.getProperty()), filler);
124        }
125
126        /* (non-Javadoc)
127         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectAllValuesFrom)
128         */
129        @Override
130        public void visit(OWLObjectAllValuesFrom expr) {
131                Concept filler = convert(expr.getFiller());
132                fuzzyConcept = Concept.all(fuzzyOwl2.getObjectPropertyName(expr.getProperty()), filler);
133        }
134
135        /* (non-Javadoc)
136         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectHasValue)
137         */
138        @Override
139        public void visit(OWLObjectHasValue arg0) {
140        }
141
142        /* (non-Javadoc)
143         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectMinCardinality)
144         */
145        @Override
146        public void visit(OWLObjectMinCardinality arg0) {
147        }
148
149        /* (non-Javadoc)
150         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectExactCardinality)
151         */
152        @Override
153        public void visit(OWLObjectExactCardinality arg0) {
154        }
155
156        /* (non-Javadoc)
157         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectMaxCardinality)
158         */
159        @Override
160        public void visit(OWLObjectMaxCardinality arg0) {
161        }
162
163        /* (non-Javadoc)
164         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectHasSelf)
165         */
166        @Override
167        public void visit(OWLObjectHasSelf arg0) {
168        }
169
170        /* (non-Javadoc)
171         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLObjectOneOf)
172         */
173        @Override
174        public void visit(OWLObjectOneOf arg0) {
175        }
176
177        /* (non-Javadoc)
178         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLDataSomeValuesFrom)
179         */
180        @Override
181        public void visit(OWLDataSomeValuesFrom expr) {
182                OWLDataRange range = expr.getFiller();
183                DataRangeType type = range.getDataRangeType();
184                if (type == DataRangeType.DATATYPE)
185                {
186                        String datatypeName = fuzzyOwl2.getShortName(range.asOWLDatatype());
187                        if (fuzzyOwl2.fuzzyDatatypes.containsKey(datatypeName))
188                                fuzzyConcept =  Concept.some(fuzzyOwl2.getDataPropertyName(expr.getProperty()), new Concept(datatypeName));
189                }
190                else if (type == DataRangeType.DATA_ONE_OF)
191                {
192                        OWLDataOneOf o = (OWLDataOneOf) range;
193                        Set<OWLLiteral> set = o.getValues();
194                        if (!set.isEmpty())
195                        {
196                                OWLLiteral lit = set.iterator().next();
197                                fuzzyConcept = Concept.exactValue(fuzzyOwl2.getDataPropertyName(expr.getProperty()), lit.getLiteral());
198                        }
199                }
200        }
201
202        /* (non-Javadoc)
203         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLDataAllValuesFrom)
204         */
205        @Override
206        public void visit(OWLDataAllValuesFrom expr) {
207                OWLDataRange range = expr.getFiller();
208                DataRangeType type = range.getDataRangeType();
209                if (type == DataRangeType.DATATYPE)
210                {
211                        String datatypeName = fuzzyOwl2.getShortName(range.asOWLDatatype());
212                        if (fuzzyOwl2.fuzzyDatatypes.containsKey(datatypeName))
213                                fuzzyConcept =  Concept.all(fuzzyOwl2.getDataPropertyName(expr.getProperty()), new Concept(datatypeName));
214                }
215        }
216
217        /* (non-Javadoc)
218         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLDataHasValue)
219         */
220        @Override
221        public void visit(OWLDataHasValue arg0) {
222        }
223
224        /* (non-Javadoc)
225         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLDataMinCardinality)
226         */
227        @Override
228        public void visit(OWLDataMinCardinality arg0) {
229        }
230
231        /* (non-Javadoc)
232         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLDataExactCardinality)
233         */
234        @Override
235        public void visit(OWLDataExactCardinality arg0) {
236        }
237
238        /* (non-Javadoc)
239         * @see org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb.owlapi.model.OWLDataMaxCardinality)
240         */
241        @Override
242        public void visit(OWLDataMaxCardinality arg0) {
243        }
244
245}