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.core.ref; 020 021import java.util.HashSet; 022import java.util.Set; 023import java.util.SortedSet; 024import java.util.TreeSet; 025 026import org.semanticweb.owlapi.model.OWLClass; 027import org.semanticweb.owlapi.model.OWLClassExpression; 028import org.semanticweb.owlapi.model.OWLDataAllValuesFrom; 029import org.semanticweb.owlapi.model.OWLDataFactory; 030import org.semanticweb.owlapi.model.OWLDataProperty; 031import org.semanticweb.owlapi.model.OWLDataPropertyExpression; 032import org.semanticweb.owlapi.model.OWLDataRange; 033import org.semanticweb.owlapi.model.OWLDataSomeValuesFrom; 034import org.semanticweb.owlapi.model.OWLObjectAllValuesFrom; 035import org.semanticweb.owlapi.model.OWLObjectIntersectionOf; 036import org.semanticweb.owlapi.model.OWLObjectPropertyExpression; 037import org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom; 038import org.semanticweb.owlapi.model.OWLObjectUnionOf; 039import org.semanticweb.owlapi.reasoner.OWLReasoner; 040 041/** 042 * @author Lorenz Buehmann 043 * 044 */ 045public class RefinementOperatorALC extends ClassExpressionRefinementOperatorBase { 046 047 public RefinementOperatorALC(OWLReasoner reasoner, OWLDataFactory dataFactory) { 048 super(reasoner, dataFactory); 049 } 050 051 /* (non-Javadoc) 052 * @see org.semanticweb.owlapi.util.OWLClassExpressionVisitorExAdapter#visit(org.semanticweb.owlapi.model.OWLClass) 053 */ 054 @Override 055 public SortedSet<OWLClassExpression> visit(OWLClass ce) { 056 SortedSet<OWLClassExpression> refinements = new TreeSet<>(); 057 058 refinements.addAll(reasoner.getSubClasses(ce, true).getFlattened()); 059 060 return refinements; 061 } 062 063 /* (non-Javadoc) 064 * @see org.semanticweb.owlapi.util.OWLClassExpressionVisitorExAdapter#visit(org.semanticweb.owlapi.model.OWLObjectIntersectionOf) 065 */ 066 @Override 067 public SortedSet<OWLClassExpression> visit(OWLObjectIntersectionOf ce) { 068 SortedSet<OWLClassExpression> refinements = new TreeSet<>(); 069 070 for (OWLClassExpression operand : ce.getOperands()) { 071 // refine operand 072 SortedSet<OWLClassExpression> operandRefinements = refineNode(operand); 073 074 for (OWLClassExpression operandRefinement : operandRefinements) { 075 Set<OWLClassExpression> newOperands = new HashSet<>(ce.getOperands()); 076 newOperands.remove(operand); 077 newOperands.add(operandRefinement); 078 079 refinements.add(dataFactory.getOWLObjectIntersectionOf(newOperands)); 080 } 081 } 082 083 return refinements; 084 } 085 086 /* (non-Javadoc) 087 * @see org.semanticweb.owlapi.util.OWLClassExpressionVisitorExAdapter#visit(org.semanticweb.owlapi.model.OWLObjectUnionOf) 088 */ 089 @Override 090 public SortedSet<OWLClassExpression> visit(OWLObjectUnionOf ce) { 091 SortedSet<OWLClassExpression> refinements = new TreeSet<>(); 092 093 for (OWLClassExpression operand : ce.getOperands()) { 094 // refine operand 095 SortedSet<OWLClassExpression> operandRefinements = refineNode(operand); 096 097 for (OWLClassExpression operandRefinement : operandRefinements) { 098 Set<OWLClassExpression> newOperands = new HashSet<>(ce.getOperands()); 099 newOperands.remove(operand); 100 newOperands.add(operandRefinement); 101 102 refinements.add(dataFactory.getOWLObjectUnionOf(newOperands)); 103 } 104 } 105 106 return refinements; 107 } 108 109 /* (non-Javadoc) 110 * @see org.semanticweb.owlapi.util.OWLClassExpressionVisitorExAdapter#visit(org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom) 111 */ 112 @Override 113 public SortedSet<OWLClassExpression> visit(OWLObjectSomeValuesFrom ce) { 114 SortedSet<OWLClassExpression> refinements = new TreeSet<>(); 115 116 OWLObjectPropertyExpression property = ce.getProperty(); 117 OWLClassExpression filler = ce.getFiller(); 118 119 // refine property 120 Set<OWLObjectPropertyExpression> subProperties = reasoner.getSubObjectProperties(property, true).getFlattened(); 121 for (OWLObjectPropertyExpression subProperty : subProperties) { 122 refinements.add(dataFactory.getOWLObjectSomeValuesFrom(subProperty, filler)); 123 } 124 125 // refine filler 126 SortedSet<OWLClassExpression> fillerRefinements = refineNode(filler); 127 for (OWLClassExpression fillerRefinement : fillerRefinements) { 128 refinements.add(dataFactory.getOWLObjectSomeValuesFrom(property, fillerRefinement)); 129 } 130 131 return refinements; 132 } 133 134 /* (non-Javadoc) 135 * @see org.semanticweb.owlapi.util.OWLClassExpressionVisitorExAdapter#visit(org.semanticweb.owlapi.model.OWLObjectAllValuesFrom) 136 */ 137 @Override 138 public SortedSet<OWLClassExpression> visit(OWLObjectAllValuesFrom ce) { 139 SortedSet<OWLClassExpression> refinements = new TreeSet<>(); 140 141 OWLObjectPropertyExpression property = ce.getProperty(); 142 OWLClassExpression filler = ce.getFiller(); 143 144 // refine property 145 Set<OWLObjectPropertyExpression> subProperties = reasoner.getSubObjectProperties(property, true).getFlattened(); 146 for (OWLObjectPropertyExpression subProperty : subProperties) { 147 refinements.add(dataFactory.getOWLObjectAllValuesFrom(subProperty, filler)); 148 } 149 150 // refine filler 151 SortedSet<OWLClassExpression> fillerRefinements = refineNode(filler); 152 for (OWLClassExpression fillerRefinement : fillerRefinements) { 153 refinements.add(dataFactory.getOWLObjectAllValuesFrom(property, fillerRefinement)); 154 } 155 156 return refinements; 157 } 158 159 /* (non-Javadoc) 160 * @see org.semanticweb.owlapi.util.OWLClassExpressionVisitorExAdapter#visit(org.semanticweb.owlapi.model.OWLDataSomeValuesFrom) 161 */ 162 @Override 163 public SortedSet<OWLClassExpression> visit(OWLDataSomeValuesFrom ce) { 164 SortedSet<OWLClassExpression> refinements = new TreeSet<>(); 165 166 OWLDataPropertyExpression property = ce.getProperty(); 167 OWLDataRange filler = ce.getFiller(); 168 169 // refine property 170 Set<OWLDataProperty> subProperties = reasoner.getSubDataProperties(property.asOWLDataProperty(), true).getFlattened(); 171 for (OWLDataProperty subProperty : subProperties) { 172 refinements.add(dataFactory.getOWLDataSomeValuesFrom(subProperty, filler)); 173 } 174 175 // refine filler 176 // TODO 177 178 return refinements; 179 } 180 181 /* (non-Javadoc) 182 * @see org.semanticweb.owlapi.util.OWLClassExpressionVisitorExAdapter#visit(org.semanticweb.owlapi.model.OWLDataAllValuesFrom) 183 */ 184 @Override 185 public SortedSet<OWLClassExpression> visit(OWLDataAllValuesFrom ce) { 186 SortedSet<OWLClassExpression> refinements = new TreeSet<>(); 187 188 OWLDataPropertyExpression property = ce.getProperty(); 189 OWLDataRange filler = ce.getFiller(); 190 191 // refine property 192 Set<OWLDataProperty> subProperties = reasoner.getSubDataProperties(property.asOWLDataProperty(), true).getFlattened(); 193 for (OWLDataProperty subProperty : subProperties) { 194 refinements.add(dataFactory.getOWLDataSomeValuesFrom(subProperty, filler)); 195 } 196 197 // refine filler 198 // TODO 199 200 return refinements; 201 } 202 203}