You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
OrderForFourCheesePizza defined as PizzaOrder & refersTo.some(FourCheesePizza)
Defined class for information entities
OrderForSpicyPizza defined as PizzaOrder & refersTo.some(SpicyPizza)
Reusing defined classes across domains
PizzaMakingProcess defined as a sequence through all pizza-making sub-processes
Process as object of description
PizzaRecipe ⊑ InformationObject with refersTo.some(PizzaMakingProcess)
Recipe-to-realization pattern
YOUR TURN exercises
Exercise
Tests
YOUR TURN 1 — NutritionalLabel: Define NutritionalLabel ⊑ InformationObject (refersTo some FoodMaterial); define CalorieCount ⊑ Quantity; create a NutritionalLabel individual for PizzaSlice with a CalorieCount attached
Full information-entity pattern; refersTo; quantity attachment; individual creation
Notebook 05 — Time (05-SULO-tutorial-time.ipynb)
Concepts covered
SULO time hierarchy: TimeInstant, StartTime, EndTime, Duration
sulo:atTime for linking entities to time individuals; sulo:isTimeOf (inverse of atTime) used in defined TimeInstant subclasses
ConstrainedDatatype for Duration value restrictions
TBox-level temporal annotation with atTime.some() on process classes
ABox-level temporal chain with precedes on process individuals
INDIRECT_temporallyPrecedes for transitive ordering queries
Reasoner classification of duration individuals against defined duration classes
Worked examples
Example
Demonstrates
OrderReceivedTime, BakingStartTime/EndTime, DeliveryTime defined with equivalent_to using isTimeOf.some(...)
Defined TimeInstant subclasses tied to specific process types
DeliveryDuration ⊑ Duration; ExpressPizzaDelivery defined with hasValue ≤ 30
Constrained Duration as a defined class
BakingThePizza.is_a.append(atTime.some(BakingStartTime)) etc.
dur_001.hasValue = 25.0; reasoner classifies it as ExpressPizzaDelivery
Individual classification against constrained datatype
YOUR TURN exercises
Exercise
Tests
YOUR TURN 1 — ProofingDuration: Define ProofingDuration ⊑ Duration with hasValue ≥ 60; define SlowFermentedDough as a FoodMaterial with hasFeature.some(ProofingDuration); run reasoner
Duration + constrained datatype + defined class; TBox-level feature constraint
YOUR TURN 2 — PizzaOrderFulfillment: Define PizzaOrderFulfillment as a defined Process with hasPart.some(OrderingProcess) and hasPart.some(DeliveringThePizza); create a plain Process individual with both parts attached; run reasoner and verify classification
Defined process class; cross-notebook composition (NB03 process types + NB05 time); individual classification
Transitivity of containment; INDIRECT_ query prefix
my_box.hasPart remains empty
Containment does not imply parthood
BoxedPizza defined by Pizza & isIn.some(PizzaDeliveryBox); my_pizza classified automatically
Defined class based on spatial relation
Spatial roles on BoxingThePizza, UnboxingThePizza, PlacingPizzaOnTable
Spatial participant roles extending PRO pattern from NB03
default_world.sparql("SELECT ...") on sulo:contains
SPARQL for spatial queries; difference from inferred queries
YOUR TURN exercises
Exercise
Tests
YOUR TURN — Disjointness stress test: Create an individual and assert it is both ContainmentRole and ContainedRole; run the reasoner and observe the inconsistency; clean up with destroy_entity and verify consistency is restored
Disjoint classes; individual-level inconsistency detection; destroy_entity as repair operation
Notebook 07 — Deployment and FAIRness (07-SULO-tutorial-deployment.ipynb)
Purpose
Takes the completed pizza ontology through the metadata, export, and publishing workflow required to make it a FAIR digital resource. Uses the OntoStart CI/CD pipeline for deployment and the FOOPS! tool for automated FAIRness assessment.
Concepts covered
FAIR principles applied to ontologies (Findable, Accessible, Interoperable, Reusable)
owl:versionIRI and owl:versionInfo for ontology versioning
owlready2's format="turtle" produces a 0-byte file
locstr("text", "en") / cls.label.en
Language-tagged RDF labels; .en accessor returns only @en values
pizza.metadata.versionIRI = [iri_string]
owlready2 stores as string literal; rdflib post-processing needed to promote to IRI for FOOPS! VER1
foops_uri = "https://w3id.org/sulo/sulo.owl" as demo default
FOOPS! API requires a live public URI; ontologyContent upload is currently broken in the API
Exercises
Exercise
Tests
Exercise 1 — Add term-level definitions: Write rdfs:comment for 5 classes still missing it; re-run the local pre-check and verify R1.4b improves
Hand-curating rdfs:comment; understanding difference between auto-generated labels and meaningful definitions
Exercise 2 — owl:priorVersion: Add a priorVersion annotation pointing to https://w3id.org/ontostart/pizza/releases/0.9.0/pizza.owl; explain how this supports ontology provenance
OWL versioning; ontology provenance and FAIR principle F2
Exercise 3 — Identify remaining FAIRness gaps(reflection): For 4 listed gaps (missing rdfs:comment, unresolvable version IRI, no priorVersion, missing publisher), explain what the gap is, which FAIR principle it affects, and how to fix it
Connecting ontology engineering practice to FAIR principles; gap analysis