diff --git a/docs/odk-workflows/RepositoryFileStructure.md b/docs/odk-workflows/RepositoryFileStructure.md
index bd788c2..3567404 100644
--- a/docs/odk-workflows/RepositoryFileStructure.md
+++ b/docs/odk-workflows/RepositoryFileStructure.md
@@ -26,3 +26,8 @@ Components, in contrast to imports, are considered full members of the ontology.
2. A part of the ontology is managed in ROBOT templates
3. The expressivity of the component is higher than the format of the edit file. For example, people still choose to manage their ontology in OBO format (they should not) missing out on a lot of owl features. They may choose to manage logic that is beyond OBO in a specific OWL component.
+These are the components in FBBI
+
+| Filename | URL |
+| -------- | --- |
+| orcidio.owl | None |
diff --git a/src/ontology/Makefile b/src/ontology/Makefile
index 5823286..d3da4a6 100644
--- a/src/ontology/Makefile
+++ b/src/ontology/Makefile
@@ -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= 2896ea1d0cc1ffaf7742742d22644a31d17bfe0a130e6e37dd4a9babf75985d3
+CONFIG_HASH= 298f0b177bd11c6df8f99fe6755aa350025828149603d6f6ac06eb3ee26ca76d
# ----------------------------------------
@@ -57,7 +57,7 @@ OBODATE ?= $(shell date +'%d:%m:%Y %H:%M')
VERSION= $(TODAY)
ANNOTATE_ONTOLOGY_VERSION = annotate -V $(ONTBASE)/releases/$(VERSION)/$@ --annotation owl:versionInfo $(VERSION)
ANNOTATE_CONVERT_FILE = annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) convert -f ofn --output $@.tmp.owl && mv $@.tmp.owl $@
-OTHER_SRC =
+OTHER_SRC = $(COMPONENTSDIR)/orcidio.owl
ONTOLOGYTERMS = $(TMPDIR)/ontologyterms.txt
EDIT_PREPROCESSED = $(TMPDIR)/$(ONT)-preprocess.owl
@@ -155,7 +155,7 @@ custom_robot_plugins:
.PHONY: extra_robot_plugins
-extra_robot_plugins:
+extra_robot_plugins: $(ROBOT_PLUGINS_DIRECTORY)/odk.jar
# Install all ROBOT plugins to the runtime plugins directory
@@ -175,6 +175,9 @@ $(ROBOT_PLUGINS_DIRECTORY)/%.jar:
# Specific rules for supplementary plugins defined in configuration
+$(ROBOT_PLUGINS_DIRECTORY)/odk.jar:
+ curl -L -o $@ https://github.com/INCATools/odk-robot-plugin/releases/download/odk-robot-plugin-0.3.3/odk.jar
+
# ----------------------------------------
# Release assets
@@ -407,7 +410,7 @@ $(IMPORTDIR)/merged_import.owl: $(MIRRORDIR)/merged.owl $(ALL_TERMS) \
$(ROBOT) merge --input $< \
extract $(foreach f, $(ALL_TERMS), --term-file $(f)) $(T_IMPORTSEED) \
--force true --copy-ontology-annotations false \
- --individuals include \
+ --individuals exclude \
--method BOT \
remove $(foreach p, $(ANNOTATION_PROPERTIES), --term $(p)) \
$(foreach f, $(ALL_TERMS), --term-file $(f)) $(T_IMPORTSEED) \
@@ -443,6 +446,44 @@ no-mirror-refresh-%:
$(MAKE) --assume-new=$(SRC) --assume-new=$(IMPORTDIR)/$*_terms.txt \
IMP=true IMP_LARGE=true MIR=false PAT=false $(IMPORTDIR)/$*_import.owl
+# ----------------------------------------
+# Components
+# ----------------------------------------
+# Some ontologies contain external and internal components. A component is included in the ontology in its entirety.
+
+ifeq ($(COMP),true)
+.PHONY: all_components
+all_components: $(OTHER_SRC)
+
+.PHONY: recreate-components
+recreate-components:
+ $(MAKE) --assume-new=$(TMPDIR)/stamp-component-orcidio.owl \
+ COMP=true IMP=false MIR=true PAT=true all_components
+
+.PHONY: no-mirror-recreate-components
+no-mirror-recreate-components:
+ $(MAKE) --assume-new=$(TMPDIR)/stamp-component-orcidio.owl \
+ COMP=true IMP=false MIR=false PAT=true all_components
+
+.PHONY: recreate-%
+recreate-%:
+ $(MAKE) --assume-new=$(TMPDIR)/stamp-component-$*.owl \
+ COMP=true IMP=false MIR=true PAT=true $(COMPONENTSDIR)/$*.owl
+
+.PHONY: no-mirror-recreate-%
+no-mirror-recreate-%:
+ $(MAKE) --assume-new=$(TMPDIR)/stamp-component-$*.owl \
+ COMP=true IMP=false MIR=false PAT=true $(COMPONENTSDIR)/$*.owl
+
+$(COMPONENTSDIR)/%.owl: $(TMPDIR)/stamp-component-%.owl | $(COMPONENTSDIR)
+ test -f $@ || touch $@
+.PRECIOUS: $(COMPONENTSDIR)/%.owl
+
+$(TMPDIR)/stamp-component-%.owl: | $(TMPDIR)
+ touch $@
+.PRECIOUS: $(TMPDIR)/stamp-component-%.owl
+
+endif # COMP=true
# ----------------------------------------
# Mirroring upstream ontologies
# ----------------------------------------
diff --git a/src/ontology/catalog-v001.xml b/src/ontology/catalog-v001.xml
index 8d94d6a..36ecb74 100644
--- a/src/ontology/catalog-v001.xml
+++ b/src/ontology/catalog-v001.xml
@@ -2,5 +2,6 @@
+
\ No newline at end of file
diff --git a/src/ontology/components/orcidio.owl b/src/ontology/components/orcidio.owl
new file mode 100644
index 0000000..d8807e1
--- /dev/null
+++ b/src/ontology/components/orcidio.owl
@@ -0,0 +1,45 @@
+Prefix(:=)
+Prefix(owl:=)
+Prefix(rdf:=)
+Prefix(xml:=)
+Prefix(xsd:=)
+Prefix(rdfs:=)
+
+
+Ontology(
+
+Annotation(owl:versionInfo "2026-06-22")
+
+Declaration(Class())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(NamedIndividual())
+Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
+
+
+
+############################
+# Named Individuals
+############################
+
+# Individual: (Damien Goutte-Gattat)
+
+AnnotationAssertion(Annotation( ) "researcher ORCID ID = 0000-0002-6095-8718")
+AnnotationAssertion(Annotation( ) rdfs:label "Damien Goutte-Gattat")
+ClassAssertion( )
+
+# Individual: (David Osumi-Sutherland)
+
+AnnotationAssertion(Annotation( ) "researcher")
+AnnotationAssertion(Annotation( ) rdfs:label "David Osumi-Sutherland")
+ClassAssertion( )
+
+# Individual: (Willy W Wong)
+
+AnnotationAssertion(Annotation( ) "researcher ORCID ID = 0000-0002-8841-5870")
+AnnotationAssertion(Annotation( ) rdfs:label "Willy W Wong")
+ClassAssertion( )
+
+
+)
\ No newline at end of file
diff --git a/src/ontology/fbbi-edit.owl b/src/ontology/fbbi-edit.owl
index d11562a..c0c4871 100644
--- a/src/ontology/fbbi-edit.owl
+++ b/src/ontology/fbbi-edit.owl
@@ -7,6 +7,7 @@ Prefix(rdfs:=)
Ontology(
+Import()
Import()
Annotation( )
Annotation( )
diff --git a/src/ontology/fbbi-odk.yaml b/src/ontology/fbbi-odk.yaml
index 217e9f3..2a9a15c 100644
--- a/src/ontology/fbbi-odk.yaml
+++ b/src/ontology/fbbi-odk.yaml
@@ -5,12 +5,20 @@ documentation:
documentation_system: mkdocs
namespaces:
- http://purl.obolibrary.org/obo/FBbi_
+robot_plugins:
+ plugins:
+ - name: odk
+ mirror_from: https://github.com/INCATools/odk-robot-plugin/releases/download/odk-robot-plugin-0.3.3/odk.jar
import_group:
use_base_merging: true
+ slme_individuals: exclude
products:
- id: ro
- id: omo
- id: iao
+components:
+ products:
+ - filename: orcidio.owl
robot:
reasoner: ELK
repo: fbbi
diff --git a/src/ontology/fbbi.Makefile b/src/ontology/fbbi.Makefile
index a930223..6615073 100644
--- a/src/ontology/fbbi.Makefile
+++ b/src/ontology/fbbi.Makefile
@@ -3,3 +3,11 @@
## If you need to customize your Makefile, make
## changes here rather than in the main Makefile
+# Automatically generate the orcidio component from ORCID references
+# within the ontology.
+# Of note, ODK 1.7 will have built-in support for this, so once ODK 1.7
+# is out we should replace this with the built-in feature.
+$(COMPONENTSDIR)/orcidio.owl: $(TMPDIR)/stamp-component-%.owl $(EDIT_PREPROCESSED) | $(COMPONENTSDIR) all_robot_plugins
+ $(ROBOT) remove --input $(EDIT_PREPROCESSED) --select imports --trim false \
+ odk:extract-orcids \
+ $(ANNOTATE_CONVERT_FILE)
diff --git a/src/ontology/imports/merged_import.owl b/src/ontology/imports/merged_import.owl
index 6341ea9..2852dd2 100644
--- a/src/ontology/imports/merged_import.owl
+++ b/src/ontology/imports/merged_import.owl
@@ -7,8 +7,8 @@ Prefix(rdfs:=)
Ontology(
-
-Annotation(owl:versionInfo "2026-03-30")
+
+Annotation(owl:versionInfo "2026-06-22")
Declaration(Class())
Declaration(Class())
@@ -151,44 +151,6 @@ 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(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(NamedIndividual())
-Declaration(NamedIndividual())
Declaration(NamedIndividual())
Declaration(NamedIndividual())
Declaration(NamedIndividual())
@@ -207,9 +169,6 @@ Declaration(NamedIndividual())
Declaration(NamedIndividual())
Declaration(NamedIndividual())
Declaration(NamedIndividual())
-Declaration(NamedIndividual())
-Declaration(NamedIndividual())
-Declaration(NamedIndividual())
Declaration(AnnotationProperty())
Declaration(AnnotationProperty())
Declaration(AnnotationProperty())
@@ -228,6 +187,7 @@ Declaration(AnnotationProperty())
Declaration(AnnotationProperty())
Declaration(AnnotationProperty())
Declaration(AnnotationProperty())
+Declaration(AnnotationProperty())
Declaration(AnnotationProperty())
Declaration(AnnotationProperty())
Declaration(AnnotationProperty())
@@ -375,6 +335,7 @@ TransitiveObjectProperty()
# 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( "http://www.obofoundry.org/ro/#OBO_REL:preceded_by")
AnnotationAssertion( )
AnnotationAssertion(rdfs:label "preceded by"@en)
SubObjectPropertyOf( )
@@ -426,6 +387,7 @@ ObjectPropertyRange( (has participant)
AnnotationAssertion( "a relation between a process and a continuant, in which the continuant is somehow involved in the process"@en)
+AnnotationAssertion( "http://www.obofoundry.org/ro/#OBO_REL:has_participant")
AnnotationAssertion(rdfs:label "has participant"@en)
ObjectPropertyDomain( )
ObjectPropertyRange( )
@@ -697,6 +659,7 @@ SubObjectPropertyOf( (temporally related to)
+AnnotationAssertion( "https://docs.google.com/document/d/1kBv1ep_9g3sTR-SD3jqzFqhuwo9TPNF-l-9fUDbO6rM/edit?pli=1"^^xsd:anyURI)
AnnotationAssertion( )
AnnotationAssertion(rdfs:comment "A relation that holds between two occurrents. This is a grouping relation that collects together all the Allen relations.")
AnnotationAssertion(rdfs:label "temporally related to"@en)
@@ -1432,9 +1395,9 @@ AnnotationAssertion(rdfs:label "kina
SubClassOf( )
SubClassOf( ObjectHasSelf())
-# Class: (data item)
+# Class: (data entity)
-AnnotationAssertion( "An information content entity that is intended to be a truthful statement about something (modulo, e.g., measurement precision or other systematic errors) and is constructed/acquired by a method which reliably tends to produce (approximately) truthful statements."@en)
+AnnotationAssertion( "An information content entity that is intended to be one or more truthful statement(s) about something (modulo, e.g., measurement precision or other systematic errors) and is constructed/acquired by a method which reliably tends to produce (approximately) truthful statements."@en)
AnnotationAssertion(rdfs:label "data entity"@en)
AnnotationAssertion(rdfs:label "data item"@en)
SubClassOf( )
@@ -1513,461 +1476,96 @@ SubClassOf( (Western Australian Mulga Shrublands Ecoregion)
-
-AnnotationAssertion( )
-AnnotationAssertion( "2019-03-05T17:25:21Z"^^xsd:dateTime)
-AnnotationAssertion( "Western Australia Ecoregion")
-AnnotationAssertion( "WWF:AA1310")
-AnnotationAssertion( "https://www.worldwildlife.org/ecoregions/aa1310")
-AnnotationAssertion(rdfs:label "Western Australian Mulga Shrublands Ecoregion"@en)
-ObjectPropertyAssertion( )
-
-# Individual: (Australasia Ecoregion)
-
-AnnotationAssertion( )
-AnnotationAssertion( "2019-03-05T17:51:32Z"^^xsd:dateTime)
-AnnotationAssertion( "https://www.worldwildlife.org/biomes/deserts-and-xeric-shrublands")
-AnnotationAssertion(rdfs:label "Australasia Ecoregion"@en)
-
-# Individual: (Tirari-Sturt Stony Desert Ecoregion)
-
-AnnotationAssertion( )
-AnnotationAssertion( "2019-03-05T17:52:41Z"^^xsd:dateTime)
-AnnotationAssertion( "Southern central Australia Ecoregion"@en)
-AnnotationAssertion( "WWF:AA1309")
-AnnotationAssertion( "https://www.worldwildlife.org/ecoregions/aa1309")
-AnnotationAssertion(rdfs:label "Tirari-Sturt Stony Desert Ecoregion")
-ObjectPropertyAssertion( )
-
-# Individual: (Simpson Desert Region)
-
-AnnotationAssertion( )
-AnnotationAssertion( "2019-03-05T17:54:35Z"^^xsd:dateTime)
-AnnotationAssertion( "Eastern central Australia Ecoregion")
-AnnotationAssertion( "WWF:AA1308")
-AnnotationAssertion( "https://www.worldwildlife.org/ecoregions/aa1308")
-AnnotationAssertion(rdfs:label "Simpson Desert Region"@en)
-ObjectPropertyAssertion( )
-
-# Individual: (Pilbara Shrublands Ecoregion)
-
-AnnotationAssertion( )
-AnnotationAssertion( "2019-03-05T17:56:13Z"^^xsd:dateTime)
-AnnotationAssertion( "Western Australia Ecoregion")
-AnnotationAssertion( "WWF:AA1307")
-AnnotationAssertion( "https://www.worldwildlife.org/ecoregions/aa1307")
-AnnotationAssertion(rdfs:label "Pilbara Shrublands Ecoregion"@en)
-ObjectPropertyAssertion( )
-
-# Individual: (Carnarvon Xeric Shrublands Ecoregion)
-
-AnnotationAssertion( )
-AnnotationAssertion( "2019-03-05T18:10:52Z"^^xsd:dateTime)
-AnnotationAssertion( "Western coast of Australia Ecoregion")
-AnnotationAssertion( "WWF:AA1301")
-AnnotationAssertion( "https://www.worldwildlife.org/ecoregions/aa1301")
-AnnotationAssertion(rdfs:label