Clinical Ontology Engineering
with SULO

A Hands-On Tutorial — Mary's Clinical Odyssey
Medical Informatics Europe (MIE) 2026
Michel Dumontier  ·  Remzi Celebi
Institute of Data Science, Maastricht University
From clinical timeline to FAIR-published ontology, using only SULO + PRO

The Challenge

Clinical ontology engineering, today

⚠ Modelling Conflations

  • Hundreds of overlapping participation properties (hasPerformer, hasSubject, …)
  • Diseases, tumours, and findings conflated
  • Statement, disease, and act of diagnosis confused
  • Quantities modelled as bare numbers

⚠ Unresolved Patterns

  • How to refer to a process that hasn't happened yet?
  • How to anchor a measurement to a patient over time?
  • When is parthood the wrong relation for anatomy?
  • How to merge views from two EHR systems?

⚠ FAIR & Training Gap

  • Ontologies rarely come with version IRIs, licences, proper metadata
  • Few tutorials connect modelling → reasoning → publishing
  • No practical template for FAIR clinical-ontology projects
  • Upper-level ontologies under-used in clinical teaching

Goals of the Tutorial

🩺 Domain modelling with SULO

  • Demonstrate that SULO's vocabulary is sufficient for clinical modelling — no new properties required
  • Teach the SULO design patterns: PRO, SOLID, Collection/hasItem, the diagnosis triangle
  • Translate clinical reality into OWL axioms the reasoner can use
  • Apply automated classification to recover clinically meaningful statements

🌍 FAIR publishing

  • Set version IRIs and a complete metadata footprint (dc, vann, pav, dcat, foaf, schema, mod)
  • Export to multiple serialisations (RDF/XML, Turtle), OWL 2 DL-clean
  • Run a FAIRness self-check and submit to FOOPS! for the authoritative report
  • Walk away with a publishable clinical-modelling ontology

Learning Objectives

What attendees will be able to do by the end of the half-day
  • Classify clinical entities under SULO's top-level categories (Process, SpatialObject, Quality, Quantity, Role, InformationObject, Time, Unit, Collection)
  • Apply the Process-Role-Object (PRO) pattern to model procedural participation without inventing new properties
  • Distinguish persistent roles from event-bound roles in real clinical data
  • Use the SOLID pattern for numeric measurements with units and thresholds
  • Express anatomy as composition using AllDisjoint and the split-definition pattern
  • Distinguish the disease (Process), the tumour (SpatialObject), and the diagnosis statement (InformationObject)
  • Refer to not-yet-instantiated processes via Collection / hasItem
  • Query the ontology with SPARQL — property paths, multi-hop joins, COUNT DISTINCT, sameAs
  • Add FAIR metadata, version IRIs, and submit to FOOPS! for external assessment

The Running Case

Mary, 52 — breast cancer journey, Feb–Sep 2026
Feb 18
Routine
visit + BP
Feb 20
Ultrasound
Feb 22
Preliminary
diagnosis
Feb 25
Biopsy
Mar 1
Histopath +
confirmed dx
Mar 10
Chemo
begins
Jun 15
Chemo
ends
Jul 1
Lumpectomy
Sep 30
Follow-up
(remission)

One patient

  • Nine clinical events on one timeline
  • Two clinicians (Miller, Smith)
  • One anatomical site (left breast)
  • One disease (invasive carcinoma)
  • Four chemo administrations

One rich record

  • Numeric features (BP measurements)
  • Categorical features (tumour grade, receptor status)
  • Information entities (diagnosis statements, prescription)
  • Cross-system identity via owl:sameAs

One pedagogic principle

  • Each event lands a specific SULO category + OWL construct
  • Each new construct produces a reasoner-derived classification
  • No design pattern is rehearsed — every scene teaches a new lesson
  • Builds incrementally NB1 → … → NB7

Methodology

How each notebook is built

The anchor pattern (per notebook)

① Clinical scene
Pick a dated event from Mary's odyssey
② Identify the construct
What SULO category + OWL feature does this scene need?
③ Declare it
T-Box restrictions + A-Box assertions, SULO properties only
④ Run the reasoner
HermiT consistency check + classification of defined classes
⑤ Verify with SPARQL
Query for the inferred answer — the lesson has landed

The SULO discipline

  • Zero new object properties added
  • Zero new data properties added
  • Every relation is sulo:* or owl:*
  • Domain growth arrives as new classes, not new predicates
  • The MIE ontology stays aligned with the upper-level

Tutorial Schedule

Six notebooks · 3:00 pm – 6:00 pm · coffee break 4:30 – 5:00
·Introduction to the tutorial & SULOWhat we'll build · Mary's odyssey · SULO postcard tour15:00 · 15 min
NB1Processes, parts, time, orderingProcess, Time | SubClass, cardinality, SPARQL +/*15:15 · 25 min
NB2Roles & the PRO patternRole | Nested existentials, defined class15:40 · 25 min
NB3Spatial objects & their partsSpatialObject | AllDisjoint, only, split definition16:05 · 25 min
Coffee break16:30 · 30 min
NB4Qualities, quantities, thresholdsQuality, Quantity, Unit | ConstrainedDatatype, union17:00 · 20 min
NB5Connections — containment, info, identityInformationObject, Collection | value restriction, AllDifferent, sameAs17:20 · 20 min
NB6Reasoning & SPARQL(queries only) | property paths, UNION, COUNT DISTINCT17:40 · 20 min

Building Blocks

SULO + PRO + the design patterns we use

SULO upper-level

  • Process, SpatialObject, Quality, Quantity, Unit
  • Role, Feature (via PRO sub-classes)
  • InformationObject, Collection
  • Time / TimeInstant / StartTime / EndTime
  • hasPart, hasDirectPart, hasParticipant, hasFeature, refersTo, atTime, isIn, hasValue, hasItem, precedes

PRO extension

  • TransformationProcess vs DevelopmentalProcess
  • AgentRole, PatientRole, InstrumentRole, LocationRole, EmergingRole, ConsumedRole, DevelopmentRole, PersistingRole
  • → Reifies participation through roles
  • → Adds classes, not properties
  • → Used in NB2; reused everywhere thereafter

Design patterns

  • PRO (NB2) — Process-Role-Object participation
  • SOLID (NB4) — Quantity + Unit + hasValue
  • Collection / hasItem (NB5) — reference to not-yet-instantiated processes
  • Diagnosis triangle (NB5) — Process / Statement / Assessment
  • Split definition (NB3) — existentials drive classification; cardinality + universals constrain it

OWL Constructs Covered

~25 distinct constructs, each anchored to a clinical demo

Structural

  • Class declaration
  • SubClassOf
  • Multiple typing
  • owl:imports
  • Named individuals
  • AnnotationProperty declaration
  • rdfs:label @en
  • rdfs:comment

Class expressions

  • Existential some
  • Universal only
  • Intersection ⊓
  • Union ⊔
  • Value hasFeature value …
  • Cardinality exactly / max
  • Nested existentials
  • ConstrainedDatatype

Axioms

  • EquivalentClasses (defined class)
  • AllDisjoint (classes)
  • AllDifferent (individuals)
  • owl:sameAs (individuals)
  • TransitiveProperty (inherited)
  • FunctionalProperty (inherited)
  • owl:versionIRI

SPARQL

  • Property path +
  • Property path *
  • Parameter substitution
  • COUNT(DISTINCT …)
  • UNION (symmetric sameAs)
  • Multi-hop joins
  • Type filtering
  • ORDER BY

Outcomes

What each attendee walks away with

Deliverable artefacts

  • An executable Jupyter notebook series (~190 min content)
  • dist/mie.owl — RDF/XML, OWL 2 DL-clean
  • dist/mie.ttl — Turtle
  • 48 classes, 66 individuals, zero local object/data properties
  • Reasoner-validated under HermiT
  • FAIRness self-check: 12 / 12 indicators
  • FOOPS! external assessment (network permitting)

Transferable skills

  • Fluent in SULO's top-level categories and properties
  • Confident with the PRO and SOLID design patterns
  • Can write OWL class expressions that drive classification under OWA
  • Can query an ontology with SPARQL 1.1 property paths
  • Can package an OWL ontology for FAIR publishing
  • Can read a FOOPS! report and close the gaps it identifies

Speakers & Resources

Michel Dumontier

Distinguished Professor of Data Science
Maastricht University · Institute of Data Science
Co-founder of the FAIR principles · Co-creator of SULO

Remzi Celebi

Assistant Professor
Maastricht University · Institute of Data Science
Biomedical knowledge graphs · semantic data integration · ML for health

Resources

▸ Notebooks: github.com/MaastrichtU-IDS/sulo-tutorialnotebooks/mie2026/

▸ SULO: w3id.org/sulo  ·  PRO: w3id.org/ontostart/pro/

▸ OntoStart: github.com/micheldumontier/ontostart  ·  FOOPS!: foops.linkeddata.es

Welcome — let's begin Mary's odyssey.