001/* 002 * To change this license header, choose License Headers in Project Properties. 003 * To change this template file, choose Tools | Templates 004 * and open the template in the editor. 005 */ 006package org.dllearner.utils.unife; 007 008import java.util.HashSet; 009import java.util.Set; 010import java.util.Stack; 011import javax.annotation.Nonnull; 012import org.semanticweb.owlapi.model.OWLClass; 013import org.semanticweb.owlapi.model.OWLClassExpression; 014import org.semanticweb.owlapi.model.OWLClassExpressionVisitor; 015import org.semanticweb.owlapi.model.OWLDataAllValuesFrom; 016import org.semanticweb.owlapi.model.OWLDataExactCardinality; 017import org.semanticweb.owlapi.model.OWLDataFactory; 018import org.semanticweb.owlapi.model.OWLDataHasValue; 019import org.semanticweb.owlapi.model.OWLDataMaxCardinality; 020import org.semanticweb.owlapi.model.OWLDataMinCardinality; 021import org.semanticweb.owlapi.model.OWLDataSomeValuesFrom; 022import org.semanticweb.owlapi.model.OWLObjectAllValuesFrom; 023import org.semanticweb.owlapi.model.OWLObjectComplementOf; 024import org.semanticweb.owlapi.model.OWLObjectExactCardinality; 025import org.semanticweb.owlapi.model.OWLObjectHasSelf; 026import org.semanticweb.owlapi.model.OWLObjectHasValue; 027import org.semanticweb.owlapi.model.OWLObjectIntersectionOf; 028import org.semanticweb.owlapi.model.OWLObjectMaxCardinality; 029import org.semanticweb.owlapi.model.OWLObjectMinCardinality; 030import org.semanticweb.owlapi.model.OWLObjectOneOf; 031import org.semanticweb.owlapi.model.OWLObjectProperty; 032import org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom; 033import org.semanticweb.owlapi.model.OWLObjectUnionOf; 034import org.semanticweb.owlapi.model.OWLOntologyManager; 035 036/** 037 * 038 * @author Giuseppe Cota <giuseppe.cota@unife.it> 039 */ 040public class OWLClassExpressionSimplifierVisitorImpl 041 implements OWLClassExpressionSimplifierVisitor { 042 043 private Stack<OWLClassExpression> stack = new Stack<>(); 044 045 private OWLDataFactory factory; 046 047 public OWLClassExpressionSimplifierVisitorImpl(@Nonnull OWLOntologyManager manager) { 048 factory = manager.getOWLDataFactory(); 049 } 050 051 public OWLClassExpression getOWLClassExpression() { 052 return stack.pop(); 053 } 054 055 public static OWLClassExpression getOWLClassExpression(OWLClassExpression ce, OWLOntologyManager manager) { 056 OWLClassExpressionSimplifierVisitor simplifier = new OWLClassExpressionSimplifierVisitorImpl(manager); 057 ce.accept(simplifier); 058 return simplifier.getOWLClassExpression(); 059 } 060 061 @Override 062 public void visit(OWLClass ce) { 063 stack.push(ce); 064 } 065 066 @Override 067 public void visit(OWLObjectIntersectionOf ce) { 068 if (ce.getOperands().size() < 2) { 069 if (ce.getOperands().size() <= 0) { 070 throw new RuntimeException(ce + " wrong number of operands"); 071 } 072 stack.push(ce.getOperandsAsList().get(0)); 073 } else { 074 Set<OWLClassExpression> operands = new HashSet<>(); 075 for (OWLClassExpression c : ce.getOperands()) { 076 c.accept(this); 077 operands.add(stack.pop()); 078 } 079 stack.push(factory.getOWLObjectIntersectionOf(operands)); 080 } 081 } 082 083 @Override 084 public void visit(OWLObjectUnionOf ce) { 085 if (ce.getOperands().size() < 2) { 086 if (ce.getOperands().size() <= 0) { 087 throw new RuntimeException(ce + " wrong number of operands"); 088 } 089 stack.push(ce.getOperandsAsList().get(0)); 090 } else { 091 Set<OWLClassExpression> operands = new HashSet<>(); 092 for (OWLClassExpression c : ce.getOperands()) { 093 c.accept(this); 094 operands.add(stack.pop()); 095 } 096 stack.push(factory.getOWLObjectUnionOf(operands)); 097 } 098 } 099 100 @Override 101 public void visit(OWLObjectComplementOf ce) { 102 ce.getOperand().accept(this); 103 OWLClassExpression ceNew = stack.pop(); 104 stack.push(factory.getOWLObjectComplementOf(ceNew)); 105 } 106 107 @Override 108 public void visit(OWLObjectSomeValuesFrom ce) { 109 ce.getFiller().accept(this); 110 OWLClassExpression ceNew = stack.pop(); 111 stack.push(factory.getOWLObjectSomeValuesFrom(ce.getProperty(), ceNew)); 112 } 113 114 @Override 115 public void visit(OWLObjectAllValuesFrom ce) { 116 ce.getFiller().accept(this); 117 OWLClassExpression ceNew = stack.pop(); 118 stack.push(factory.getOWLObjectAllValuesFrom(ce.getProperty(), ceNew)); 119 } 120 121 @Override 122 public void visit(OWLObjectHasValue ce) { 123// stack.push(factory.getOWLObjectHasValue(ce.getProperty(), ce.getFiller())); 124 stack.push(ce); 125 } 126 127 @Override 128 public void visit(OWLObjectMinCardinality ce) { 129 ce.getFiller().accept(this); 130 OWLClassExpression cen = stack.pop(); 131 stack.push(factory.getOWLObjectMinCardinality(ce.getCardinality(), ce.getProperty(), cen)); 132 } 133 134 @Override 135 public void visit(OWLObjectExactCardinality ce) { 136 ce.getFiller().accept(this); 137 OWLClassExpression cen = stack.pop(); 138 stack.push(factory.getOWLObjectExactCardinality(ce.getCardinality(), ce.getProperty(), cen)); 139 } 140 141 @Override 142 public void visit(OWLObjectMaxCardinality ce) { 143 ce.getFiller().accept(this); 144 OWLClassExpression cen = stack.pop(); 145 stack.push(factory.getOWLObjectMaxCardinality(ce.getCardinality(), ce.getProperty(), cen)); 146 } 147 148 @Override 149 public void visit(OWLObjectHasSelf ce) { 150// stack.push(factory.getOWLObjectHasSelf(ce.getProperty())); 151 stack.push(ce); 152 } 153 154 @Override 155 public void visit(OWLObjectOneOf ce) { 156// stack.push(factory.getOWLObjectOneOf(ce.getIndividuals())); 157 stack.push(ce); 158 } 159 160 @Override 161 public void visit(OWLDataSomeValuesFrom ce) { 162// stack.push(factory.getOWLDataSomeValuesFrom(ce.getProperty(), ce.getFiller())); 163 stack.push(ce); 164 } 165 166 @Override 167 public void visit(OWLDataAllValuesFrom ce) { 168 stack.push(ce); 169 } 170 171 @Override 172 public void visit(OWLDataHasValue ce) { 173 stack.push(ce); 174 } 175 176 @Override 177 public void visit(OWLDataMinCardinality ce) { 178 stack.push(ce); 179 } 180 181 @Override 182 public void visit(OWLDataExactCardinality ce) { 183 stack.push(ce); 184 } 185 186 @Override 187 public void visit(OWLDataMaxCardinality ce) { 188 stack.push(ce); 189 } 190}