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}