001package org.dllearner.algorithms.isle.index;
002
003import java.io.File;
004import java.io.FileInputStream;
005import java.io.FileOutputStream;
006import java.io.IOException;
007import java.io.ObjectInputStream;
008import java.io.ObjectOutputStream;
009import java.io.UnsupportedEncodingException;
010import java.net.URLEncoder;
011import java.util.LinkedHashMap;
012import java.util.List;
013import java.util.Map;
014
015import org.apache.log4j.Logger;
016import org.dllearner.algorithms.isle.metrics.RelevanceMetric;
017import org.dllearner.algorithms.isle.metrics.RelevanceUtils;
018import org.semanticweb.owlapi.model.OWLClass;
019import org.semanticweb.owlapi.model.OWLEntity;
020import org.semanticweb.owlapi.model.OWLOntology;
021
022import com.google.common.hash.HashFunction;
023import com.google.common.hash.Hashing;
024
025/**
026 * Interface for an index which is able to resolve a given entity's URI to the set of documents containing
027 * this entity, i.e., documents which contain words disambiguated to the given entity.
028 *
029 * @author Lorenz Buehmann
030 * @author Daniel Fleischhacker
031 */
032public abstract class RelevanceMapGenerator {
033
034    private static final Logger logger = Logger.getLogger(RelevanceMapGenerator.class);
035    public static String cacheDirectory = "cache/relevance";
036    
037    public static synchronized Map<OWLEntity, Double> generateRelevanceMap(OWLClass cls, OWLOntology ontology, RelevanceMetric relevanceMetric, boolean cached){
038        logger.info("Relevance Metric: " + relevanceMetric.getClass().getSimpleName());
039        Map<OWLEntity, Double> relevanceMap = null;
040        File folder = new File(cacheDirectory);
041        folder.mkdirs();
042        File file = null;
043                try {
044                        file = new File(folder, URLEncoder.encode(cls.toStringID() + "-" + relevanceMetric.getClass().getSimpleName(), "UTF-8") + ".rel");
045                } catch (UnsupportedEncodingException e2) {
046                        e2.printStackTrace();
047                }
048        if(cached && file.exists()){
049                try {
050                        logger.info("Loading relevance map from disk...");
051                                ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
052                                relevanceMap = (Map<OWLEntity, Double>) ois.readObject();
053                                ois.close();
054                                logger.info("...done.");
055                        } catch (Exception e) {
056                                e.printStackTrace();
057                        } 
058        } else {
059                logger.info("Building relevance map...");
060                relevanceMap = RelevanceUtils.getRelevantEntities(cls, ontology, relevanceMetric);
061                try {
062                        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
063                        oos.writeObject(relevanceMap);
064                        oos.close();
065                } catch (IOException e1) {
066                        e1.printStackTrace();
067                }
068                logger.info("...done.");
069        }
070        return relevanceMap;
071    }
072    
073    public static Map<RelevanceMetric, Map<OWLEntity, Double>> generateRelevanceMaps(OWLClass cls, OWLOntology ontology, List<RelevanceMetric> relevanceMetrics, boolean cached){
074        Map<RelevanceMetric, Map<OWLEntity, Double>> metric2Map = new LinkedHashMap<>();
075        for (RelevanceMetric relevanceMetric : relevanceMetrics) {
076                try {
077                        long start = System.currentTimeMillis();
078                        metric2Map.put(relevanceMetric, generateRelevanceMap(cls, ontology, relevanceMetric, cached));
079                        long end = System.currentTimeMillis();
080                        logger.info("Operation took " + (end - start) + "ms");
081                                
082                        } catch (Exception e) {
083                                e.printStackTrace();
084                        }
085                }
086        return metric2Map;
087    }
088    
089    public static Map<OWLEntity, Double> generateRelevanceMap(OWLClass cls, OWLOntology ontology, RelevanceMetric relevanceMetric){
090        return generateRelevanceMap(cls, ontology, relevanceMetric, false);
091    }
092}