001    /**
002     * OntCosine.java
003     * jCOLIBRI2 framework. 
004     * @author Juan A. Recio-García.
005     * GAIA - Group for Artificial Intelligence Applications
006     * http://gaia.fdi.ucm.es
007     * 11/01/2007
008     */
009    package jcolibri.method.retrieve.NNretrieval.similarity.local.ontology;
010    
011    import java.util.*;
012    
013    import es.ucm.fdi.gaia.ontobridge.OntoBridge;
014    import es.ucm.fdi.gaia.ontobridge.OntologyDocument;
015    import jcolibri.datatypes.Instance;
016    import jcolibri.exception.NoApplicableSimilarityFunctionException;
017    import jcolibri.method.retrieve.NNretrieval.similarity.LocalSimilarityFunction;
018    import jcolibri.util.FileIO;
019    import jcolibri.util.OntoBridgeSingleton;
020    
021    /**
022     * This function computes the detail similarity. See package documentation for
023     * details.
024     * 
025     * @author Juan A. Recio-Garcia
026     * @version 1.0
027     * @see jcolibri.method.retrieve.NNretrieval.similarity.local
028     */
029    public class OntDetail implements LocalSimilarityFunction
030    {
031    
032        /*
033             * (non-Javadoc)
034             * 
035             * @see jcolibri.method.retrieve.NNretrieval.similarity.LocalSimilarityFunction#compute(java.lang.Object,
036             *      java.lang.Object, jcolibri.cbrcore.CaseComponent,
037             *      jcolibri.cbrcore.CaseComponent, jcolibri.cbrcore.CBRCase,
038             *      jcolibri.cbrcore.CBRQuery, java.lang.String)
039             */
040        public double compute(Object caseObject, Object queryObject) throws NoApplicableSimilarityFunctionException
041        {
042            if ((caseObject == null) || (queryObject == null))
043                return 0;
044            if (!(caseObject instanceof Instance))
045                throw new jcolibri.exception.NoApplicableSimilarityFunctionException(this.getClass(), caseObject.getClass());
046            if (!(queryObject instanceof Instance))
047                throw new jcolibri.exception.NoApplicableSimilarityFunctionException(this.getClass(), queryObject
048                        .getClass());
049    
050            Instance i1 = (Instance) caseObject;
051            Instance i2 = (Instance) queryObject;
052    
053            if (i1.equals(i2))
054                return 1;
055    
056            OntoBridge ob = OntoBridgeSingleton.getOntoBridge();
057    
058            Set<String> sc1 = new HashSet<String>();
059            for (Iterator<String> iter = ob.listBelongingClasses(i1.toString()); iter.hasNext();)
060                sc1.add(iter.next());
061            sc1.remove(ob.getThingURI());
062    
063            Set<String> sc2 = new HashSet<String>();
064            for (Iterator<String> iter = ob.listBelongingClasses(i2.toString()); iter.hasNext();)
065                sc2.add(iter.next());
066            sc2.remove(ob.getThingURI());
067    
068            sc1.retainAll(sc2);
069            double intersectionsize = sc1.size();
070    
071            double res = 1 - (1 / (2 * intersectionsize));
072            return res;
073        }
074    
075        /** Applicable to Instance */
076        public boolean isApplicable(Object o1, Object o2)
077        {
078            if ((o1 == null) && (o2 == null))
079                return true;
080            else if (o1 == null)
081                return o2 instanceof Instance;
082            else if (o2 == null)
083                return o1 instanceof Instance;
084            else
085                return (o1 instanceof Instance) && (o2 instanceof Instance);
086        }
087    
088        /**
089             * Testing method using test5 ontology
090             */
091        public static void main(String[] args)
092        {
093            try
094            {
095                // Obtain a reference to OntoBridge
096                OntoBridge ob = jcolibri.util.OntoBridgeSingleton.getOntoBridge();
097                // Configure it to work with the Pellet reasoner
098                ob.initWithPelletReasoner();
099                // Setup the main ontology
100                OntologyDocument mainOnto = new OntologyDocument("http://gaia.fdi.ucm.es/ontologies/vacation.owl", FileIO
101                        .findFile("jcolibri/test/test5/vacation.owl").toExternalForm());
102                // There are not subontologies
103                ArrayList<OntologyDocument> subOntologies = new ArrayList<OntologyDocument>();
104                // Load the ontology
105                ob.loadOntology(mainOnto, subOntologies, false);
106    
107                OntDetail sim = new OntDetail();
108    
109                System.out.println("detail(CAR,TRAIN)=" + sim.compute(new Instance("CAR"), new Instance("TRAIN")));
110                System.out.println("detail(CAR,IBIZA)=" + sim.compute(new Instance("CAR"), new Instance("IBIZA")));
111                System.out.println("detail(CAR,I101)=" + sim.compute(new Instance("CAR"), new Instance("I101")));
112    
113            } catch (Exception e)
114            {
115                org.apache.commons.logging.LogFactory.getLog(OntDeepBasic.class).error(e);
116            }
117        }
118    }