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.owl; 020 021import org.semanticweb.owlapi.model.*; 022 023import javax.annotation.Nonnull; 024import java.util.List; 025import java.util.Set; 026 027/** 028 * Computes the length of a class expression. 029 * 030 * @author Lorenz Buehmann 031 * 032 */ 033public class OWLClassExpressionLengthCalculator implements 034 OWLClassExpressionVisitor, OWLPropertyExpressionVisitor, 035 OWLDataRangeVisitor { 036 037 private OWLClassExpressionLengthMetric metric; 038 private int length; 039 040 public OWLClassExpressionLengthCalculator(OWLClassExpressionLengthMetric metric) { 041 this.metric = metric; 042 } 043 044 public OWLClassExpressionLengthCalculator() { 045 this.metric = OWLClassExpressionLengthMetric.getDefaultMetric(); 046 } 047 048 /** 049 * Computes the length of a class expression. 050 * 051 * @param ce the class expression 052 * @return the length of the class expression 053 */ 054 public int getLength(OWLClassExpression ce) { 055 ce.accept(this); 056 return length; 057 } 058 059 /* 060 * (non-Javadoc) 061 * 062 * @see 063 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 064 * .owlapi.model.OWLClass) 065 */ 066 @Override 067 public void visit(OWLClass ce) { 068 length += metric.classLength; 069 } 070 071 /* 072 * (non-Javadoc) 073 * 074 * @see 075 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 076 * .owlapi.model.OWLObjectIntersectionOf) 077 */ 078 @Override 079 public void visit(OWLObjectIntersectionOf ce) { 080 List<OWLClassExpression> operands = ce.getOperandsAsList(); 081 for (OWLClassExpression op : operands) { 082 op.accept(this); 083 } 084 length += (operands.size() - 1) * metric.objectIntersectionLength; 085 } 086 087 /* 088 * (non-Javadoc) 089 * 090 * @see 091 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 092 * .owlapi.model.OWLObjectUnionOf) 093 */ 094 @Override 095 public void visit(OWLObjectUnionOf ce) { 096 List<OWLClassExpression> operands = ce.getOperandsAsList(); 097 for (OWLClassExpression op : operands) { 098 op.accept(this); 099 } 100 length += (operands.size() - 1) * metric.objectUnionLength; 101 } 102 103 /* 104 * (non-Javadoc) 105 * 106 * @see 107 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 108 * .owlapi.model.OWLObjectComplementOf) 109 */ 110 @Override 111 public void visit(OWLObjectComplementOf ce) { 112 ce.getOperand().accept(this); 113 length += metric.objectComplementLength; 114 } 115 116 /* 117 * (non-Javadoc) 118 * 119 * @see 120 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 121 * .owlapi.model.OWLObjectSomeValuesFrom) 122 */ 123 @Override 124 public void visit(OWLObjectSomeValuesFrom ce) { 125 ce.getProperty().accept(this); 126 ce.getFiller().accept(this); 127 length += metric.objectSomeValuesLength; 128 } 129 130 /* 131 * (non-Javadoc) 132 * 133 * @see 134 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 135 * .owlapi.model.OWLObjectAllValuesFrom) 136 */ 137 @Override 138 public void visit(OWLObjectAllValuesFrom ce) { 139 ce.getProperty().accept(this); 140 ce.getFiller().accept(this); 141 length += metric.objectAllValuesLength; 142 } 143 144 /* 145 * (non-Javadoc) 146 * 147 * @see 148 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 149 * .owlapi.model.OWLObjectHasValue) 150 */ 151 @Override 152 public void visit(OWLObjectHasValue ce) { 153 ce.getProperty().accept(this); 154 length += metric.objectHasValueLength; 155 } 156 157 /* 158 * (non-Javadoc) 159 * 160 * @see 161 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 162 * .owlapi.model.OWLObjectMinCardinality) 163 */ 164 @Override 165 public void visit(OWLObjectMinCardinality ce) { 166 ce.getProperty().accept(this); 167 ce.getFiller().accept(this); 168 length += metric.objectCardinalityLength; 169 } 170 171 /* 172 * (non-Javadoc) 173 * 174 * @see 175 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 176 * .owlapi.model.OWLObjectExactCardinality) 177 */ 178 @Override 179 public void visit(OWLObjectExactCardinality ce) { 180 ce.getProperty().accept(this); 181 ce.getFiller().accept(this); 182 length += metric.objectCardinalityLength; 183 } 184 185 /* 186 * (non-Javadoc) 187 * 188 * @see 189 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 190 * .owlapi.model.OWLObjectMaxCardinality) 191 */ 192 @Override 193 public void visit(OWLObjectMaxCardinality ce) { 194 ce.getProperty().accept(this); 195 ce.getFiller().accept(this); 196 length += metric.objectCardinalityLength; 197 } 198 199 /* 200 * (non-Javadoc) 201 * 202 * @see 203 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 204 * .owlapi.model.OWLObjectHasSelf) 205 */ 206 @Override 207 public void visit(OWLObjectHasSelf ce) { 208 ce.getProperty().accept(this); 209 length += metric.objectHasValueLength; 210 } 211 212 /* 213 * (non-Javadoc) 214 * 215 * @see 216 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 217 * .owlapi.model.OWLObjectOneOf) 218 */ 219 @Override 220 public void visit(OWLObjectOneOf ce) { 221 length += metric.objectOneOfLength; 222 } 223 224 /* 225 * (non-Javadoc) 226 * 227 * @see 228 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 229 * .owlapi.model.OWLDataSomeValuesFrom) 230 */ 231 @Override 232 public void visit(OWLDataSomeValuesFrom ce) { 233 ce.getProperty().accept(this); 234 ce.getFiller().accept(this); 235 length += metric.dataSomeValuesLength; 236 } 237 238 /* 239 * (non-Javadoc) 240 * 241 * @see 242 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 243 * .owlapi.model.OWLDataAllValuesFrom) 244 */ 245 @Override 246 public void visit(OWLDataAllValuesFrom ce) { 247 ce.getProperty().accept(this); 248 ce.getFiller().accept(this); 249 length += metric.dataAllValuesLength; 250 } 251 252 /* 253 * (non-Javadoc) 254 * 255 * @see 256 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 257 * .owlapi.model.OWLDataHasValue) 258 */ 259 @Override 260 public void visit(OWLDataHasValue ce) { 261 ce.getProperty().accept(this); 262 length += metric.dataHasValueLength; 263 } 264 265 /* 266 * (non-Javadoc) 267 * 268 * @see 269 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 270 * .owlapi.model.OWLDataMinCardinality) 271 */ 272 @Override 273 public void visit(OWLDataMinCardinality ce) { 274 ce.getProperty().accept(this); 275 ce.getFiller().accept(this); 276 length += metric.dataCardinalityLength; 277 } 278 279 /* 280 * (non-Javadoc) 281 * 282 * @see 283 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 284 * .owlapi.model.OWLDataExactCardinality) 285 */ 286 @Override 287 public void visit(OWLDataExactCardinality ce) { 288 ce.getProperty().accept(this); 289 ce.getFiller().accept(this); 290 length += metric.dataCardinalityLength; 291 } 292 293 /* 294 * (non-Javadoc) 295 * 296 * @see 297 * org.semanticweb.owlapi.model.OWLClassExpressionVisitor#visit(org.semanticweb 298 * .owlapi.model.OWLDataMaxCardinality) 299 */ 300 @Override 301 public void visit(OWLDataMaxCardinality ce) { 302 ce.getProperty().accept(this); 303 ce.getFiller().accept(this); 304 length += metric.dataCardinalityLength; 305 } 306 307 /* 308 * (non-Javadoc) 309 * 310 * @see org.semanticweb.owlapi.model.OWLPropertyExpressionVisitor#visit(org. 311 * semanticweb.owlapi.model.OWLObjectProperty) 312 */ 313 @Override 314 public void visit(OWLObjectProperty property) { 315 length += metric.objectProperyLength; 316 } 317 318 /* 319 * (non-Javadoc) 320 * 321 * @see org.semanticweb.owlapi.model.OWLPropertyExpressionVisitor#visit(org. 322 * semanticweb.owlapi.model.OWLObjectInverseOf) 323 */ 324 @Override 325 public void visit(OWLObjectInverseOf property) { 326 length += metric.objectInverseLength; 327 } 328 329 /* 330 * (non-Javadoc) 331 * 332 * @see org.semanticweb.owlapi.model.OWLPropertyExpressionVisitor#visit(org. 333 * semanticweb.owlapi.model.OWLDataProperty) 334 */ 335 @Override 336 public void visit(OWLDataProperty property) { 337 length += metric.dataProperyLength; 338 } 339 340 @Override 341 public void visit(@Nonnull OWLAnnotationProperty property) {} 342 343 /* 344 * (non-Javadoc) 345 * 346 * @see 347 * org.semanticweb.owlapi.model.OWLDataRangeVisitor#visit(org.semanticweb 348 * .owlapi.model.OWLDatatype) 349 */ 350 @Override 351 public void visit(OWLDatatype node) { 352 length += metric.datatypeLength; 353 } 354 355 /* 356 * (non-Javadoc) 357 * 358 * @see 359 * org.semanticweb.owlapi.model.OWLDataRangeVisitor#visit(org.semanticweb 360 * .owlapi.model.OWLDataOneOf) 361 */ 362 @Override 363 public void visit(OWLDataOneOf node) { 364 length += metric.dataOneOfLength; 365 } 366 367 /* 368 * (non-Javadoc) 369 * 370 * @see 371 * org.semanticweb.owlapi.model.OWLDataRangeVisitor#visit(org.semanticweb 372 * .owlapi.model.OWLDataComplementOf) 373 */ 374 @Override 375 public void visit(OWLDataComplementOf node) { 376 length += metric.dataComplementLength; 377 } 378 379 /* 380 * (non-Javadoc) 381 * 382 * @see 383 * org.semanticweb.owlapi.model.OWLDataRangeVisitor#visit(org.semanticweb 384 * .owlapi.model.OWLDataIntersectionOf) 385 */ 386 @Override 387 public void visit(OWLDataIntersectionOf node) { 388 Set<OWLDataRange> operands = node.getOperands(); 389 for (OWLDataRange op : operands) { 390 op.accept(this); 391 } 392 length += (operands.size() - 1) * metric.dataIntersectionLength; 393 } 394 395 /* 396 * (non-Javadoc) 397 * 398 * @see 399 * org.semanticweb.owlapi.model.OWLDataRangeVisitor#visit(org.semanticweb 400 * .owlapi.model.OWLDataUnionOf) 401 */ 402 @Override 403 public void visit(OWLDataUnionOf node) { 404 Set<OWLDataRange> operands = node.getOperands(); 405 for (OWLDataRange op : operands) { 406 op.accept(this); 407 } 408 length += (operands.size() - 1) * metric.dataUnionLength; 409 } 410 411 /* 412 * (non-Javadoc) 413 * 414 * @see 415 * org.semanticweb.owlapi.model.OWLDataRangeVisitor#visit(org.semanticweb 416 * .owlapi.model.OWLDatatypeRestriction) 417 */ 418 @Override 419 public void visit(OWLDatatypeRestriction node) { 420 Set<OWLFacetRestriction> facetRestrictions = node 421 .getFacetRestrictions(); 422 length += facetRestrictions.size(); 423 } 424}