From b3c3422c40c82c3529a138621a63db3d70d53a9e Mon Sep 17 00:00:00 2001 From: Jules Jacobsen Date: Mon, 13 Mar 2017 14:56:20 +0000 Subject: [PATCH] Issue #57 - Added new OwlKnowledgeBase class as a main entry point for creating a BMKnowledgeBaseOWLAPIImpl - @deprecated OWLLoader. Added new supporting classes Ontology and OntologyDataSource, OntologyLoadException to help the OwlKnowledgeBase do its thing. OWLLoader is only partially removed from the tests at present. Removed overly verbose logging from FilterEngine. Added commented-out clean-up of KnowledgeBaseModule - server still fails to start with ot without this. --- .../org/monarchinitiative/owlsim/io/OWLLoader.java | 32 +-- .../org/monarchinitiative/owlsim/io/Ontology.java | 237 +++++++++++++++++++++ .../owlsim/io/OntologyLoadException.java | 14 ++ .../owlsim/io/OntologySourceData.java | 193 +++++++++++++++++ .../owlsim/io/OwlKnowledgeBase.java | 162 ++++++++++++++ .../owlsim/kb/filter/FilterEngine.java | 11 +- .../compute/classmatch/ClassMatcherTest.java | 49 +++-- .../owlsim/compute/kb/impl/AbstractOwlTest.java | 20 +- .../matcher/mp/AbstractProfileMatcherMPTest.java | 21 +- .../compute/matcher/perf/HomologyPhenoPerfIT.java | 36 ++-- .../owlsim/io/OntologySourceDataTest.java | 42 ++++ .../owlsim/io/OwlKnowledgeBaseTest.java | 169 +++++++++++++++ .../services/modules/KnowledgeBaseModule.java | 71 +++--- 13 files changed, 940 insertions(+), 117 deletions(-) create mode 100644 owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/Ontology.java create mode 100644 owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/OntologyLoadException.java create mode 100644 owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/OntologySourceData.java create mode 100644 owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/OwlKnowledgeBase.java create mode 100644 owlsim-core/src/test/java/org/monarchinitiative/owlsim/io/OntologySourceDataTest.java create mode 100644 owlsim-core/src/test/java/org/monarchinitiative/owlsim/io/OwlKnowledgeBaseTest.java diff --git a/owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/OWLLoader.java b/owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/OWLLoader.java index 0c3fa36..c213399 100644 --- a/owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/OWLLoader.java +++ b/owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/OWLLoader.java @@ -1,15 +1,6 @@ package org.monarchinitiative.owlsim.io; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.HashMap; -import java.util.List; -import java.util.zip.GZIPInputStream; - +import com.google.common.base.Preconditions; import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; import org.monarchinitiative.owlsim.kb.BMKnowledgeBase; @@ -17,23 +8,22 @@ import org.prefixcommons.CurieUtil; import org.semanticweb.elk.owlapi.ElkReasonerFactory; import org.semanticweb.owlapi.apibinding.OWLManager; -import org.semanticweb.owlapi.model.IRI; -import org.semanticweb.owlapi.model.OWLClassAssertionAxiom; -import org.semanticweb.owlapi.model.OWLDataFactory; -import org.semanticweb.owlapi.model.OWLOntology; -import org.semanticweb.owlapi.model.OWLOntologyCreationException; -import org.semanticweb.owlapi.model.OWLOntologyManager; +import org.semanticweb.owlapi.model.*; import org.semanticweb.owlapi.reasoner.OWLReasoner; import org.semanticweb.owlapi.reasoner.OWLReasonerFactory; -import com.google.common.base.Preconditions; +import java.io.*; +import java.util.HashMap; +import java.util.List; +import java.util.zip.GZIPInputStream; /** * Object for loading OWL ontologies into a {@link BMKnowledgeBase} * * Note that a KB consists of classes and individuals, both of which can be * loaded from an ontology - * + * + * @deprecated - Use the OwlKnowledgeBase.loader() instead. * @author cjm * */ @@ -52,7 +42,7 @@ * @return OWL Ontology * @throws OWLOntologyCreationException */ - public OWLOntology loadOWL(IRI iri) throws OWLOntologyCreationException { + private OWLOntology loadOWL(IRI iri) throws OWLOntologyCreationException { return getOWLOntologyManager().loadOntology(iri); } @@ -61,7 +51,7 @@ public OWLOntology loadOWL(IRI iri) throws OWLOntologyCreationException { * @return OWL Ontology * @throws OWLOntologyCreationException */ - public OWLOntology loadOWL(File file) throws OWLOntologyCreationException { + private OWLOntology loadOWL(File file) throws OWLOntologyCreationException { IRI iri = IRI.create(file); return getOWLOntologyManager().loadOntologyFromOntologyDocument(iri); } @@ -73,7 +63,7 @@ public OWLOntology loadOWL(File file) throws OWLOntologyCreationException { * @return OWL Ontology * @throws OWLOntologyCreationException */ - public OWLOntology loadOWL(String path) throws OWLOntologyCreationException { + private OWLOntology loadOWL(String path) throws OWLOntologyCreationException { if (path.startsWith("http")) { return loadOWL(IRI.create(path)); } else { diff --git a/owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/Ontology.java b/owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/Ontology.java new file mode 100644 index 0000000..35f6b72 --- /dev/null +++ b/owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/Ontology.java @@ -0,0 +1,237 @@ +package org.monarchinitiative.owlsim.io; + +import org.apache.commons.validator.routines.UrlValidator; +import org.apache.log4j.Logger; +import org.prefixcommons.CurieUtil; +import org.semanticweb.owlapi.apibinding.OWLManager; +import org.semanticweb.owlapi.model.*; +import org.semanticweb.owlapi.model.parameters.ChangeApplied; +import uk.ac.manchester.cs.owl.owlapi.concurrent.Concurrency; + +import java.io.*; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Collection; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.zip.GZIPInputStream; + +/** + * OWL API wrapper to facilitate building OWLOntology objects to load into the {@link org.monarchinitiative.owlsim.kb.impl.BMKnowledgeBaseOWLAPIImpl} + * + * @author Jules Jacobsen + */ +public class Ontology { + + private static final Logger logger = Logger.getLogger(Ontology.class); + + //OWLOntology is a mutable object + private final OntologySourceData sourceData; + private final CurieUtil curieUtil; + private final OWLOntology owlOntology; + + private final OWLOntologyManager ontologyManager; + + private Ontology(OntologySourceData sourceData, Concurrency concurrency) { + Objects.requireNonNull(sourceData, "Unable to create Ontology without data sources."); + this.sourceData = sourceData; + this.curieUtil = new CurieUtil(sourceData.getCuries()); + this.ontologyManager = createOntologyManager(concurrency); + this.owlOntology = createEmptyOntology(ontologyManager); + loadOwlOntology(); + } + + /** + * Loads an ontology using a concurrent OWLOntologyManager. + * + * @param sourceData + * @return An Ontology created from the source data provided. + */ + public static Ontology load(OntologySourceData sourceData) { + return new Ontology(sourceData, Concurrency.CONCURRENT); + } + + /** + * Loads an ontology using an OWLOntologyManager using the concurrency type specified. + * + * @param sourceData + * @param concurrency + * @return An Ontology created from the source data provided. + */ + public static Ontology load(OntologySourceData sourceData, Concurrency concurrency) { + return new Ontology(sourceData, useConcurrentIfNull(concurrency)); + } + + private static Concurrency useConcurrentIfNull(Concurrency concurrency) { + return concurrency == null ? Concurrency.CONCURRENT : concurrency; + } + + public OWLOntology getOwlOntology() { + return owlOntology; + } + + public OntologySourceData getSourceData() { + return sourceData; + } + + public CurieUtil getCurieUtil() { + return curieUtil; + } + + private void loadOwlOntology() { + //Order matters here - don't change it. + mergeOntologies(sourceData.getOntologies()); + mergeOntologies(sourceData.getDataOntologies()); + loadDataFromTsv(sourceData.getDataTsvs()); + loadDataFromPairwiseMappings(sourceData.getPairwiseMappings()); + logger.info("Ontology loaded"); + } + + private OWLOntologyManager createOntologyManager(Concurrency concurrencyType) { + if (concurrencyType == Concurrency.NON_CONCURRENT) { + logger.info("Using non-concurrent OWL ontology manager"); + return OWLManager.createOWLOntologyManager(); + } + logger.info("Using concurrent OWL ontology manager"); + return OWLManager.createConcurrentOWLOntologyManager(); + } + + private OWLOntology createEmptyOntology(OWLOntologyManager ontologyManager) { + try { + return ontologyManager.createOntology(); + } catch (OWLOntologyCreationException e) { + throw new OntologyLoadException(e); + } + } + + private OWLOntology mergeOntology(String uri) { + OWLOntology loadedOntology = loadOwlOntology(uri); + addAxioms(loadedOntology.getAxioms()); + return owlOntology; + } + + private OWLOntology mergeOntologies(Collection uris) { + uris.forEach(uri -> mergeOntology(uri)); + return owlOntology; + } + + private ChangeApplied addAxiom(OWLAxiom axiom) { + return ontologyManager.addAxiom(owlOntology, axiom); + } + + private ChangeApplied addAxioms(Set axioms) { + return ontologyManager.addAxioms(owlOntology, axioms); + } + + private OWLOntology loadOwlOntology(String uri) { + UrlValidator urlValidator = UrlValidator.getInstance(); + if (urlValidator.isValid(uri)) { + return loadRemoteOntology(IRI.create(uri)); + } else if (uri.endsWith(".gz")) { + return loadGzippedOntology(Paths.get(uri)); + } else { + return loadOwlOntologyFromDocument(Paths.get(uri)); + } + } + + private OWLOntology loadRemoteOntology(IRI iri) { + return loadOwlOntology(iri); + } + + private OWLOntology loadGzippedOntology(Path path) { + logger.info("Loading gzipped ontology from " + path); + try (InputStream is = new GZIPInputStream(new FileInputStream(path.toFile()))) { + return loadOwlOntologyFromDocument(is); + } catch (IOException e) { + throw new OntologyLoadException(e); + } + } + + private OWLOntology loadOwlOntology(IRI iri) { + try { + logger.info("Loading ontology from IRI" + iri.getShortForm()); + return ontologyManager.loadOntology(iri); + } catch (OWLOntologyCreationException e) { + throw new OntologyLoadException(e); + } + } + + private OWLOntology loadDataFromTsv(Collection paths) { + paths.forEach(this::loadDataFromTsv); + return owlOntology; + } + + private OWLOntology loadDataFromTsv(String path) { + if (path.endsWith(".gz")) { + return loadDataFromTsvGzip(path); + } + Path file = Paths.get(path); + logger.info("Reading tsv data from " + path); + try { + Files.lines(file).forEach(line -> loadLineIntoDataOntology(line)); + } catch (IOException e) { + throw new OntologyLoadException(e); + } + return owlOntology; + } + + private OWLOntology loadDataFromTsvGzip(String path) { + Path file = Paths.get(path); + logger.info("Reading gzipped tsv data from " + file); + try (GZIPInputStream gis = new GZIPInputStream(new FileInputStream(file.toFile())); + BufferedReader bf = new BufferedReader(new InputStreamReader(gis, Charset.forName("UTF-8"))) + ) { + bf.lines().forEach(line -> loadLineIntoDataOntology(line)); + } catch (IOException e) { + throw new OntologyLoadException(e); + } + return owlOntology; + } + + private void loadDataFromPairwiseMappings(Map pairwiseMappings) { + pairwiseMappings.forEach(this::addInstanceOf); + } + + private void loadLineIntoDataOntology(String line) { + String[] vals = line.split("\t", 2); + String[] terms = vals[1].split(";"); + for (String t : terms) { + addInstanceOf(vals[0], t); + } + } + + private void addInstanceOf(String individual, String ontologyClass) { +// logger.info("Adding axiom " + individual + ": " + ontologyClass); + OWLDataFactory owlDataFactory = ontologyManager.getOWLDataFactory(); + OWLClass owlClass = owlDataFactory.getOWLClass(toIri(ontologyClass)); + OWLNamedIndividual owlNamedIndividual = owlDataFactory.getOWLNamedIndividual(toIri(individual)); + OWLClassAssertionAxiom axiom = owlDataFactory.getOWLClassAssertionAxiom(owlClass, owlNamedIndividual); + addAxiom(axiom); + } + + private IRI toIri(String id) { + return IRI.create(curieUtil.getIri(id).orElse(id)); + } + + private OWLOntology loadOwlOntologyFromDocument(Path path) { + try { + logger.info("Loading ontology from document " + path); + return ontologyManager.loadOntologyFromOntologyDocument(path.toFile()); + } catch (OWLOntologyCreationException e) { + throw new OntologyLoadException(e); + } + } + + private OWLOntology loadOwlOntologyFromDocument(InputStream is) { + try { + return ontologyManager.loadOntologyFromOntologyDocument(is); + } catch (OWLOntologyCreationException e) { + logger.error("Unable to create ontology" + e); + throw new OntologyLoadException(e); + } + } +} + diff --git a/owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/OntologyLoadException.java b/owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/OntologyLoadException.java new file mode 100644 index 0000000..54751a7 --- /dev/null +++ b/owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/OntologyLoadException.java @@ -0,0 +1,14 @@ +package org.monarchinitiative.owlsim.io; + +/** + * @author Jules Jacobsen + */ +class OntologyLoadException extends RuntimeException { + + OntologyLoadException(String message) { + super(message); + } + + OntologyLoadException(Exception e) { + } +} diff --git a/owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/OntologySourceData.java b/owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/OntologySourceData.java new file mode 100644 index 0000000..8e47937 --- /dev/null +++ b/owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/OntologySourceData.java @@ -0,0 +1,193 @@ +package org.monarchinitiative.owlsim.io; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import org.monarchinitiative.owlsim.kb.BMKnowledgeBase; +import org.semanticweb.owlapi.model.OWLOntology; + +import java.io.File; +import java.util.*; + +/** + * Simple container for storing the original data sources used for constructing the {@link OWLOntology} and the + * {@link BMKnowledgeBase}. + * + * @author Jules Jacobsen + */ +public class OntologySourceData { + + private final List ontologies; + private final List dataOntologies; + + private final Map curies; + private final List dataTsvs; + //TODO: add these so people can programmatically add individual assertions + private final Map pairwiseMappings; + + private OntologySourceData(Builder builder) { + this.ontologies = distinctImmutableListOf(builder.ontologies); + this.dataOntologies = distinctImmutableListOf(builder.dataOntologies); + this.curies = ImmutableMap.copyOf(builder.curies); + this.dataTsvs = distinctImmutableListOf(builder.dataTsvs); + this.pairwiseMappings = ImmutableMap.copyOf(builder.pairwiseMappings); + } + + private ImmutableList distinctImmutableListOf(List list) { + return list.stream().distinct().collect(ImmutableList.toImmutableList()); + } + + public List getOntologies() { + return ontologies; + } + + public List getDataOntologies() { + return dataOntologies; + } + + public Map getCuries() { + return curies; + } + + public List getDataTsvs() { + return dataTsvs; + } + + public Map getPairwiseMappings() { + return pairwiseMappings; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + OntologySourceData that = (OntologySourceData) o; + return Objects.equals(ontologies, that.ontologies) && + Objects.equals(dataOntologies, that.dataOntologies) && + Objects.equals(curies, that.curies) && + Objects.equals(dataTsvs, that.dataTsvs) && + Objects.equals(pairwiseMappings, that.pairwiseMappings); + } + + @Override + public int hashCode() { + return Objects.hash(ontologies, dataOntologies, curies, dataTsvs, pairwiseMappings); + } + + @Override + public String toString() { + return "OntologySourceData{" + + "ontologies=" + ontologies + + ", dataOntologies=" + dataOntologies + + ", curies=" + curies + + ", dataTsvs=" + dataTsvs + + ", pairwiseMappings=" + pairwiseMappings + + '}'; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private List ontologies = new ArrayList<>(); + private List dataOntologies = new ArrayList<>(); + //Curies need to be supplied if people are adding data using TSV files or pairwise mappings using curies. + private Map curies = Collections.emptyMap(); + private List dataTsvs = new ArrayList<>(); + private Map pairwiseMappings = Collections.emptyMap(); + + private Builder(){ + //use the static method. + } + + /** + * @param curies + * @return + */ + public Builder curies(Map curies) { + this.curies = curies; + return this; + } + + /** + * Loads an OWL/OBO ontology from a file. + * + * @param file + */ + public Builder ontology(File file) { + ontologies.add(file.getAbsolutePath()); + return this; + } + + /** + * Loads an OWL/OBO ontology from a path. + * + * @param path + */ + public Builder ontology(String path) { + this.ontologies.add(path); + return this; + } + + public Builder ontologies(String... paths) { + this.ontologies.addAll(Arrays.asList(paths)); + return this; + } + + /** + * Loads, and merges the OWL/OBO ontologies from the paths given. These can be remote, local uncompressed or + * gzipped. + * + * @param paths + */ + public Builder ontologies(Collection paths) { + this.ontologies.addAll(paths); + return this; + } + + + public Builder dataOntology(String path) { + this.dataOntologies.add(path); + return this; + } + + public Builder dataOntologies(String... paths) { + this.dataOntologies.addAll(Arrays.asList(paths)); + return this; + } + + public Builder dataOntologies(Collection paths) { + this.dataOntologies.addAll(paths); + return this; + } + + public Builder dataTsv(String path) { + dataTsvs.add(path); + return this; + } + + public Builder dataTsv(String... paths) { + dataTsvs.addAll(Arrays.asList(paths)); + return this; + } + + public Builder dataTsv(Collection paths) { + dataTsvs.addAll(paths); + return this; + } + + public OntologySourceData build() { + if(ontologies.isEmpty()) { + throw new OntologyLoadException("No ontology defined."); + } + if (curies.isEmpty() && hasNonOntologyData()) { + throw new OntologyLoadException("Cannot load TSV data sources or pairwise mappings when curies have not been defined."); + } + return new OntologySourceData(this); + } + + private boolean hasNonOntologyData() { + return !dataTsvs.isEmpty() || !pairwiseMappings.isEmpty(); + } + } +} diff --git a/owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/OwlKnowledgeBase.java b/owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/OwlKnowledgeBase.java new file mode 100644 index 0000000..26f222b --- /dev/null +++ b/owlsim-core/src/main/java/org/monarchinitiative/owlsim/io/OwlKnowledgeBase.java @@ -0,0 +1,162 @@ +package org.monarchinitiative.owlsim.io; + +import org.apache.log4j.Logger; +import org.monarchinitiative.owlsim.kb.BMKnowledgeBase; +import org.monarchinitiative.owlsim.kb.impl.BMKnowledgeBaseOWLAPIImpl; +import org.semanticweb.elk.owlapi.ElkReasonerFactory; +import org.semanticweb.owlapi.model.OWLOntologyManager; +import org.semanticweb.owlapi.reasoner.OWLReasonerFactory; +import uk.ac.manchester.cs.owl.owlapi.concurrent.Concurrency; + +import java.io.File; +import java.util.Collection; +import java.util.Map; + +/** + * A convenience wrapper to enable easy loading of a {@link BMKnowledgeBase} from OWL ontologies and data files. + * + * @author Jules Jacobsen + */ +public abstract class OwlKnowledgeBase { + + private static final Logger logger = Logger.getLogger(OwlKnowledgeBase.class); + + private OwlKnowledgeBase() { + //class is uninstantiable + } + + public static Loader loader() { + return new Loader(); + } + + public static class Loader { + + private Concurrency concurrencyType = Concurrency.CONCURRENT; + private OWLReasonerFactory owlReasonerFactory = new ElkReasonerFactory(); + + //TODO: do we want to expose this or keep it here? Chris mentioned we might want a way of keeping track of what the original source data was. + //So this is where it is. It's so tightly coupled this is literally a conjoined twin at the moment. + private OntologySourceData.Builder sourceDataBuilder = OntologySourceData.builder(); + + private Loader() { + //uses the static load() method in the parent class + } + + /** + * @param curies + * @return + */ + public Loader loadCuries(Map curies) { + sourceDataBuilder.curies(curies); + return this; + } + + /** + * Loads an OWL/OBO ontology from a file. + * + * @param file + */ + public Loader loadOntology(File file) { + sourceDataBuilder.ontology(file); + return this; + } + + /** + * Loads an OWL/OBO ontology from a path. + * + * @param path + */ + public Loader loadOntology(String path) { + sourceDataBuilder.ontology(path); + return this; + } + + public Loader loadOntologies(String... paths) { + sourceDataBuilder.ontologies(paths); + return this; + } + + /** + * Loads, and merges the OWL/OBO ontologies from the paths given. These can be remote, local uncompressed or + * gzipped. + * + * @param paths + */ + public Loader loadOntologies(Collection paths) { + sourceDataBuilder.ontologies(paths); + return this; + } + + public Loader loadDataFromOntology(String path) { + sourceDataBuilder.dataOntology(path); + return this; + } + + public Loader loadDataFromOntologies(String... paths) { + sourceDataBuilder.dataOntologies(paths); + return this; + } + + public Loader loadDataFromOntologies(Collection paths) { + sourceDataBuilder.dataOntologies(paths); + return this; + } + + public Loader loadDataFromTsv(String path) { + sourceDataBuilder.dataTsv(path); + return this; + } + + public Loader loadDataFromTsv(String... paths) { + sourceDataBuilder.dataTsv(paths); + return this; + } + + public Loader loadDataFromTsv(Collection paths) { + sourceDataBuilder.dataTsv(paths); + return this; + } + + /** + * Creates an {@link OWLOntologyManager} that is configured with the standard parsers and storers and provides + * locking for concurrent access (default). + */ + public Loader useConcurrentOntologyManager() { + concurrencyType = Concurrency.CONCURRENT; + return this; + } + + /** + * Creates an {@link OWLOntologyManager} that is configured with standard parsers, + * storers etc. + */ + public Loader useStandardOntologyManager() { + concurrencyType = Concurrency.NON_CONCURRENT; + return this; + } + + /** + * Allows overriding of the default {@link ElkReasonerFactory} + * + * @param owlReasonerFactory a concrete implementation of the {@link OWLReasonerFactory} + */ + public Loader useReasonerFactory(OWLReasonerFactory owlReasonerFactory) { + this.owlReasonerFactory = owlReasonerFactory; + return this; + } + + /** + * @return handle for a Bitmap-based Knowledge Base + */ + public BMKnowledgeBase createKnowledgeBase() { + + OntologySourceData sourceData = sourceDataBuilder.build(); + Ontology ontology = Ontology.load(sourceData, concurrencyType); + + return BMKnowledgeBaseOWLAPIImpl.create(ontology, owlReasonerFactory); + } + + } + + +} diff --git a/owlsim-core/src/main/java/org/monarchinitiative/owlsim/kb/filter/FilterEngine.java b/owlsim-core/src/main/java/org/monarchinitiative/owlsim/kb/filter/FilterEngine.java index a13ea08..1bd5418 100644 --- a/owlsim-core/src/main/java/org/monarchinitiative/owlsim/kb/filter/FilterEngine.java +++ b/owlsim-core/src/main/java/org/monarchinitiative/owlsim/kb/filter/FilterEngine.java @@ -1,13 +1,12 @@ package org.monarchinitiative.owlsim.kb.filter; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - +import com.googlecode.javaewah.EWAHCompressedBitmap; import org.apache.log4j.Logger; import org.monarchinitiative.owlsim.kb.BMKnowledgeBase; -import com.googlecode.javaewah.EWAHCompressedBitmap; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; /** * Applies a {@link Filter} on a set of individuals. @@ -92,7 +91,7 @@ else if (filter instanceof TypeFilter) { else { typesBM = knowledgeBase.getTypesBM(id); } - LOG.info("typeId = " + tf.getTypeId()); +// LOG.info("typeId = " + tf.getTypeId()); int ix = knowledgeBase.getClassIndex(tf.getTypeId()); return typesBM.getPositions().contains(ix) ^ tf.isNegated(); } diff --git a/owlsim-core/src/test/java/org/monarchinitiative/owlsim/compute/classmatch/ClassMatcherTest.java b/owlsim-core/src/test/java/org/monarchinitiative/owlsim/compute/classmatch/ClassMatcherTest.java index cd8b00f..19ed604 100644 --- a/owlsim-core/src/test/java/org/monarchinitiative/owlsim/compute/classmatch/ClassMatcherTest.java +++ b/owlsim-core/src/test/java/org/monarchinitiative/owlsim/compute/classmatch/ClassMatcherTest.java @@ -1,25 +1,20 @@ package org.monarchinitiative.owlsim.compute.classmatch; -import static org.junit.Assert.*; - -import java.net.URISyntaxException; -import java.net.URL; -import java.util.List; - import org.apache.log4j.Logger; import org.junit.Test; -import org.monarchinitiative.owlsim.compute.mica.AbstractMICAStoreTest; -import org.monarchinitiative.owlsim.compute.mica.MICAStore; -import org.monarchinitiative.owlsim.compute.mica.impl.MICAStoreImpl; import org.monarchinitiative.owlsim.compute.mica.impl.NoRootException; -import org.monarchinitiative.owlsim.compute.stats.KBStatsCalculator; -import org.monarchinitiative.owlsim.io.OWLLoader; +import org.monarchinitiative.owlsim.io.OwlKnowledgeBase; import org.monarchinitiative.owlsim.kb.BMKnowledgeBase; import org.monarchinitiative.owlsim.kb.LabelMapper; -import org.semanticweb.owlapi.model.IRI; import org.semanticweb.owlapi.model.OWLOntologyCreationException; -import com.google.monitoring.runtime.instrumentation.common.com.google.common.io.Resources; +import java.net.URISyntaxException; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.Assert.assertEquals; public class ClassMatcherTest { @@ -28,18 +23,26 @@ private Logger LOG = Logger.getLogger(ClassMatcherTest.class); protected void load(String fn, String... ontfns) throws OWLOntologyCreationException, URISyntaxException, NoRootException { - OWLLoader loader = new OWLLoader(); - LOG.info("Loading: "+fn); - loader.load(IRI.create(Resources.getResource(fn))); - for (String ontfn : ontfns) { - URL res = getClass().getResource(ontfn); - LOG.info("RES="+res); - loader.loadOntologies(res.getFile()); - } - kb = loader.createKnowledgeBaseInterface(); +// OWLLoader loader = new OWLLoader(); +// LOG.info("Loading: "+fn); +// loader.load(IRI.create(Resources.getResource(fn))); +// for (String ontfn : ontfns) { +// URL res = getClass().getResource(ontfn); +// LOG.info("RES="+res); +// loader.ontologies(res.getFile()); +// } +// kb = loader.createKnowledgeBaseInterface(); + kb = OwlKnowledgeBase.loader() + .loadOntology(filePath(fn)) + .loadOntologies(Arrays.stream(ontfns).map(ontfn -> filePath(ontfn)).collect(Collectors.toList())) + .createKnowledgeBase(); classMatcher = new ClassMatcher(kb); } - + + private String filePath(String filename) { + return Paths.get("src/test/resources/", filename).toString(); + } + @Test public void selfTest() throws OWLOntologyCreationException, URISyntaxException, NoRootException { load("mp-subset.ttl"); diff --git a/owlsim-core/src/test/java/org/monarchinitiative/owlsim/compute/kb/impl/AbstractOwlTest.java b/owlsim-core/src/test/java/org/monarchinitiative/owlsim/compute/kb/impl/AbstractOwlTest.java index c048cf8..ef9fe9b 100644 --- a/owlsim-core/src/test/java/org/monarchinitiative/owlsim/compute/kb/impl/AbstractOwlTest.java +++ b/owlsim-core/src/test/java/org/monarchinitiative/owlsim/compute/kb/impl/AbstractOwlTest.java @@ -1,18 +1,16 @@ package org.monarchinitiative.owlsim.compute.kb.impl; -import java.net.URISyntaxException; -import java.util.Set; - +import com.googlecode.javaewah.EWAHCompressedBitmap; import org.apache.log4j.Logger; import org.junit.Assert; -import org.monarchinitiative.owlsim.io.OWLLoader; +import org.monarchinitiative.owlsim.io.OwlKnowledgeBase; import org.monarchinitiative.owlsim.kb.BMKnowledgeBase; import org.monarchinitiative.owlsim.kb.NonUniqueLabelException; -import org.semanticweb.owlapi.model.IRI; import org.semanticweb.owlapi.model.OWLOntologyCreationException; -import com.google.monitoring.runtime.instrumentation.common.com.google.common.io.Resources; -import com.googlecode.javaewah.EWAHCompressedBitmap; +import java.net.URISyntaxException; +import java.nio.file.Paths; +import java.util.Set; /** * Tests a OWLAPI implementation of a KB @@ -27,10 +25,12 @@ private Logger LOG = Logger.getLogger(AbstractOwlTest.class); protected BMKnowledgeBase kb; + protected void load(String fn) throws OWLOntologyCreationException, URISyntaxException { - OWLLoader loader = new OWLLoader(); - loader.load(IRI.create(Resources.getResource(fn))); - kb = loader.createKnowledgeBaseInterface(); +// OWLLoader loader = new OWLLoader(); +// loader.load(IRI.create(Resources.getResource(fn))); +// kb = loader.createKnowledgeBaseInterface(); + kb = OwlKnowledgeBase.loader().loadOntology(Paths.get("src/test/resources", fn).toString()).createKnowledgeBase(); } protected void checkContains(EWAHCompressedBitmap bm, diff --git a/owlsim-core/src/test/java/org/monarchinitiative/owlsim/compute/matcher/mp/AbstractProfileMatcherMPTest.java b/owlsim-core/src/test/java/org/monarchinitiative/owlsim/compute/matcher/mp/AbstractProfileMatcherMPTest.java index f75fde6..1a2ebab 100644 --- a/owlsim-core/src/test/java/org/monarchinitiative/owlsim/compute/matcher/mp/AbstractProfileMatcherMPTest.java +++ b/owlsim-core/src/test/java/org/monarchinitiative/owlsim/compute/matcher/mp/AbstractProfileMatcherMPTest.java @@ -1,14 +1,12 @@ package org.monarchinitiative.owlsim.compute.matcher.mp; -import java.util.List; -import java.util.Set; - +import com.google.common.collect.Sets; import org.apache.log4j.Logger; import org.junit.Assert; import org.junit.Test; import org.monarchinitiative.owlsim.compute.matcher.ProfileMatcher; import org.monarchinitiative.owlsim.io.JSONWriter; -import org.monarchinitiative.owlsim.io.OWLLoader; +import org.monarchinitiative.owlsim.io.OwlKnowledgeBase; import org.monarchinitiative.owlsim.kb.BMKnowledgeBase; import org.monarchinitiative.owlsim.model.match.Match; import org.monarchinitiative.owlsim.model.match.MatchSet; @@ -16,7 +14,8 @@ import org.monarchinitiative.owlsim.model.match.impl.ProfileQueryImpl; import org.semanticweb.owlapi.model.OWLOntologyCreationException; -import com.google.common.collect.Sets; +import java.util.List; +import java.util.Set; /** * Tests a ProfileMatcher using the sample mp-subset.ttl ontology @@ -229,13 +228,11 @@ private void testQuery(Set queryClassLabels, } private void load(String fn) throws OWLOntologyCreationException { - //Injector injector = Guice.createInjector(new ConfigModule()); - OWLLoader loader = new OWLLoader(); - loader.load("src/test/resources/"+fn); - ontology = loader.createKnowledgeBaseInterface(); - //profileMatcher = - // injector.getInstance(ProfileMatcher.class); - //profileMatcher = new MaximumInformationContentSimilarityProfileMatcher(ontology); +// OWLLoader loader = new OWLLoader(); +// loader.load("src/test/resources/"+fn); +// ontology = loader.createKnowledgeBaseInterface(); + + ontology = OwlKnowledgeBase.loader().loadOntology("src/test/resources/" + fn).createKnowledgeBase(); profileMatcher = createProfileMatcher(ontology); } diff --git a/owlsim-core/src/test/java/org/monarchinitiative/owlsim/compute/matcher/perf/HomologyPhenoPerfIT.java b/owlsim-core/src/test/java/org/monarchinitiative/owlsim/compute/matcher/perf/HomologyPhenoPerfIT.java index 2e39f74..e8e4270 100644 --- a/owlsim-core/src/test/java/org/monarchinitiative/owlsim/compute/matcher/perf/HomologyPhenoPerfIT.java +++ b/owlsim-core/src/test/java/org/monarchinitiative/owlsim/compute/matcher/perf/HomologyPhenoPerfIT.java @@ -1,28 +1,21 @@ package org.monarchinitiative.owlsim.compute.matcher.perf; -import java.io.IOException; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.junit.Test; import org.monarchinitiative.owlsim.compute.matcher.AbstractProfileMatcherTest; import org.monarchinitiative.owlsim.compute.matcher.ProfileMatcher; -import org.monarchinitiative.owlsim.compute.matcher.impl.BayesianNetworkProfileMatcher; -import org.monarchinitiative.owlsim.compute.matcher.impl.JaccardSimilarityProfileMatcher; -import org.monarchinitiative.owlsim.compute.matcher.impl.MaximumInformationContentSimilarityProfileMatcher; -import org.monarchinitiative.owlsim.compute.matcher.impl.NaiveBayesFixedWeightTwoStateProfileMatcher; -import org.monarchinitiative.owlsim.compute.matcher.impl.PhenodigmICProfileMatcher; +import org.monarchinitiative.owlsim.compute.matcher.impl.*; import org.monarchinitiative.owlsim.eval.ProfileMatchEvaluator; -import org.monarchinitiative.owlsim.io.OWLLoader; +import org.monarchinitiative.owlsim.io.OwlKnowledgeBase; import org.monarchinitiative.owlsim.io.ReadMappingsUtil; import org.monarchinitiative.owlsim.kb.filter.Filter; import org.monarchinitiative.owlsim.kb.filter.TypeFilter; import org.semanticweb.owlapi.model.OWLOntologyCreationException; +import java.io.IOException; +import java.util.*; + /** * Tests phenotype matcher by finding rank of each homolog when using that matcher * @@ -126,12 +119,19 @@ public void estimateAccuracy() throws Exception { } private void load() throws OWLOntologyCreationException, IOException { - OWLLoader loader = new OWLLoader(); - loader.loadGzippdOntology(getClass().getResource("/ontologies/mammal.obo.gz").getFile()); - loader.loadDataFromTsvGzip(getClass().getResource("/data/gene2taxon.tsv.gz").getFile()); - loader.loadDataFromTsvGzip(getClass().getResource("/data/mouse-pheno.assocs.gz").getFile()); - loader.loadDataFromTsvGzip(getClass().getResource("/data/human-pheno.assocs.gz").getFile()); - kb = loader.createKnowledgeBaseInterface(); + Map curies = new LinkedHashMap<>(); + curies.put("HP", "http://purl.obolibrary.org/obo/HP_"); + curies.put("MP", "http://purl.obolibrary.org/obo/MP_"); + curies.put("NCBITaxon", "http://purl.obolibrary.org/obo/NCBITaxon_"); + + kb = OwlKnowledgeBase.loader() + .loadCuries(curies) + .loadOntology("src/test/resources/ontologies/mammal.obo.gz") + .loadDataFromTsv( + "src/test/resources/data/gene2taxon.tsv.gz", + "src/test/resources/data/mouse-pheno.assocs.gz", + "src/test/resources/data/human-pheno.assocs.gz") + .createKnowledgeBase(); } diff --git a/owlsim-core/src/test/java/org/monarchinitiative/owlsim/io/OntologySourceDataTest.java b/owlsim-core/src/test/java/org/monarchinitiative/owlsim/io/OntologySourceDataTest.java new file mode 100644 index 0000000..c01b275 --- /dev/null +++ b/owlsim-core/src/test/java/org/monarchinitiative/owlsim/io/OntologySourceDataTest.java @@ -0,0 +1,42 @@ +package org.monarchinitiative.owlsim.io; + +import org.junit.Test; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author Jules Jacobsen + */ +public class OntologySourceDataTest { + + @Test + public void testItAll() { + + Map curies = new LinkedHashMap<>(); + curies.put("HP", "http://purl.obolibrary.org/obo/HP_"); + curies.put("MP", "http://purl.obolibrary.org/obo/MP_"); + curies.put("NCBITaxon", "http://purl.obolibrary.org/obo/NCBITaxon_"); + + OntologySourceData sourceData = OntologySourceData.builder() + .curies(curies) + .ontology("src/test/resources/ontologies/mammal.obo.gz") + .dataTsv("src/test/resources/data/gene2taxon.tsv.gz") + .dataTsv("src/test/resources/data/mouse-pheno.assocs.gz") + .dataTsv("src/test/resources/data/human-pheno.assocs.gz") + .build(); + + System.out.println(sourceData); + } + + @Test(expected = Exception.class) + public void testThrowsExceptionWhenCuriesEmptyAndDataIncludedFromTsv() { + + OntologySourceData sourceData = OntologySourceData.builder() + .dataTsv("src/test/resources/data/gene2taxon.tsv.gz") + .build(); + + System.out.println(sourceData); + } + +} \ No newline at end of file diff --git a/owlsim-core/src/test/java/org/monarchinitiative/owlsim/io/OwlKnowledgeBaseTest.java b/owlsim-core/src/test/java/org/monarchinitiative/owlsim/io/OwlKnowledgeBaseTest.java new file mode 100644 index 0000000..57fa1ec --- /dev/null +++ b/owlsim-core/src/test/java/org/monarchinitiative/owlsim/io/OwlKnowledgeBaseTest.java @@ -0,0 +1,169 @@ +package org.monarchinitiative.owlsim.io; + +import org.junit.Test; +import org.monarchinitiative.owlsim.kb.BMKnowledgeBase; +import uk.ac.manchester.cs.jfact.JFactFactory; + +import java.io.File; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.Map; + +import static org.junit.Assert.assertEquals; + +/** + * Utility class for creating a {@link BMKnowledgeBase} from input ontologies, curies and data. Ontologies can be in OWL + * or OBO format, gzipped or uncompressed. + * @author Jules Jacobsen + */ +public class OwlKnowledgeBaseTest { + + private static final String SPECIES_OWL = "src/test/resources/species.owl"; + + private Map curies() { + Map curies = new LinkedHashMap<>(); + curies.put("HP", "http://purl.obolibrary.org/obo/HP_"); + curies.put("MP", "http://purl.obolibrary.org/obo/MP_"); + curies.put("NCBITaxon", "http://purl.obolibrary.org/obo/NCBITaxon_"); + return curies; + } + + @Test + public void testLoadOwlFromFile() { + BMKnowledgeBase bmKnowledgeBase = OwlKnowledgeBase.loader() + .loadOntology(new File(SPECIES_OWL)) + .createKnowledgeBase(); + } + + @Test + public void testLoadOwlWithIndividualsFromFilePath() { + BMKnowledgeBase bmKnowledgeBase = OwlKnowledgeBase.loader() + .loadOntology(SPECIES_OWL) + .createKnowledgeBase(); + assertEquals(24, bmKnowledgeBase.getIndividualIdsInSignature().size()); + //why -1? This is because http://www.w3.org/2002/07/owl#Thing is also reported as class. + assertEquals(77, bmKnowledgeBase.getClassIdsInSignature().size() - 1); + } + + @Test + public void testLoadGzippedOboOntology() { + BMKnowledgeBase bmKnowledgeBase = OwlKnowledgeBase.loader() + .loadOntology("src/test/resources/ontologies/mammal.obo.gz") + .createKnowledgeBase(); + } + + @Test + public void testLoadOntologiesFromMultipleSources() { + BMKnowledgeBase bmKnowledgeBase = OwlKnowledgeBase.loader() + .loadOntologies( + Arrays.asList("src/test/resources/species.owl", + "http://purl.obolibrary.org/obo/aeo.owl", + "src/test/resources/ontologies/mammal.obo.gz") + ) + .createKnowledgeBase(); + } + + /** + * Ignored so as not to use network - this is a slow test + */ +// @Ignore + @Test + public void testLoadRemoteOntology() { + BMKnowledgeBase bmKnowledgeBase = OwlKnowledgeBase.loader() + .loadOntology("http://purl.obolibrary.org/obo/aeo.owl") + .createKnowledgeBase(); + } + + @Test(expected = OntologyLoadException.class) + public void testLoadGzippedDataFileNoOntology() { + BMKnowledgeBase bmKnowledgeBase = OwlKnowledgeBase.loader() + .loadDataFromTsv("src/test/resources/data/human-pheno.assocs.gz") + .createKnowledgeBase(); + } + + @Test + public void loadDataFromOntology() { + BMKnowledgeBase bmKnowledgeBase = OwlKnowledgeBase.loader() + .loadOntology("src/test/resources/species.owl") + .loadCuries(curies()) + .loadDataFromOntology("src/test/resources/species.owl") + .createKnowledgeBase(); + } + + @Test + public void loadDataFromOntologies() { + BMKnowledgeBase bmKnowledgeBase = OwlKnowledgeBase.loader() + .loadOntology("src/test/resources/ontologies/mammal.obo.gz") + .loadCuries(curies()) + .loadDataFromOntologies("src/test/resources/mp-subset.ttl", "src/test/resources/mp-subset.ttl") + .createKnowledgeBase(); + } + + @Test + public void loadDataFromTsv() { + BMKnowledgeBase bmKnowledgeBase = OwlKnowledgeBase.loader() + .loadCuries(curies()) + .loadOntology("src/test/resources/ontologies/mammal.obo.gz") + .loadDataFromTsv("src/test/resources/data/human-pheno.assocs.gz") + .createKnowledgeBase(); + } + + @Test + public void loadDataFromGzippedTsv() { + BMKnowledgeBase bmKnowledgeBase = OwlKnowledgeBase.loader() + .loadCuries(curies()) + .loadOntology("src/test/resources/ontologies/mammal.obo.gz") + .loadDataFromTsv("src/test/resources/data/human-pheno.assocs.gz") + .createKnowledgeBase(); + } + + @Test + public void loadDataFromTsvCollection() { + BMKnowledgeBase bmKnowledgeBase = OwlKnowledgeBase.loader() + .loadCuries(curies()) + .loadOntology("src/test/resources/ontologies/mammal.obo.gz") + .loadDataFromTsv(Arrays.asList( + "src/test/resources/data/gene2taxon.tsv.gz", + "src/test/resources/data/mouse-pheno.assocs.gz", + "src/test/resources/data/human-pheno.assocs.gz")) + .createKnowledgeBase(); + + //|classes|=38627 + //|individuals|=14200 + //What should this be? It's different from the OWLLoader version. + //Turns out that without the correct curies the classes are not properly resolved so there will be 53630 classes + // without any curies. About 40,000-odd without the MP curie and 38629 without the NCBITaxon curie (1 mouse, 1 + // human class). + //So remember folks, curies are good, especially with poppadums and beer. + + //lastly, why -1? This is because http://www.w3.org/2002/07/owl#Thing is also reported as class. + assertEquals(38627, bmKnowledgeBase.getClassIdsInSignature().size() - 1); + assertEquals(14200, bmKnowledgeBase.getIndividualIdsInSignature().size()); + } + + @Test + public void testLoadOwlFromFileLocationWithStandardOntologyManager() throws Exception { + BMKnowledgeBase bmKnowledgeBase = OwlKnowledgeBase.loader() + .useStandardOntologyManager() + .loadOntology(SPECIES_OWL) + .createKnowledgeBase(); + } + + @Test + public void canSpecifyConcurrentOntologyManager() { + OwlKnowledgeBase.loader().useConcurrentOntologyManager(); + } + + @Test + public void canSpecifyStandardOntologyManager() { + OwlKnowledgeBase.loader().useStandardOntologyManager(); + } + + @Test + public void testUseOtherOwlReasonerFactory() throws Exception { + BMKnowledgeBase bmKnowledgeBase = OwlKnowledgeBase.loader() + .useReasonerFactory(new JFactFactory()) + .loadOntology(SPECIES_OWL) + .createKnowledgeBase(); + } +} \ No newline at end of file diff --git a/owlsim-services/src/main/java/org/monarchinitiative/owlsim/services/modules/KnowledgeBaseModule.java b/owlsim-services/src/main/java/org/monarchinitiative/owlsim/services/modules/KnowledgeBaseModule.java index e6b76c7..8042ad7 100644 --- a/owlsim-services/src/main/java/org/monarchinitiative/owlsim/services/modules/KnowledgeBaseModule.java +++ b/owlsim-services/src/main/java/org/monarchinitiative/owlsim/services/modules/KnowledgeBaseModule.java @@ -1,19 +1,13 @@ package org.monarchinitiative.owlsim.services.modules; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Collection; -import java.util.Map; -import java.util.Set; -import java.util.zip.GZIPInputStream; - -import javax.inject.Singleton; - +import com.google.common.collect.ImmutableCollection; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.inject.AbstractModule; +import com.google.inject.Provides; +import com.google.inject.Singleton; import org.apache.commons.validator.routines.UrlValidator; +import org.jboss.logging.Logger; import org.monarchinitiative.owlsim.compute.classmatch.ClassMatcher; import org.monarchinitiative.owlsim.compute.enrich.impl.HypergeometricEnrichmentEngine; import org.monarchinitiative.owlsim.compute.matcher.impl.BayesianNetworkProfileMatcher; @@ -32,32 +26,51 @@ import org.semanticweb.owlapi.model.OWLOntologyManager; import org.semanticweb.owlapi.reasoner.OWLReasonerFactory; -import com.google.common.collect.ImmutableCollection; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; +import java.io.*; +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.zip.GZIPInputStream; /** - * TODO - rewrite this - * - * Reduce duplication of code with OWLLoader - * + * TODO: Uncomment the OwlKnowledgeBase code and remove unecessary code once happy. */ public class KnowledgeBaseModule extends AbstractModule { + Logger logger = Logger.getLogger(KnowledgeBaseModule.class); + private final ImmutableCollection ontologyUris; private final ImmutableCollection ontologyDataUris; private final ImmutableCollection dataTsvs; private final ImmutableMap curies; private final UrlValidator urlValdiator = UrlValidator.getInstance(); - public KnowledgeBaseModule(Collection ontologyUris, Collection ontologyDataUris, - Set dataTsvs, Map curies) { +// private final BMKnowledgeBase bmKnowledgeBase; + + public KnowledgeBaseModule(Collection ontologyUris, Collection ontologyDataUris, Set dataTsvs, Map curies) { this.ontologyUris = new ImmutableSet.Builder().addAll(ontologyUris).build(); this.ontologyDataUris = new ImmutableSet.Builder().addAll(ontologyDataUris).build(); this.dataTsvs = new ImmutableSet.Builder().addAll(dataTsvs).build(); this.curies = new ImmutableMap.Builder().putAll(curies).build(); + + logger.info("Loading ontologyUris:"); + ontologyUris.forEach(logger::info); + logger.info("Loading ontologyDataUris:"); + ontologyDataUris.forEach(logger::info); + logger.info("Loading dataTsvs:"); + dataTsvs.forEach(logger::info); + logger.info("Loading curies:"); + curies.entrySet().forEach(logger::info); + +// //The OwlKnowledgeBase.Loader uses the ELKReasonerFactory and Concurrency.CONCURRENT as defaults. +// this.bmKnowledgeBase = OwlKnowledgeBase.loader() +// .loadOntologies(ontologyUris) +// .loadDataFromOntologies(ontologyDataUris) +// .loadDataFromTsv(dataTsvs) +// .loadCuries(curies) +// .createKnowledgeBase(); +// +// logger.info("Created BMKnowledgebase"); } @Override @@ -65,18 +78,22 @@ protected void configure() { bind(BMKnowledgeBase.class).to(BMKnowledgeBaseOWLAPIImpl.class).in(Singleton.class); bind(OWLReasonerFactory.class).to(ElkReasonerFactory.class); bind(CurieUtil.class).toInstance(new CurieUtil(curies)); + // bind(OWLOntologyManager.class).to(OWLOntologyManagerImpl.class); // bind(ReadWriteLock.class).to(NoOpReadWriteLock.class); // bind(OWLDataFactory.class).to(OWLDataFactoryImpl.class); // bind(OWLOntologyManager.class).toInstance(OWLManager.createOWLOntologyManager()); } +// @Provides +// BMKnowledgeBase provideBMKnowledgeBaseOWLAPIImpl() { +// return bmKnowledgeBase; +// } + @Provides BMKnowledgeBaseOWLAPIImpl provideBMKnowledgeBaseOWLAPIImpl(@IndicatesOwlOntologies OWLOntology owlOntology, @IndicatesOwlDataOntologies OWLOntology owlDataOntology, OWLReasonerFactory rf, CurieUtil curieUtil) { - BMKnowledgeBaseOWLAPIImpl bMKnowledgeBaseOWLAPIImpl = new BMKnowledgeBaseOWLAPIImpl(owlOntology, - owlDataOntology, rf, curieUtil); - return bMKnowledgeBaseOWLAPIImpl; + return new BMKnowledgeBaseOWLAPIImpl(owlOntology,owlDataOntology, rf, curieUtil); } OWLOntology loadOntology(OWLOntologyManager manager, String uri) throws OWLOntologyCreationException {