package org.drools.semantics.builder.model.hierarchy.opt; import org.drools.planner.api.domain.solution.PlanningEntityCollectionProperty; import org.drools.planner.core.score.buildin.hardandsoft.HardAndSoftScore; import org.drools.planner.core.solution.Solution; import org.drools.semantics.builder.model.ConceptImplProxy; import org.drools.semantics.builder.model.Concept; import org.drools.semantics.builder.model.OntoModel; import org.drools.semantics.builder.model.PropertyRelation; import org.w3._2002._07.owl.Thing; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; public class OptimalHierarchy implements Solution<HardAndSoftScore> { private Collection<Concept> availableConcepts; private Collection<PropertyRelation> availableProperties; private Concept top; private LinkedHashMap<String, ConceptImplProxy> inheritances; private HardAndSoftScore score; public OptimalHierarchy( OntoModel model ) { availableConcepts = Collections.unmodifiableCollection( model.getConcepts() ); availableProperties = Collections.unmodifiableCollection( model.getProperties() ); top = model.getConcept( Thing.IRI ); inheritances = new LinkedHashMap<String, ConceptImplProxy>( availableConcepts.size() ); for ( Concept c : availableConcepts ) { ConceptImplProxy x = new ConceptImplProxy( c ); inheritances.put(x.getIri(), x); } } public OptimalHierarchy( OptimalHierarchy opt ) { this.availableConcepts = opt.availableConcepts; this.availableProperties = opt.availableProperties; inheritances = new LinkedHashMap<String, ConceptImplProxy>(); for ( String key : opt.inheritances.keySet() ) { inheritances.put( key, opt.inheritances.get( key ).clone() ); } score = opt.score; } @PlanningEntityCollectionProperty public Collection<ConceptImplProxy> getCons() { return inheritances.values(); } public LinkedHashMap<String, ConceptImplProxy> getInheritances() { return inheritances; } public HardAndSoftScore getScore() { return score; } public void setScore(HardAndSoftScore score) { this.score = score; } public Collection<? extends Object> getProblemFacts() { return availableConcepts; } public Solution<HardAndSoftScore> cloneSolution() { return new OptimalHierarchy( this ); } public Collection<Concept> getAvailableConcepts() { return availableConcepts; } public Collection<PropertyRelation> getAvailableProperties() { return availableProperties; } public Concept getTop() { return top; } public void setTop(Concept top) { this.top = top; } public ConceptImplProxy getCon( String iri ) { return inheritances.get( iri ); } @Override public String toString() { String s = "Optimized Hierarchy ( " + score + " ) \n"; for ( ConceptImplProxy con : inheritances.values() ) { s += "\t " + con + "\n"; } return s; } public void updateModel( OntoModel model ) { for ( ConceptImplProxy con : getCons() ) { Concept x = con.getConcept(); Concept sup = con.getChosenSuper().getConcept(); if ( x == sup ) { //TODO Check how this is possible. With partial inference some classes may // may be generated and not classified, resulting in apparent inconsistencies sup = model.getConcept( Thing.IRI ); } x.setChosenSuperConcept( sup ); // x.setChosenSuper( sup.getIri() ); sup.getChosenSubConcepts().add( x ); x.setChosenProperties( con.getChosenProperties() ); } } }