################################################################################
# MiKaDo ⇄ situated-observation (so:) Alignment Bridge
#
# Bridge file aligning the MiKaDo pivot ontology
#   `mko:` <https://w3id.org/durair/ontology/refoundation#>
# with the historical `situated-observation` operational vocabulary
#   `so:`  <https://w3id.org/durair/ontology/situated-observation#>
# emitted by the dür.air iPad engine and declared in `mikado-schema.ttl`.
#
# Conceptual posture
# ------------------
# MiKaDo is published as a *two-layer* ontology:
#
#   • the **pivot layer** (`mko:`) is deliberately minimal — it declares
#     the seven pivot classes (MaterialEntity, DigitalEntity,
#     KnowledgeEntity, ObservedFeature, DerivedFeature, Activity,
#     Documentation/GraphSnapshot) plus the sub-classes that are
#     structurally constitutive of the model (the four bucket axes that
#     organise the reflexive reading of `DerivedFeature`, the three
#     scales that orchestrate the activity domain, the FieldValue
#     reification of template-field couples). The pivot layer is the
#     stable, citable, versioned conceptual artefact;
#
#   • the **operational layer** (`so:`) is the typology of leaf classes
#     that an emitting engine instantiates at runtime — dür.air today,
#     other engines tomorrow. It declares the fine sub-classes of
#     DigitalEntity (CaptureFrame, AnnotationShape, VoiceRecording, …),
#     KnowledgeEntity (DiscursiveKnowledgeEntity, AnnotationClass,
#     AnnotationDescriptionTemplate, …), DerivedFeature
#     (GeometricDescriptorSnapshot, ProvenanceRecord, DerivationTrace,
#     LineageRecord, QualityScore, …) and the W7 documentation sub-forms.
#
# This bridge file makes the two layers formally interoperable:
#   • each `so:` pivot is declared `owl:equivalentClass` to its `mko:`
#     counterpart (clean OWL alignment for reasoners);
#   • each `so:` leaf class is *also* declared `rdfs:subClassOf` its
#     `mko:` pivot (so that RDFS-only consumers — Comunica without
#     reasoning, simple SPARQL stores — see the alignment directly,
#     without an OWL inference step).
#
# Convention
# ----------
# - `owl:equivalentClass` between corresponding pivot classes.
# - `rdfs:subClassOf` from each `so:` leaf class to its `mko:` pivot
#   (and from each `so:` activity sub-class to its `mko:` scale).
# - Bucket renamings (`so:GeometricBucket ≡ mko:MorphologyBucket`,
#   `so:VisualBucket ≡ mko:AppearanceBucket`) are declared as
#   `owl:equivalentClass`, reflecting a deliberate terminological
#   refinement at the pivot layer (separating "place" from "shape" and
#   making "appearance" explicit).
#
# Version : 0.1.0 (initial publication, May 2026).
# License : CC-BY 4.0
################################################################################

@prefix mko:     <https://w3id.org/durair/ontology/refoundation#> .
@prefix so:      <https://w3id.org/durair/ontology/situated-observation#> .
@prefix prov:    <http://www.w3.org/ns/prov#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:     <http://www.w3.org/2002/07/owl#> .
@prefix dct:     <http://purl.org/dc/terms/> .
@prefix foaf:    <http://xmlns.com/foaf/0.1/> .
@prefix schema:  <https://schema.org/> .
@prefix skos:    <http://www.w3.org/2004/02/skos/core#> .
@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .
@prefix vann:    <http://purl.org/vocab/vann/> .

@base <https://w3id.org/durair/alignment/mko-so> .

################################################################################
# 0. Bridge metadata
################################################################################

<#> a owl:Ontology ;
    dct:title           "MiKaDo ⇄ situated-observation Alignment Bridge"@en ;
    dct:description     """Formal alignment between the MiKaDo pivot ontology (mko:) and the historical situated-observation vocabulary (so:) emitted by the dür.air iPad engine. The two layers are interoperable: each so: pivot is declared owl:equivalentClass to its mko: counterpart, and each so: leaf class is also declared rdfs:subClassOf its mko: pivot for RDFS-only consumers. Bucket renamings (Geometric→Morphology, Visual→Appearance) are reflected as owl:equivalentClass."""@en ;
    dct:creator         <https://orcid.org/0000-0001-7600-2273> ,
                        <https://orcid.org/0000-0003-3724-4829> ,
                        <https://orcid.org/0009-0001-3313-0587> ;
    dct:publisher       [ a foaf:Organization ;
                          foaf:name "MAP — UPR 2002 CNRS" ;
                          foaf:homepage <https://www.map.cnrs.fr/> ] ;
    dct:rightsHolder    "CNRS" ;
    schema:funder       [ a schema:Organization ;
                          schema:name "European Research Council" ;
                          schema:alternateName "n-Dame_Heritage" ;
                          schema:identifier "101055423" ] ;
    dct:created         "2026-05-05"^^xsd:date ;
    owl:versionInfo     "0.1.0" ;
    owl:versionIRI      <https://w3id.org/durair/alignment/mko-so/0.1.0> ;
    vann:preferredNamespacePrefix "mko-so" ;
    rdfs:seeAlso        <https://w3id.org/durair/ontology/refoundation> ,
                        <https://w3id.org/durair/ontology/situated-observation> ;
    dct:license         <https://creativecommons.org/licenses/by/4.0/> .

<https://orcid.org/0000-0001-7600-2273> a foaf:Person ;
    foaf:name "Livio De Luca" ;
    foaf:mbox <mailto:livio.deluca@map.cnrs.fr> .

<https://orcid.org/0000-0003-3724-4829> a foaf:Person ;
    foaf:name "Anthony Pamart" .

<https://orcid.org/0009-0001-3313-0587> a foaf:Person ;
    foaf:name "Quentin Vogel" .

################################################################################
# 1. Pivot equivalences (so: ↔ mko:)
#
# The same conceptual pivot is declared in both vocabularies; we make the
# correspondence explicit so that an OWL-aware consumer treats them as
# interchangeable.
################################################################################

so:MaterialEntity     owl:equivalentClass mko:MaterialEntity .
so:DigitalEntity      owl:equivalentClass mko:DigitalEntity .
so:KnowledgeEntity    owl:equivalentClass mko:KnowledgeEntity .
so:ObservedFeature    owl:equivalentClass mko:ObservedFeature .
so:DerivedFeature     owl:equivalentClass mko:DerivedFeature .
so:GraphSnapshot      owl:equivalentClass mko:GraphSnapshot .
so:W7_Documentation   owl:equivalentClass mko:Documentation .

# The historical so:MIKADOFeature root (TBox-only refinement covering both
# Observed and Derived facets) corresponds, at the pivot layer, to the
# union of the two pivots. Declared as a closeMatch — there is no
# corresponding union class in mko:.
so:MIKADOFeature      skos:closeMatch mko:ObservedFeature ,
                                      mko:DerivedFeature .

################################################################################
# 2. Bucket alignments (terminological refinements)
#
# `mko:` reorganises the four bucket axes around the conceptual distinction
# between *place* (Spatial), *shape* (Morphology, formerly "Geometric"),
# *appearance* (Appearance, formerly "Visual") and *meaning* (Semantic).
# The renamings reflect a desire not to confuse "where" with "what shape".
################################################################################

so:SpatialBucket      owl:equivalentClass mko:SpatialBucket .
so:SemanticBucket     owl:equivalentClass mko:SemanticBucket .
so:GeometricBucket    owl:equivalentClass mko:MorphologyBucket .
so:VisualBucket       owl:equivalentClass mko:AppearanceBucket .

################################################################################
# 3. Activity hierarchy alignments (so: → mko: scales)
#
# `so:` declares concrete activity classes at the operational level
# (programme, session, in-situ act, ex-situ act). They subsume into the
# three orthogonal scales of `mko:` (macro / meso / micro).
################################################################################

so:ObservationProgram         rdfs:subClassOf mko:MacroActivity .
so:InSituObservation          rdfs:subClassOf mko:Activity .
so:InSituObservationSession   rdfs:subClassOf mko:MesoActivity .
so:InSituObservationAct       rdfs:subClassOf mko:MicroActivity .
so:ExSituObservation          rdfs:subClassOf mko:Activity .
so:ExSituObservationAct       rdfs:subClassOf mko:MicroActivity .

################################################################################
# 4. Explicit RDFS leaf alignments (for RDFS-only consumers)
#
# In OWL these alignments are entailed by the pivot equivalences of
# Section 1 (since each so: leaf is rdfs:subClassOf its so: pivot in
# mikado-schema.ttl, and each so: pivot is owl:equivalentClass its mko:
# pivot here). We restate them explicitly so that consumers running an
# RDFS-only entailment regime — Comunica without reasoning, plain SPARQL
# stores, lightweight clients — see the alignment without invoking an
# OWL reasoner.
################################################################################

# --- so:DigitalEntity sub-classes -------------------------------------

so:CaptureFrame                       rdfs:subClassOf mko:DigitalEntity .
so:VoiceRecording                     rdfs:subClassOf mko:DigitalEntity .
so:AnnotationShape                    rdfs:subClassOf mko:DigitalEntity .
so:PointAnnotationShape               rdfs:subClassOf mko:DigitalEntity .
so:RegionAttachment                   rdfs:subClassOf mko:DigitalEntity .
so:SessionPointCloud                  rdfs:subClassOf mko:DigitalEntity .
so:PhotogrammetryReconstruction       rdfs:subClassOf mko:DigitalEntity .

# --- so:KnowledgeEntity sub-classes -----------------------------------

so:DiscursiveKnowledgeEntity          rdfs:subClassOf mko:KnowledgeEntity .
so:MetrologicalKnowledgeEntity        rdfs:subClassOf mko:KnowledgeEntity .
so:DerivedKnowledgeEntity             rdfs:subClassOf mko:KnowledgeEntity .
                                # historical, owl:deprecated true in mikado-schema
so:AnnotationClass                    rdfs:subClassOf mko:KnowledgeEntity .
so:AnnotationTitle                    rdfs:subClassOf mko:KnowledgeEntity .
so:AnnotationDescription              rdfs:subClassOf mko:KnowledgeEntity .
so:AnnotationDescriptionTemplate      rdfs:subClassOf mko:KnowledgeEntity .
so:TemplateFieldSlot                  rdfs:subClassOf mko:KnowledgeEntity .
so:TemplateFieldValue                 rdfs:subClassOf mko:KnowledgeEntity ,
                                                       mko:FieldValue .
so:QuantitativeMeasurement            rdfs:subClassOf mko:KnowledgeEntity .

# --- so:DerivedFeature sub-classes ------------------------------------

so:GeometricDescriptorSnapshot        rdfs:subClassOf mko:DerivedFeature .
so:VisualDescriptorSnapshot           rdfs:subClassOf mko:DerivedFeature .
so:StatisticalProfile                 rdfs:subClassOf mko:DerivedFeature .
so:CoverageMatrix                     rdfs:subClassOf mko:DerivedFeature .
so:CoverageDimension                  rdfs:subClassOf mko:DerivedFeature .
so:SpatialCoverage                    rdfs:subClassOf mko:DerivedFeature .
so:ComparativeReport                  rdfs:subClassOf mko:DerivedFeature .
so:ComparisonItem                     rdfs:subClassOf mko:DerivedFeature .
so:ProvenanceRecord                   rdfs:subClassOf mko:DerivedFeature .
so:DerivationTrace                    rdfs:subClassOf mko:DerivedFeature .
so:LineageRecord                      rdfs:subClassOf mko:DerivedFeature .
so:QualityScore                       rdfs:subClassOf mko:DerivedFeature .

# --- W7 documentation sub-forms ---------------------------------------

so:W7_Subform                         rdfs:subClassOf mko:Documentation .
so:W7_Who                             rdfs:subClassOf mko:Documentation .
so:W7_Why                             rdfs:subClassOf mko:Documentation .
so:W7_What                            rdfs:subClassOf mko:Documentation .
so:W7_Where                           rdfs:subClassOf mko:Documentation .
so:W7_When                            rdfs:subClassOf mko:Documentation .
so:W7_How                             rdfs:subClassOf mko:Documentation .
so:W7_WithWhat                        rdfs:subClassOf mko:Documentation .

so:W7_Why_ResearchProject             rdfs:subClassOf mko:Documentation .
so:W7_What_MaterialObject             rdfs:subClassOf mko:Documentation .
so:W7_What_Inventory                  rdfs:subClassOf mko:Documentation .
so:W7_Where_Patrimonial               rdfs:subClassOf mko:Documentation .
so:W7_Where_Enquiry                   rdfs:subClassOf mko:Documentation .
so:W7_How_AcquisitionProtocol         rdfs:subClassOf mko:Documentation .
so:W7_How_SemanticData                rdfs:subClassOf mko:Documentation .
so:W7_WithWhat_Instrumentation        rdfs:subClassOf mko:Documentation .

################################################################################
# 5. Notes on usage
################################################################################
# - This bridge file is distributed alongside `ontology/mikado.ttl`
#   and `mikado-schema.ttl`. Consumers that wish to reason across both
#   layers should load the three files together. Consumers that operate
#   on a single layer can ignore the bridge.
# - The dür.air export engine emits each ABox node with multiple
#   rdf:types, typically combining the `so:` leaf type and its
#   `mko:` pivot in addition to the polyglot multi-typing (PROV-O,
#   CIDOC CRM, schema.org). The bridge is therefore *redundant* with the
#   ABox-level multi-typing for graphs produced by the dür.air engine,
#   but it is *necessary* for any consumer that receives a graph emitted
#   by a different engine (or by an older dür.air version) and wants to
#   query at the `mko:` pivot level only.
################################################################################
