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