diff --git a/.github/workflows/qc.yml b/.github/workflows/qc.yml
index 6ad5c84..bcd67b0 100644
--- a/.github/workflows/qc.yml
+++ b/.github/workflows/qc.yml
@@ -19,7 +19,7 @@ jobs:
ontology_qc:
# The type of runner that the job will run on
runs-on: ubuntu-latest
- container: obolibrary/odkfull:v1.6
+ container: obolibrary/odkfull:v1.6.1
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
diff --git a/docs/odk-workflows/RepositoryFileStructure.md b/docs/odk-workflows/RepositoryFileStructure.md
index b12b8b0..5c34042 100644
--- a/docs/odk-workflows/RepositoryFileStructure.md
+++ b/docs/odk-workflows/RepositoryFileStructure.md
@@ -19,6 +19,8 @@ These are the current imports in IDPO
| ro | http://purl.obolibrary.org/obo/ro.owl | slme |
| omo | http://purl.obolibrary.org/obo/omo.owl | slme |
| bfo | http://purl.obolibrary.org/obo/bfo.owl | slme |
+| go | http://purl.obolibrary.org/obo/go.owl | slme |
+| iao | http://purl.obolibrary.org/obo/iao.owl | slme |
## Components
Components, in contrast to imports, are considered full members of the ontology. This means that any axiom in a component is also included in the ontology base - which means it is considered _native_ to the ontology. While this sounds complicated, consider this: conceptually, no component should be part of more than one ontology. If that seems to be the case, we are most likely talking about an import. Components are often not needed for ontologies, but there are some use cases:
diff --git a/src/ontology/Makefile b/src/ontology/Makefile
index ff93f2c..38c93ce 100644
--- a/src/ontology/Makefile
+++ b/src/ontology/Makefile
@@ -1,7 +1,7 @@
# ----------------------------------------
# Makefile for idpo
# Generated using ontology-development-kit
-# ODK Version: v1.6
+# ODK Version: v1.6.1
# ----------------------------------------
# IMPORTANT: DO NOT EDIT THIS FILE. To override default make goals, use idpo.Makefile instead
@@ -10,7 +10,7 @@
# More information: https://github.com/INCATools/ontology-development-kit/
# Fingerprint of the configuration file when this Makefile was last generated
-CONFIG_HASH= 85e84f816ca42dc77e6261e6ed6f9b757a7fd91496e00b26a9312398d2e403b9
+CONFIG_HASH= 98b52c17665ae96ff0faa9ab8d0db7ef77748df8fe2cf20122e9cab3604e090b
# ----------------------------------------
@@ -49,7 +49,7 @@ REPORT_PROFILE_OPTS = --profile $(ROBOT_PROFILE)
OBO_FORMAT_OPTIONS = --clean-obo "strict drop-untranslatable-axioms"
SPARQL_VALIDATION_CHECKS = owldef-self-reference iri-range label-with-iri multiple-replaced_by
SPARQL_EXPORTS = basic-report class-count-by-prefix edges xrefs obsoletes synonyms
-ODK_VERSION_MAKEFILE = v1.6
+ODK_VERSION_MAKEFILE = v1.6.1
RELAX_OPTIONS = --include-subclass-of true
REDUCE_OPTIONS = --include-subproperties true
@@ -188,9 +188,9 @@ all_main: $(MAIN_FILES)
# ----------------------------------------
-IMPORTS = ro omo bfo
+IMPORTS = ro omo bfo go iao
-IMPORT_ROOTS = $(patsubst %, $(IMPORTDIR)/%_import, $(IMPORTS))
+IMPORT_ROOTS = $(IMPORTDIR)/merged_import
IMPORT_OWL_FILES = $(foreach n,$(IMPORT_ROOTS), $(n).owl)
IMPORT_FILES = $(IMPORT_OWL_FILES)
@@ -274,10 +274,10 @@ endif
# ----------------------------------------
$(REPORTDIR)/$(SRC)-obo-report.tsv: $(SRCMERGED) | $(REPORTDIR)
- $(ROBOT) report -i $< $(REPORT_LABEL) $(REPORT_PROFILE_OPTS) --fail-on $(REPORT_FAIL_ON) --print 5 -o $@
+ $(ROBOT) report -i $< $(REPORT_LABEL) $(REPORT_PROFILE_OPTS) --fail-on $(REPORT_FAIL_ON) --base-iri $(URIBASE)/IDPO_ --base-iri $(URIBASE)/idpo --print 5 -o $@
$(REPORTDIR)/%-obo-report.tsv: % | $(REPORTDIR)
- $(ROBOT) report -i $< $(REPORT_LABEL) $(REPORT_PROFILE_OPTS) --fail-on $(REPORT_FAIL_ON) --print 5 -o $@
+ $(ROBOT) report -i $< $(REPORT_LABEL) $(REPORT_PROFILE_OPTS) --fail-on $(REPORT_FAIL_ON) --base-iri $(URIBASE)/IDPO_ --base-iri $(URIBASE)/idpo --print 5 -o $@
check_for_robot_updates:
@cut -f2 "/tools/templates/src/ontology/profile.txt" | sort > $(TMPDIR)/sorted_tsv2.txt
@@ -403,25 +403,23 @@ ANNOTATION_PROPERTIES=rdfs:label IAO:0000115 OMO:0002000
ifeq ($(IMP),true)
-## Default module type (slme)
-$(IMPORTDIR)/%_import.owl: $(MIRRORDIR)/%.owl $(IMPORTDIR)/%_terms.txt \
- $(IMPORTSEED) | all_robot_plugins
- $(ROBOT) annotate --input $< --remove-annotations \
- odk:normalize --add-source true \
- extract --term-file $(IMPORTDIR)/$*_terms.txt $(T_IMPORTSEED) \
- --force true --copy-ontology-annotations true \
- --individuals include \
+ALL_TERMS = $(foreach imp, $(IMPORTS), $(IMPORTDIR)/$(imp)_terms.txt)
+
+$(IMPORTDIR)/merged_import.owl: $(MIRRORDIR)/merged.owl $(ALL_TERMS) \
+ $(IMPORTSEED) | all_robot_plugins
+ $(ROBOT) merge --input $< \
+ extract $(foreach f, $(ALL_TERMS), --term-file $(f)) $(T_IMPORTSEED) \
+ --force true --copy-ontology-annotations false \
+ --individuals exclude \
--method BOT \
remove $(foreach p, $(ANNOTATION_PROPERTIES), --term $(p)) \
- --term-file $(IMPORTDIR)/$*_terms.txt $(T_IMPORTSEED) \
+ $(foreach f, $(ALL_TERMS), --term-file $(f)) $(T_IMPORTSEED) \
--select complement --select annotation-properties \
odk:normalize --base-iri http://purl.obolibrary.org/obo \
--subset-decls true --synonym-decls true \
repair --merge-axiom-annotations true \
$(ANNOTATE_CONVERT_FILE)
-.PRECIOUS: $(IMPORTDIR)/%_import.owl
-
endif # IMP=true
.PHONY: refresh-imports
@@ -459,7 +457,7 @@ ifeq ($(MIR),true)
.PHONY: mirror-ro
.PRECIOUS: $(MIRRORDIR)/ro.owl
mirror-ro: | $(TMPDIR)
- curl -L $(OBOBASE)/ro.owl --create-dirs -o $(TMPDIR)/ro-download.owl --retry 4 --max-time 200 && \
+ curl -L $(OBOBASE)/ro/ro-base.owl --create-dirs -o $(TMPDIR)/ro-download.owl --retry 4 --max-time 200 && \
$(ROBOT) convert -i $(TMPDIR)/ro-download.owl -o $(TMPDIR)/$@.owl
@@ -479,6 +477,31 @@ mirror-bfo: | $(TMPDIR)
$(ROBOT) convert -i $(TMPDIR)/bfo-download.owl -o $(TMPDIR)/$@.owl
+## ONTOLOGY: go
+.PHONY: mirror-go
+.PRECIOUS: $(MIRRORDIR)/go.owl
+mirror-go: | $(TMPDIR)
+ curl -L $(OBOBASE)/go/go-base.owl --create-dirs -o $(TMPDIR)/go-download.owl --retry 4 --max-time 200 && \
+ $(ROBOT) convert -i $(TMPDIR)/go-download.owl -o $(TMPDIR)/$@.owl
+
+
+## ONTOLOGY: iao
+.PHONY: mirror-iao
+.PRECIOUS: $(MIRRORDIR)/iao.owl
+mirror-iao: | $(TMPDIR)
+ curl -L $(OBOBASE)/iao.owl --create-dirs -o $(TMPDIR)/iao-download.owl --retry 4 --max-time 200 && \
+ $(ROBOT) convert -i $(TMPDIR)/iao-download.owl -o $(TMPDIR)/$@.owl
+
+ALL_MIRRORS = $(patsubst %, $(MIRRORDIR)/%.owl, $(IMPORTS))
+MERGE_MIRRORS = true
+
+ifeq ($(MERGE_MIRRORS),true)
+$(MIRRORDIR)/merged.owl: $(ALL_MIRRORS)
+ $(ROBOT) merge $(patsubst %, -i %, $^) -o $@
+.PRECIOUS: $(MIRRORDIR)/merged.owl
+endif
+
+
$(MIRRORDIR)/%.owl: mirror-% | $(MIRRORDIR)
if [ -f $(TMPDIR)/mirror-$*.owl ]; then if cmp -s $(TMPDIR)/mirror-$*.owl $@ ; then echo "Mirror identical, ignoring."; else echo "Mirrors different, updating." &&\
cp $(TMPDIR)/mirror-$*.owl $@; fi; fi
diff --git a/src/ontology/catalog-v001.xml b/src/ontology/catalog-v001.xml
index 1c11d49..59ae2b9 100644
--- a/src/ontology/catalog-v001.xml
+++ b/src/ontology/catalog-v001.xml
@@ -1,8 +1,6 @@
-
-
-
+
\ No newline at end of file
diff --git a/src/ontology/idpo-edit.owl b/src/ontology/idpo-edit.owl
index e399aff..833aead 100644
--- a/src/ontology/idpo-edit.owl
+++ b/src/ontology/idpo-edit.owl
@@ -7,9 +7,7 @@ Prefix(rdfs:=)
Ontology(
-Import()
-Import()
-Import()
+Import()
Annotation( )
Annotation( )
Annotation( )
diff --git a/src/ontology/idpo-odk.yaml b/src/ontology/idpo-odk.yaml
index dbc6b03..1a84cb3 100644
--- a/src/ontology/idpo-odk.yaml
+++ b/src/ontology/idpo-odk.yaml
@@ -13,14 +13,21 @@ export_formats:
- obo
- json
import_group:
+ use_base_merging: TRUE
+ slme_individuals: exclude
products:
- id: ro
+ use_base: TRUE
- id: omo
- id: bfo
+ - id: go
+ use_base: TRUE
+ - id: iao
documentation:
documentation_system: mkdocs
robot_java_args: "-Xmx8G"
robot_report:
+ use_base_iris: TRUE
use_labels: TRUE
fail_on: ERROR
custom_profile: TRUE
diff --git a/src/ontology/imports/go_terms.txt b/src/ontology/imports/go_terms.txt
new file mode 100644
index 0000000..77764cf
--- /dev/null
+++ b/src/ontology/imports/go_terms.txt
@@ -0,0 +1,5 @@
+GO:0003674
+GO:0016301
+GO:0003824
+GO:0016740
+GO:0016772
\ No newline at end of file
diff --git a/src/ontology/imports/iao_terms.txt b/src/ontology/imports/iao_terms.txt
new file mode 100644
index 0000000..a3aa68a
--- /dev/null
+++ b/src/ontology/imports/iao_terms.txt
@@ -0,0 +1 @@
+IAO:0000030
\ No newline at end of file
diff --git a/src/ontology/imports/merged_import.owl b/src/ontology/imports/merged_import.owl
new file mode 100644
index 0000000..6a47fab
--- /dev/null
+++ b/src/ontology/imports/merged_import.owl
@@ -0,0 +1,830 @@
+Prefix(:=)
+Prefix(owl:=)
+Prefix(rdf:=)
+Prefix(xml:=)
+Prefix(xsd:=)
+Prefix(rdfs:=)
+
+
+Ontology(
+
+Annotation(owl:versionInfo "2026-04-21")
+
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(Class())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(ObjectProperty())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty(rdfs:label))
+############################
+# Annotation Properties
+############################
+
+# Annotation Property: (example of usage)
+
+AnnotationAssertion( "A phrase describing how a term should be used and/or a citation to a work which uses it. May also include other kinds of examples that facilitate immediate understanding, such as widely know prototypes or instances of a class, or cases where a relation is said to hold."@en)
+AnnotationAssertion( "GROUP:OBI:"@en)
+AnnotationAssertion(rdfs:label "example of usage"@en)
+
+# Annotation Property: (definition)
+
+AnnotationAssertion( "The official definition, explaining the meaning of a class or property. Shall be Aristotelian, formalized and normalized. Can be augmented with colloquial definitions."@en)
+AnnotationAssertion( "GROUP:OBI:"@en)
+AnnotationAssertion(rdfs:label "definition"@en)
+
+# Annotation Property: (definition source)
+
+AnnotationAssertion( "Formal citation, e.g. identifier in external database to indicate / attribute source(s) for the definition. Free text indicate / attribute source(s) for the definition. EXAMPLE: Author Name, URI, MeSH Term C04, PUBMED ID, Wiki uri on 31.01.2007"@en)
+AnnotationAssertion( "Discussion on obo-discuss mailing-list, see http://bit.ly/hgm99w"@en)
+AnnotationAssertion( "GROUP:OBI:"@en)
+AnnotationAssertion(rdfs:label "definition source"@en)
+
+# Annotation Property: (has ontology root term)
+
+AnnotationAssertion( "Ontology annotation property. Relates an ontology to a term that is a designated root term of the ontology. Display tools like OLS can use terms annotated with this property as the starting point for rendering the ontology class hierarchy. There can be more than one root."@en)
+AnnotationAssertion(rdfs:label "has ontology root term"@en)
+
+# Annotation Property: (abbreviation)
+
+AnnotationAssertion( "CHEBI:26523 (reactive oxygen species) has an exact synonym (ROS), which is of type OMO:0003000 (abbreviation)")
+AnnotationAssertion( "A synonym type for describing abbreviations or initialisms")
+AnnotationAssertion( )
+AnnotationAssertion(rdfs:label "abbreviation")
+
+# Annotation Property: (has_broad_synonym)
+
+AnnotationAssertion( "An alternative label for a class or property which has a more general meaning than the preferred name/primary label.")
+AnnotationAssertion(rdfs:label "has broad synonym"@en)
+AnnotationAssertion(rdfs:label "has_broad_synonym")
+
+# Annotation Property: (database_cross_reference)
+
+AnnotationAssertion( "disease characteristic (MONDO:0021125) has cross-reference (http://www.geneontology.org/formats/oboInOwl#hasDbXref) \"NCIT:C41009\"^^xsd:string")
+AnnotationAssertion( "An annotation property that links an ontology entity or a statement to a prefixed identifier or URI.")
+AnnotationAssertion( )
+AnnotationAssertion(rdfs:label "database_cross_reference")
+AnnotationAssertion(rdfs:label "has cross-reference")
+
+# Annotation Property: (has exact synonym)
+
+AnnotationAssertion( "An alternative label for a class or property which has the exact same meaning than the preferred name/primary label.")
+AnnotationAssertion(rdfs:label "has exact synonym"@en)
+
+# Annotation Property: (has narrow synonym)
+
+AnnotationAssertion( "An alternative label for a class or property which has a more specific meaning than the preferred name/primary label.")
+AnnotationAssertion(rdfs:label "has narrow synonym"@en)
+
+# Annotation Property: (has related synonym)
+
+AnnotationAssertion( "An alternative label for a class or property that has been used synonymously with the primary term name, but the usage is not strictly correct.")
+AnnotationAssertion(rdfs:label "has related synonym"@en)
+
+
+############################
+# Object Properties
+############################
+
+# Object Property: (preceded by)
+
+AnnotationAssertion( "x is preceded by y if and only if the time point at which y ends is before or equivalent to the time point at which x starts. Formally: x preceded by y iff ω(y) <= α(x), where α is a function that maps a process to a start point, and ω is a function that maps a process to an end point."@en)
+AnnotationAssertion(rdfs:label "preceded by"@en)
+SubObjectPropertyOf( )
+InverseObjectProperties( )
+TransitiveObjectProperty()
+ObjectPropertyDomain( )
+ObjectPropertyRange( )
+
+# Object Property: (precedes)
+
+AnnotationAssertion( "x precedes y if and only if the time point at which x ends is before or equivalent to the time point at which y starts. Formally: x precedes y iff ω(x) <= α(y), where α is a function that maps a process to a start point, and ω is a function that maps a process to an end point."@en)
+AnnotationAssertion(rdfs:label "precedes"@en)
+SubObjectPropertyOf( )
+TransitiveObjectProperty()
+ObjectPropertyDomain( )
+ObjectPropertyRange( )
+
+# Object Property: (is about)
+
+AnnotationAssertion( "This document is about information artifacts and their representations"@en)
+AnnotationAssertion( "A (currently) primitive relation that relates an information artifact to an entity."@en)
+AnnotationAssertion( "Smith, Ceusters, Ruttenberg, 2000 years of philosophy"@en)
+AnnotationAssertion(rdfs:label "is about"@en)
+ObjectPropertyDomain( )
+
+# Object Property: (characteristic of)
+
+AnnotationAssertion( "this fragility is a characteristic of this vase"@en)
+AnnotationAssertion( "this red color is a characteristic of this apple"@en)
+AnnotationAssertion( "a relation between a specifically dependent continuant (the characteristic) and any other entity (the bearer), in which the characteristic depends on the bearer for its existence."@en)
+AnnotationAssertion(rdfs:label "characteristic of"@en)
+SubObjectPropertyOf( )
+InverseObjectProperties( )
+FunctionalObjectProperty()
+
+# Object Property: (has characteristic)
+
+AnnotationAssertion( "this apple is bearer of this red color"@en)
+AnnotationAssertion( "this vase is bearer of this fragility"@en)
+AnnotationAssertion( "Inverse of characteristic_of"@en)
+AnnotationAssertion(rdfs:label "has characteristic"@en)
+InverseFunctionalObjectProperty()
+ObjectPropertyRange( )
+
+# Object Property: (participates in)
+
+AnnotationAssertion( "this blood clot participates in this blood coagulation"@en)
+AnnotationAssertion( "this input material (or this output material) participates in this process"@en)
+AnnotationAssertion( "this investigator participates in this investigation"@en)
+AnnotationAssertion( "a relation between a continuant and a process, in which the continuant is somehow involved in the process"@en)
+AnnotationAssertion(rdfs:label "participates in"@en)
+InverseObjectProperties(