IOF Requirements for CI/CD Infrastructure

IOF Requirements for CI/CD Infrastructure

Overview

The Jenkins infrastructure requires that the ontologies and the respective metadata files be organized and formatted correctly for the hygiene tests to function properly and for the ontology to be listed in the ontology viewer under the respective branches. The infrastructure also provides the ability to have IRIs that resolve and correctly reference the imports on the branch from tools such as Protégé. This document lays out the required files and the necessary structure for the ontology to function properly in IOF.

Domain Ontologies

The domain ontology must follow the required IRI structure provided in the IRI Structure and Format V2.3 normative document. This requires that the domain ontology, for this example, we will use the biopharma ontology, which resides in a subdirectory, biopharma, has the correct IRI to make it resolvable. Both the IRI and the versionIRI must be conformant with the specifications for the infrastructure to work correctly.

For the examples we will be referring to the following file: biopharma/Agent.rdf. Entity declarations should be created in the following areas of the file:

<!DOCTYPE rdf:RDF [ <!ENTITY bfo "http://purl.obolibrary.org/obo/"> <!ENTITY bmic-agent "https://spec.industrialontologies.org/ontology/biopharma/Agent/"> ... ]>

The path must match the GitHub directory structure for the ontology (/biopharma/Agent/) referencing the Agent.rdf file in the same directory. The IRI must always end with a trailing /.

A namespace declaration must also be given for the ontology as follows:

<rdf:RDF xml:base="https://spec.industrialontologies.org/ontology/biopharma/Agent/"Add commentMore actions xmlns:bfo="http://purl.obolibrary.org/obo/" xmlns:bmic-agent="https://spec.industrialontologies.org/ontology/biopharma/Agent/"

All references for ontologies and constructs must follow this same pattern.

<owl:Ontology rdf:about="https://spec.industrialontologies.org/ontology/biopharma/Agent/">

Don’t forget to verify the version IRI as well:

+ <owl:versionIRI rdf:resource="https://spec.industrialontologies.org/ontology/202401/biopharma/Agent/"/>

It is advised to use the latest release number, in this case 202401, in the version IRI. The version IRI will be replaced with an IRI that maps to the branched ontology by the Jenkins job.

Make sure you mark you new ontologies as provisional:

<iof-av:maturity rdf:resource="&iof-av;Provisional"/>

In the owl:Ontology section of the file.

Metafiles

MetadataIOF.rdf

There are two metafiles that one is concerned with for each ontology. There is the top-level metafile that references this ontology module, and the module metafile in the domain ontology directory. The first step is to modify the top level metafile named MetadataIOF.rdf in the GitHub root directory.

First create an Entity reference in the top of the file:

<!ENTITY iof-biopharma-mod "https://spec.industrialontologies.org/ontology/biopharma/Metadatabiopharma/">

The next step is to add the namespace in the <rdf:RDF element:

<rdf:RDF xml:base="https://spec.industrialontologies.org/ontology/MetadataIOF/" xmlns:dct="http://purl.org/dc/terms/" xmlns:iof-av="https://spec.industrialontologies.org/ontology/core/meta/AnnotationVocabulary/" xmlns:iof-core-mod="https://spec.industrialontologies.org/ontology/core/Metadatacore/" xmlns:iof-maintenance-mod="https://spec.industrialontologies.org/ontology/maintenance/MetadataISO/" xmlns:iof-spec="https://spec.industrialontologies.org/ontology/MetadataIOF/" xmlns:iof-supplychain-mod="https://spec.industrialontologies.org/ontology/supplychain/Metadatasupplychain/" xmlns:iof-biopharma-mod="https://spec.industrialontologies.org/ontology/biopharma/Metadatabiopharma/"

Next add the ontology reference to the owl:imports of the Ontology section:

<owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Metadatabiopharma/"/>

And finally, add your module as a part of IOFSpecificaiton individual using the data catalog hasPart property as follows:

<dct:hasPart rdf:resource="&iof-biopharma-mod;biopharmaModule"/>

The module for the domain ontology must match the name of the import given in the imports section. In this case it is Metadatabiopharma as given above in the section for the <rdf:RDF element.

biopharma/Metadatabiopharma.rdf

A new ontology needs to be created for the domain ontologies in your directory. A similar file must be created replacing biopharma with your domain. The file is as follows:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE rdf:RDF [ <!ENTITY dct "http://purl.org/dc/terms/"> <!ENTITY iof-av "https://spec.industrialontologies.org/ontology/core/meta/AnnotationVocabulary/"> <!ENTITY iof-biopharma-mod "https://spec.industrialontologies.org/ontology/biopharma/Metadatabiopharma/"> <!ENTITY owl "http://www.w3.org/2002/07/owl#"> <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#"> <!ENTITY skos "http://www.w3.org/2004/02/skos/biopharma#"> <!ENTITY sm "http://www.omg.org/techprocess/ab/SpecificationMetadata/"> <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#"> ]> <rdf:RDF xml:base="https://spec.industrialontologies.org/ontology/biopharma/Metadatabiopharma/" xmlns:dct="http://purl.org/dc/terms/" xmlns:iof-av="https://spec.industrialontologies.org/ontology/core/meta/AnnotationVocabulary/" xmlns:iof-biopharma-mod="https://spec.industrialontologies.org/ontology/biopharma/Metadatabiopharma/" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:skos="http://www.w3.org/2004/02/skos/biopharma#" xmlns:sm="http://www.omg.org/techprocess/ab/SpecificationMetadata/" xmlns:xsd="http://www.w3.org/2001/XMLSchema#"> <owl:Ontology rdf:about="https://spec.industrialontologies.org/ontology/biopharma/Metadatabiopharma/"> <rdfs:label>NIMBL Biopharma Ontologies Library</rdfs:label> <dct:abstract>NIMBL Biopharma Meta Ontology specifies the metada for the NIMBL Biopharma Ontology Library</dct:abstract> <dct:issued rdf:datatype="&xsd;dateTime">2025-06-16T00:00:00Z</dct:issued> <dct:license rdf:datatype="&xsd;anyURI">http://opensource.org/licenses/MIT</dct:license> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/core/meta/AnnotationVocabulary/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Agent/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Equipment/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/ManufacturingExecution/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Material/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/MaterialProcurementAndStorage/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/MonitoringAndControl/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Parameter/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Physical/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Recipe/"/> <owl:versionIRI rdf:resource="https://spec.industrialontologies.org/ontology/202401/biopharma/Metadatabiopharma/"/> <iof-av:copyright>Copyright (c) 2022, 2023, 2024, 2025 Open Applications Group</iof-av:copyright> </owl:Ontology> <owl:NamedIndividual rdf:about="&iof-biopharma-mod;biopharmaModule"> <rdf:type rdf:resource="&sm;Module"/> <rdfs:label>NIMBL Biopharma Ontologies Library</rdfs:label> <dct:abstract>The NIMBL Biopharma Ontologies Library contains ontologies to be used in the domain of Biopharma</dct:abstract> <dct:hasPart rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Agent/"/> <dct:hasPart rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Equipment/"/> <dct:hasPart rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/ManufacturingExecution/"/> <dct:hasPart rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Material/"/> <dct:hasPart rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/MaterialProcurementAndStorage/"/> <dct:hasPart rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/MonitoringAndControl/"/> <dct:hasPart rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Parameter/"/> <dct:hasPart rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Physical/"/> <dct:hasPart rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Recipe/"/> </owl:NamedIndividual> </rdf:RDF>

Each ontology in the domain must be imported into the module and a NamedIndividual with a type of http://www.omg.org/techprocess/ab/SpecificationMetadata/Module (&sm;Module) must be created where each of the individual ontologies are referenced as parts. The descriptive information will appear in the OntoViewer for each of the modules.

Protégé catalog-v001.xml files

Domain biopharma/catalog-v001.xml

For Protégé to function properly when working on the ontologies, it is necessary to create a catalog file in the respective directory. This file should reference all the dependencies as well as the import local IRIs of the ontologies. This is useful when working on the cloned repository:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <catalog prefer="public" xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> <uri id="Automatically generated entry, Timestamp=1709742092083" name="https://spec.industrialontologies.org/ontology/biopharma/Agent/" uri="Agent.rdf"/> <uri id="Automatically generated entry, Timestamp=1709742092083" name="https://spec.industrialontologies.org/ontology/biopharma/Equipment/" uri="Equipment.rdf"/> <uri id="Automatically generated entry, Timestamp=1709742092083" name="https://spec.industrialontologies.org/ontology/biopharma/ManufacturingExecution/" uri="ManufacturingExecution.rdf"/> <uri id="Automatically generated entry, Timestamp=1709742092083" name="https://spec.industrialontologies.org/ontology/biopharma/Material/" uri="Material.rdf"/> <uri id="Automatically generated entry, Timestamp=1709742092083" name="https://spec.industrialontologies.org/ontology/biopharma/MaterialProcurementAndStorage/" uri="MaterialProcurementAndStorage.rdf"/> <uri id="Automatically generated entry, Timestamp=1709742092083" name="https://spec.industrialontologies.org/ontology/biopharma/MonitoringAndControl/" uri="MonitoringAndControl.rdf"/> <uri id="Automatically generated entry, Timestamp=1709742092083" name="https://spec.industrialontologies.org/ontology/biopharma/Parameter/" uri="Parameter.rdf"/> <uri id="Automatically generated entry, Timestamp=1709742092083" name="https://spec.industrialontologies.org/ontology/biopharma/Physical/" uri="Physical.rdf"/> <uri id="Automatically generated entry, Timestamp=1709742092083" name="https://spec.industrialontologies.org/ontology/biopharma/Recipe/" uri="Recipe.rdf"/> <uri id="Imports Wizard Entry" name="http://purl.obolibrary.org/obo/bfo/2020/bfo.owl" uri="../cache/bfo/2020/bfo.rdf"/> <uri id="Imports Wizard Entry" name="http://qudt.org/2.1/schema/qudt/" uri="../cache/QUDT/SCHEMA_QUDT-v2.1.rdf"/> <uri id="User Entered Import Resolution" name="http://www.linkedmodel.org/schema/vaem" uri="../cache/QUDT/vaem.rdf"/> <uri id="User Entered Import Resolution" name="http://www.linkedmodel.org/schema/dtype" uri="../cache/QUDT/dtype.rdf"/> <uri id="User Entered Import Resolution" name="http://www.w3.org/2004/02/skos/core" uri="../cache/QUDT/skos.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/core/meta/AnnotationVocabulary/" uri="../core/meta/AnnotationVocabulary.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/core/Core/" uri="../core/Core.rdf"/> </catalog>

Top-level catalog-v001.xml

The Jenkins hygiene tests requires that all the ontologies are referenced in the top level catalog file. In this case, they were added to the top-level file as follows:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <catalog prefer="public" xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> <uri id="User Entered Import Resolution" name="http://purl.obolibrary.org/obo/bfo.owl" uri="./cache/bfo/2020/bfo.rdf"/> <uri id="User Entered Import Resolution" name="https://www.omg.org/spec/Commons/AnnotationVocabulary/" uri="./cache/CMNS/AnnotationVocabulary.rdf"/> <uri id="User Entered Import Resolution" name="https://www.omg.org/spec/Commons/TextDatatype/" uri="./cache/CMNS/TextDatatype.rdf"/> <uri id="User Entered Import Resolution" name="https://www.omg.org/spec/Commons/Collections/" uri="./cache/CMNS/Collections.rdf"/> <uri id="User Entered Import Resolution" name="https://www.omg.org/spec/Commons/Designators/" uri="./cache/CMNS/Designators.rdf"/> <uri id="User Entered Import Resolution" name="https://www.omg.org/spec/Commons/Identifiers/" uri="./cache/CMNS/Identifiers.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/supplychain/SupplyChain/" uri="./supplychain/SupplyChain.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/maintenance/Maintenance/" uri="./maintenance/Maintenance.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/core/Core/" uri="./core/Core.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/core/meta/AnnotationVocabulary/" uri="./core/meta/AnnotationVocabulary.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/MetadataIOF/" uri="./MetadataIOF.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/core/Metadatacore/" uri="./core/Metadatacore.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/maintenance/Metadatamaintenance/" uri="./maintenance/Metadatamaintenance.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/supplychain/Metadatasupplychain/" uri="./supplychain/Metadatasupplychain.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/core/commonstocoremapping/MappingCommonsToIOF/" uri="./core/commonstocoremapping/MappingCommonsToIOF.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/core/commonstocoremapping/meta/MappingAnnotationVocabularyToCommons/" uri="./core/commonstocoremapping/meta/MappingAnnotationVocabularyToCommons.rdf"/> <!-- Added here --> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/biopharma/Metadatabiopharma/" uri="./biopharma/Metadatabiopharma.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/biopharma/Agent/" uri="./biopharma/Agent.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/biopharma/Equipment/" uri="./biopharma/Equipment.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/biopharma/ManufacturingExecution/" uri="./biopharma/ManufacturingExecution.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/biopharma/Material/" uri="./biopharma/Material.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/biopharma/MaterialProcurementAndStorage/" uri="./biopharma/MaterialProcurementAndStorage.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/biopharma/MonitoringAndControl/" uri="./biopharma/MonitoringAndControl.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/biopharma/Parameter/" uri="./biopharma/Parameter.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/biopharma/Physical/" uri="./biopharma/Physical.rdf"/> <uri id="User Entered Import Resolution" name="https://spec.industrialontologies.org/ontology/biopharma/Recipe/" uri="./biopharma/Recipe.rdf"/> </catalog>

The lines were added to the existing list of ontologies after the comment: Added here

About files

Top-level AboutIOFDev.rdf

Assuming this is an ontology under development and one would like to have it loadable with the other release and development ontologies, one should add the ontologies to the AboutIOFDev.rdf file in the root directory. The imports lines were added as follows:

<owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Agent/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Equipment/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/ManufacturingExecution/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Material/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/MaterialProcurementAndStorage/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/MonitoringAndControl/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Parameter/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Physical/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Recipe/"/>

Domain biopharma/AboutBiopharmaceuticalManufacturingDev.rdf

The domain should also have an About file containing all the imports for the domain ontologies. This includes all the dependencies as well. Make sure all IRIs are correctly formed:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE rdf:RDF [ <!ENTITY dct "http://purl.org/dc/terms/"> <!ENTITY owl "http://www.w3.org/2002/07/owl#"> <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#"> <!ENTITY skos "http://www.w3.org/2004/02/skos/core#"> <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#"> <!ENTITY iof-av "https://spec.industrialontologies.org/ontology/core/meta/AnnotationVocabulary/"> <!ENTITY dcterms "http://purl.org/dc/terms/"> ]> <rdf:RDF xml:base="https://spec.industrialontologies.org/ontology/biopharma/AboutBiopharmaceuticalManufacturingDev/" xmlns:dct="http://purl.org/dc/terms/" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:skos="http://www.w3.org/2004/02/skos/core#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:iof-av="https://spec.industrialontologies.org/ontology/core/meta/AnnotationVocabulary/" xmlns:dcterms="http://purl.org/dc/terms/"> <owl:Ontology rdf:about="https://spec.industrialontologies.org/ontology/biopharma/AboutBiopharmaceuticalManufacturingDev/"> </owl:Ontology> <owl:Ontology rdf:about="https://spec.industrialontologies.org/ontology/biopharma.AboutBiopharmaceuticalManufacturingDev/"> <rdfs:label xml:lang="en-US">About Biopharmaceutical Manufacturing Development</rdfs:label> <dcterms:abstract>This ontology defines the scope of provisional maturity level biopharmaceutical manufacturing ontologies.</dcterms:abstract> <dcterms:license rdf:datatype="&xsd;anyURI">http://opensource.org/licenses/MIT</dcterms:license> <iof-av:copyright>Copyright (c) 2022, 2023, Open Applications Group</iof-av:copyright> <owl:versionIRI rdf:resource="https://spec.industrialontologies.org/ontology/202401/biopharma/AboutBiopharmaceuticalManufacturingDev/"/> <iof-av:maturity rdf:resource="&iof-av;Provisional"/> <!-- load from normative locations --> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/core/Core/"/> <owl:imports rdf:resource="http://qudt.org/2.1/schema/qudt/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Agent/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Equipment/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/ManufacturingExecution/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Material/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/MaterialProcurementAndStorage/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/MonitoringAndControl/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Parameter/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Physical/"/> <owl:imports rdf:resource="https://spec.industrialontologies.org/ontology/biopharma/Recipe/"/> </owl:Ontology> </rdf:RDF>

Jenkins

This allows for the infrastructure to provide a single file to load all the related ontologies in the domain. Once the files are pushed to GitHub, jenkins will start a job and produce logs. You can find the jobs here:

Releases · iofoundry/ontology

To check on your runs, select you branch, in this case it is biopharma-metadata:

Releases · iofoundry/ontology

And you can review each of the operations and if they were successful. The logs will tell you if there were any errors during the different phases.

OntoViewer

If everything worked correctly, you should see your ontologies listed in the OntoViewer:

https://spec.industrialontologies.org/iof/ontology?version=biopharma-metadata/latest

Screenshot 2025-06-18 at 18.58.48.png

And one can also load the entire set of ontologies from Protégé using the About file:

File → Open From URL…: https://spec.industrialontologies.org/ontology/biopharma-metadata/latest/biopharma/AboutBiopharmaceuticalManufacturingDev/

Screenshot 2025-06-18 at 19.00.49.png
image-20250618-170211.png

The Jenkins process changes all the Version IRIs to match the branch name so they will resolve correctly:

https://spec.industrialontologies.org/ontology/202401/biopharma/Agent/

becomes:

https://spec.industrialontologies.org/ontology/biopharma-metadata/latest/biopharma/Agent/

The about file and other imports will also be fixed up so they can be referenced from the associated files on the branch.