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 }