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 {