Permalink
Browse files

Issue #57 Added methods to enable adding individuals to the Ontology …

…via the OwlKnowledgeBase and the OntologyDataSource.
  • Loading branch information...
1 parent bdee79f commit ed630569b7ca03021320e766fb5d505b0240f472 @julesjacobsen julesjacobsen committed Mar 15, 2017
@@ -17,6 +17,7 @@
import java.util.Map;
import java.util.Objects;
import java.util.Set;
+import java.util.function.BiConsumer;
import java.util.zip.GZIPInputStream;
/**
@@ -34,13 +35,15 @@
private final OWLOntology owlOntology;
private final OWLOntologyManager ontologyManager;
+ private final OWLDataFactory owlDataFactory;
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);
+ this.owlDataFactory = ontologyManager.getOWLDataFactory();
loadOwlOntology();
}
@@ -81,12 +84,29 @@ public CurieUtil getCurieUtil() {
return curieUtil;
}
+ /**
+ * @param curie
+ * @return
+ */
+ public OWLClass getOWLClass(String curie) {
+ return owlDataFactory.getOWLClass(toIri(curie));
+ }
+
+ public OWLNamedIndividual getOWLNamedIndividual(String curie) {
+ return owlDataFactory.getOWLNamedIndividual(toIri(curie));
+ }
+
+ public String toCurie(IRI iri) {
+ String iriString = iri.toString();
+ return curieUtil.getCurie(iriString).orElse(iriString);
+ }
+
private void loadOwlOntology() {
//Order matters here - don't change it.
mergeOntologies(sourceData.getOntologies());
mergeOntologies(sourceData.getDataOntologies());
loadDataFromTsv(sourceData.getDataTsvs());
- loadDataFromPairwiseMappings(sourceData.getPairwiseMappings());
+ loadDataFromMap(sourceData.getIndividuals());
logger.info("Ontology loaded");
}
@@ -191,8 +211,20 @@ private OWLOntology loadDataFromTsvGzip(String path) {
return owlOntology;
}
- private void loadDataFromPairwiseMappings(Map<String, String> pairwiseMappings) {
- pairwiseMappings.forEach(this::addInstanceOf);
+ private void loadDataFromMap(Map<String, Collection<String>> individuals) {
+ if(!individuals.isEmpty()){
+ logger.info("Loading individuals from map");
+ }
+ //e.g. 'ORPHA:710': ['HP:0000194','HP:0000218','HP:0000262','HP:0000303','HP:0000316']
+ individuals.forEach(addIndividual());
+ }
+
+ private BiConsumer<String, Collection<String>> addIndividual() {
+ return (individual, annotations) -> {
+ for (String curie : annotations) {
+ addInstanceOf(individual, curie);
+ }
+ };
}
private void loadLineIntoDataOntology(String line) {
@@ -204,15 +236,18 @@ private void loadLineIntoDataOntology(String line) {
}
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);
+ Objects.requireNonNull(individual, "Individual identifier cannot be null. Check your input.");
+ Objects.requireNonNull(ontologyClass, "Class identifier(s) cannot be null. Check your input.");
+ if (!ontologyClass.isEmpty()) {
+// logger.info("Adding axiom " + individual + ": " + ontologyClass);
+ OWLClass owlClass = getOWLClass(ontologyClass);
+ OWLNamedIndividual owlNamedIndividual = getOWLNamedIndividual(individual);
+ OWLClassAssertionAxiom axiom = owlDataFactory.getOWLClassAssertionAxiom(owlClass, owlNamedIndividual);
+ addAxiom(axiom);
+ }
}
- private IRI toIri(String id) {
+ IRI toIri(String id) {
return IRI.create(curieUtil.getIri(id).orElse(id));
}
@@ -20,16 +20,17 @@
private final List<String> dataOntologies;
private final Map<String, String> curies;
+ //TODO: shouldn't this be individualsTsvs?
private final List<String> dataTsvs;
- //TODO: add these so people can programmatically add individual assertions
- private final Map<String, String> pairwiseMappings;
+ private final Map<String, Collection<String>> individuals;
+ //TODO - labels?
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);
+ this.individuals = ImmutableMap.copyOf(builder.individuals);
}
private ImmutableList<String> distinctImmutableListOf(List<String> list) {
@@ -52,8 +53,8 @@ private OntologySourceData(Builder builder) {
return dataTsvs;
}
- public Map<String, String> getPairwiseMappings() {
- return pairwiseMappings;
+ public Map<String, Collection<String>> getIndividuals() {
+ return individuals;
}
@Override
@@ -65,12 +66,12 @@ public boolean equals(Object o) {
Objects.equals(dataOntologies, that.dataOntologies) &&
Objects.equals(curies, that.curies) &&
Objects.equals(dataTsvs, that.dataTsvs) &&
- Objects.equals(pairwiseMappings, that.pairwiseMappings);
+ Objects.equals(individuals, that.individuals);
}
@Override
public int hashCode() {
- return Objects.hash(ontologies, dataOntologies, curies, dataTsvs, pairwiseMappings);
+ return Objects.hash(ontologies, dataOntologies, curies, dataTsvs, individuals);
}
@Override
@@ -80,7 +81,7 @@ public String toString() {
", dataOntologies=" + dataOntologies +
", curies=" + curies +
", dataTsvs=" + dataTsvs +
- ", pairwiseMappings=" + pairwiseMappings +
+ ", individuals=" + individuals +
'}';
}
@@ -94,7 +95,7 @@ public static Builder builder() {
//Curies need to be supplied if people are adding data using TSV files or pairwise mappings using curies.
private Map<String, String> curies = Collections.emptyMap();
private List<String> dataTsvs = new ArrayList<>();
- private Map<String, String> pairwiseMappings = Collections.emptyMap();
+ private Map<String, Collection<String>> individuals = new HashMap<>();
private Builder(){
//use the static method.
@@ -176,6 +177,11 @@ public Builder dataTsv(Collection<String> paths) {
return this;
}
+ public Builder data(Map<String, ? extends Collection<String>> mappings) {
+ individuals.putAll(mappings);
+ return this;
+ }
+
public OntologySourceData build() {
if(ontologies.isEmpty()) {
throw new OntologyLoadException("No ontology defined.");
@@ -187,7 +193,7 @@ public OntologySourceData build() {
}
private boolean hasNonOntologyData() {
- return !dataTsvs.isEmpty() || !pairwiseMappings.isEmpty();
+ return !dataTsvs.isEmpty() || !individuals.isEmpty();
}
}
}
@@ -57,7 +57,6 @@ public Loader loadCuries(Map<String, String> curies) {
* @param file
*/
public Loader loadOntology(File file) {
- Math.random();
sourceDataBuilder.ontology(file);
return this;
}
@@ -118,6 +117,11 @@ public Loader loadDataFromTsv(Collection<String> paths) {
return this;
}
+ public Loader loadDataFromMap(Map<String, ? extends Collection<String>> data) {
+ sourceDataBuilder.data(data);
+ return this;
+ }
+
/**
* Creates an {@link OWLOntologyManager} that is configured with the standard parsers and storers and provides
* locking for concurrent access (default).
@@ -2,7 +2,9 @@
import org.junit.Test;
+import java.util.Arrays;
import java.util.LinkedHashMap;
+import java.util.List;
import java.util.Map;
/**
@@ -18,12 +20,37 @@ public void testItAll() {
curies.put("MP", "http://purl.obolibrary.org/obo/MP_");
curies.put("NCBITaxon", "http://purl.obolibrary.org/obo/NCBITaxon_");
+ Map<String, List<String>> individuals = new LinkedHashMap<>();
+ individuals.put("ORPHA:710", Arrays.asList("HP:0000194",
+ "HP:0000218",
+ "HP:0000262",
+ "HP:0000303",
+ "HP:0000316",
+ "HP:0000322",
+ "HP:0000324",
+ "HP:0000348",
+ "HP:0000431",
+ "HP:0000470",
+ "HP:0000508",
+ "HP:0001156",
+ "HP:0001385",
+ "HP:0003307",
+ "HP:0004209",
+ "HP:0004322",
+ "HP:0005048",
+ "HP:0006101",
+ "HP:0009773",
+ "HP:0010669",
+ "HP:0011304",
+ "HP:0012368", ""));
+
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")
+ .data(individuals)
.build();
System.out.println(sourceData);
Oops, something went wrong.

0 comments on commit ed63056

Please sign in to comment.