################################################################################
# MiKaDo — Material integration of Knowledge and Digital observation (mko:)
#
# Pivot OWL 2 TBox. Three content domains (material, digital, knowledge)
# hinged on Activity, qualified by Scale (macro/meso/micro) and W7
# documentation (who, why, what, when, where, how, with what).
# Alignments: rdfs:subClassOf (PROV-O), skos:closeMatch (CIDOC CRM, schema.org).
#
# Version 1.0.0
# https://mikado.map.cnrs.fr/
################################################################################

@prefix mko:     <https://w3id.org/durair/ontology/refoundation#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:     <http://www.w3.org/2002/07/owl#> .
@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .
@prefix dct:     <http://purl.org/dc/terms/> .
@prefix prov:    <http://www.w3.org/ns/prov#> .
@prefix skos:    <http://www.w3.org/2004/02/skos/core#> .
@prefix schema:  <https://schema.org/> .
@prefix wgs84:   <http://www.w3.org/2003/01/geo/wgs84_pos#> .
@prefix crm:     <http://www.cidoc-crm.org/cidoc-crm/v7.1.1/> .
@prefix crmdig:  <http://www.ics.forth.gr/isl/CRMdig/> .
@prefix crmsci:  <http://www.ics.forth.gr/isl/CRMsci/> .
@prefix foaf:    <http://xmlns.com/foaf/0.1/> .
@prefix vann:    <http://purl.org/vocab/vann/> .
@prefix voaf:    <http://purl.org/vocommons/voaf#> .

@base <https://w3id.org/durair/ontology/refoundation> .

################################################################################
# 0. Ontology metadata
################################################################################

<#> a owl:Ontology, voaf:Vocabulary ;
    dct:title           "MiKaDo Ontology"@en ;
    dct:description """Conceptual model for situated observation in heritage science, formalised as a small OWL 2 TBox. Three content domains (material, digital, knowledge) are hinged on Activity, qualified by scale (macro/meso/micro) and W7 documentation (who, why, what, when, where, how, with what). Alignments use rdfs:subClassOf (PROV-O) and skos:closeMatch (CIDOC CRM, schema.org); export graphs may be multi-typed for consumption without a reasoner."""@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" ;
                          schema:url <http://www.ndameheritage.map.cnrs.fr/> ] ;
    dct:created         "2026-04-01"^^xsd:date ;
    dct:modified        "2026-09-15"^^xsd:date ;
    owl:versionInfo     "1.0.0" ;
    owl:versionIRI      <https://w3id.org/durair/ontology/refoundation/1.0.0> ;
    vann:preferredNamespacePrefix "mko" ;
    vann:preferredNamespaceUri    "https://w3id.org/durair/ontology/refoundation#" ;
    rdfs:seeAlso        <https://mikado.map.cnrs.fr/> ;
    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 classes
#
# Hierarchy:
#
#     mko:Entity
#       ├── mko:MaterialEntity
#       ├── mko:DigitalEntity
#       ├── mko:KnowledgeEntity
#       │     └── mko:FieldValue
#       ├── mko:ObservedFeature
#       └── mko:DerivedFeature
#             ├── mko:SpatialBucket
#             ├── mko:MorphologyBucket
#             ├── mko:AppearanceBucket
#             └── mko:SemanticBucket
#
#     mko:Activity
#       ├── mko:MacroActivity
#       ├── mko:MesoActivity
#       └── mko:MicroActivity
#
#     mko:Documentation     (parallel W7 sheet)
#     mko:GraphSnapshot     (export envelope)
################################################################################

mko:Entity a owl:Class ;
    rdfs:subClassOf prov:Entity ;
    rdfs:label   "Entity"@en ;
    rdfs:comment """Anything documentable in the graph: material, digital and knowledge entities, observed facts and derived facts."""@en .

# ─── 1.1 Material ────────────────────────────────────────────────────

mko:MaterialEntity a owl:Class ;
    rdfs:subClassOf mko:Entity ;
    skos:closeMatch crm:E22_Human-Made_Object ,
                    schema:Thing ;
    rdfs:label   "Material Entity"@en ;
    rdfs:comment """Locatable material referent: heritage artefact, specimen, architectural element or excavation object."""@en .

# ─── 1.2 Digital ──────────────────────────────────────────────────

mko:DigitalEntity a owl:Class ;
    rdfs:subClassOf mko:Entity ;
    skos:closeMatch crm:E73_Information_Object ,
                    crmdig:D1_Digital_Object ,
                    schema:CreativeWork ;
    rdfs:label   "Digital Entity"@en ;
    rdfs:comment """Tangible digital representation: camera frame, voice recording, 3D model, point cloud or attached file."""@en .

# ─── 1.3 Knowledge ──────────────────────────────────────────────────

mko:KnowledgeEntity a owl:Class ;
    rdfs:subClassOf mko:Entity ;
    skos:closeMatch crm:E55_Type ,
                    schema:DefinedTerm ;
    rdfs:label   "Knowledge Entity"@en ;
    rdfs:comment """Semantic layer that interprets an observation: titles, classes, template values, structured descriptions and vocabulary alignments."""@en .

mko:FieldValue a owl:Class ;
    rdfs:subClassOf mko:KnowledgeEntity ;
    skos:closeMatch schema:PropertyValue ;
    rdfs:label   "Field Value"@en ;
    rdfs:comment """Reified (field, value) pair from a templated description."""@en .

# ─── 1.4 Observation and derivation pivots ───────────────────────────────

mko:ObservedFeature a owl:Class ;
    rdfs:subClassOf mko:Entity ;
    skos:closeMatch crmsci:S4_Observation ,
                    schema:Observation ;
    rdfs:label   "Observed Feature"@en ;
    rdfs:comment """Documented fact of the world. Anchored to material (isFeatureOf), digital (representedBy) and knowledge (interpretedBy) entities. Produced by a human micro-activity."""@en .

mko:DerivedFeature a owl:Class ;
    rdfs:subClassOf mko:Entity ;
    skos:closeMatch crm:E16_Measurement ,
                    schema:PropertyValue ;
    rdfs:label   "Derived Feature"@en ;
    rdfs:comment """Computed counterpart of ObservedFeature: a fact produced by a deterministic process. Not a material characteristic. Lineage is one of three forms: derivedFrom (gesture descriptors), bucketFamily (similarity buckets), or hasDerivationInput (activity-grain syntheses)."""@en .

mko:SpatialBucket a owl:Class ;
    rdfs:subClassOf mko:DerivedFeature ;
    rdfs:label "Spatial bucket"@en ;
    rdfs:comment """Similarity grouping on a world spatial grid, derived from a 3D centroid (region, voice or measure). Cell size follows the envelope of those centroids. Distinct from morphology."""@en .

mko:MorphologyBucket a owl:Class ;
    rdfs:subClassOf mko:DerivedFeature ;
    rdfs:label "Morphology bucket"@en ;
    rdfs:comment """Discretised shape profile (area, elongation, planarity). Named morphology so that place and form are not confused."""@en .

mko:AppearanceBucket a owl:Class ;
    rdfs:subClassOf mko:DerivedFeature ;
    rdfs:label "Appearance bucket"@en ;
    rdfs:comment """Visual similarity grouping derived from a region appearance descriptor."""@en .

mko:SemanticBucket a owl:Class ;
    rdfs:subClassOf mko:DerivedFeature ;
    rdfs:label "Semantic bucket"@en ;
    rdfs:comment """Semantic similarity grouping from a stable textual aggregate (colour class, template, typed FieldValues). Titles, numeric values and voice transcripts do not enter the aggregate."""@en .

# ─── 1.5 Activity ───────────────────────────────────────────────

mko:Activity a owl:Class ;
    rdfs:subClassOf prov:Activity ;
    skos:closeMatch crm:E5_Event ,
                    schema:Action ;
    rdfs:label   "Activity"@en ;
    rdfs:comment """Documentary activity at any scale — programme, session, field gesture or automatic computation. The hinge of the model: it answers the W7 questions and produces or relates entities."""@en .

mko:MacroActivity a owl:Class ;
    rdfs:subClassOf mko:Activity ;
    rdfs:label   "Macro Activity"@en ;
    rdfs:comment """Highest aggregation: an observation programme or campaign. Contains meso-activities."""@en .

mko:MesoActivity a owl:Class ;
    rdfs:subClassOf mko:Activity ;
    rdfs:label   "Meso Activity"@en ;
    rdfs:comment """Intermediate grain: a work session. Contains micro-activities and belongs to a macro-activity."""@en .

mko:MicroActivity a owl:Class ;
    rdfs:subClassOf mko:Activity ;
    rdfs:label   "Micro Activity"@en ;
    rdfs:comment """Atomic observation gesture: a shot, annotation, voice dictation or measurement. Belongs to a meso-activity."""@en .

# ─── 1.6 Documentation and snapshot ───────────────────────────────────────────

mko:Documentation a owl:Class ;
    skos:closeMatch crm:E73_Information_Object ,
                    schema:CreativeWork ;
    rdfs:label   "Documentation"@en ;
    rdfs:comment """Parallel descriptive sheet that reifies one W7 axis of an activity (who, what, why, when, where, how, with what)."""@en .

mko:GraphSnapshot a owl:Class ;
    rdfs:subClassOf prov:Bundle ;
    skos:closeMatch crm:E73_Information_Object ;
    rdfs:label   "Graph Snapshot"@en ;
    rdfs:comment """Reification of an RDF export (schema version, profile, described programme). A PROV Bundle."""@en .

################################################################################
# 2. Controlled vocabularies
#
# Enumerated literals on Activity / Entity:
#   * mko:domain    ∈ {material, digital, knowledge}
#   * mko:scale     ∈ {macro, meso, micro}
#   * mko:agentKind ∈ {human, automatic, mixed}
#   * mko:agentRole ∈ {acquisition, interpretation, derivation, curation}
#
# On observation / derivation pivots:
#   * mko:featureKind  (region, measurement, voice, frame, voice-spatial, …)
#
# Modelled in SKOS so the lists can be extended and aligned.
#
################################################################################

mko:DomainScheme a skos:ConceptScheme ;
    dct:title "Domain codes"@en ;
    skos:hasTopConcept mko:domain-material , mko:domain-digital , mko:domain-knowledge .

mko:domain-material a skos:Concept ; skos:inScheme mko:DomainScheme ;
    skos:notation "material" ; skos:prefLabel "material"@en .
mko:domain-digital  a skos:Concept ; skos:inScheme mko:DomainScheme ;
    skos:notation "digital"  ; skos:prefLabel "digital"@en .
mko:domain-knowledge a skos:Concept ; skos:inScheme mko:DomainScheme ;
    skos:notation "knowledge" ; skos:prefLabel "knowledge"@en .

mko:ScaleScheme a skos:ConceptScheme ;
    dct:title "Scale codes"@en ;
    skos:hasTopConcept mko:scale-macro , mko:scale-meso , mko:scale-micro .

mko:scale-macro a skos:Concept ; skos:inScheme mko:ScaleScheme ;
    skos:notation "macro" ; skos:prefLabel "macro"@en .
mko:scale-meso  a skos:Concept ; skos:inScheme mko:ScaleScheme ;
    skos:notation "meso"  ; skos:prefLabel "meso"@en .
mko:scale-micro a skos:Concept ; skos:inScheme mko:ScaleScheme ;
    skos:notation "micro" ; skos:prefLabel "micro"@en .

mko:AgentKindScheme a skos:ConceptScheme ;
    dct:title "Agent kinds"@en ;
    skos:hasTopConcept mko:agentKind-human , mko:agentKind-automatic , mko:agentKind-mixed .

mko:agentKind-human a skos:Concept ; skos:inScheme mko:AgentKindScheme ;
    skos:notation "human" ; skos:prefLabel "human"@en .
mko:agentKind-automatic a skos:Concept ; skos:inScheme mko:AgentKindScheme ;
    skos:notation "automatic" ; skos:prefLabel "automatic"@en .
mko:agentKind-mixed a skos:Concept ; skos:inScheme mko:AgentKindScheme ;
    skos:notation "mixed" ; skos:prefLabel "mixed"@en .

mko:AgentRoleScheme a skos:ConceptScheme ;
    dct:title "Agent roles"@en ;
    skos:hasTopConcept mko:agentRole-acquisition , mko:agentRole-interpretation ,
                       mko:agentRole-derivation , mko:agentRole-curation .

mko:agentRole-acquisition a skos:Concept ; skos:inScheme mko:AgentRoleScheme ;
    skos:notation "acquisition" ; skos:prefLabel "acquisition"@en ;
    skos:scopeNote "Direct field capture of a fact."@en .
mko:agentRole-interpretation a skos:Concept ; skos:inScheme mko:AgentRoleScheme ;
    skos:notation "interpretation" ; skos:prefLabel "interpretation"@en ;
    skos:scopeNote "Human semantic designation (title, template, class)."@en .
mko:agentRole-derivation a skos:Concept ; skos:inScheme mko:AgentRoleScheme ;
    skos:notation "derivation" ; skos:prefLabel "derivation"@en ;
    skos:scopeNote "Automatic computation synchronous with the gesture."@en .
mko:agentRole-curation a skos:Concept ; skos:inScheme mko:AgentRoleScheme ;
    skos:notation "curation" ; skos:prefLabel "curation"@en ;
    skos:scopeNote "Controlled-vocabulary alignment, deduplication or curated W7."@en .

mko:FeatureKindScheme a skos:ConceptScheme ;
    dct:title "Feature kinds"@en ;
    skos:hasTopConcept
        mko:featureKind-region , mko:featureKind-measurement , mko:featureKind-voice ,
        mko:featureKind-frame , mko:featureKind-orthophoto , mko:featureKind-video ,
        mko:featureKind-screenshot , mko:featureKind-gcp ,
        mko:featureKind-voice-spatial , mko:featureKind-measurement-dimensional ,
        mko:featureKind-region-geometric , mko:featureKind-region-visual ,
        mko:featureKind-spatial-bucket , mko:featureKind-morphology-bucket ,
        mko:featureKind-appearance-bucket , mko:featureKind-semantic-bucket ,
        mko:featureKind-statistical-profile , mko:featureKind-coverage-matrix ,
        mko:featureKind-coverage-dimension , mko:featureKind-spatial-coverage ,
        mko:featureKind-comparative-report , mko:featureKind-comparison-item ,
        mko:featureKind-derivation-trace .

# Observed facts
mko:featureKind-region        a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "region"        ; skos:prefLabel "region"@en ;
    skos:scopeNote "Graphic 2D/3D annotation on the material referent."@en .
mko:featureKind-measurement   a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "measurement"   ; skos:prefLabel "measurement"@en .
mko:featureKind-voice         a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "voice"         ; skos:prefLabel "voice annotation"@en .
mko:featureKind-frame         a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "frame"         ; skos:prefLabel "frame"@en .
mko:featureKind-orthophoto    a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "orthophoto"    ; skos:prefLabel "orthophoto"@en .
mko:featureKind-video         a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "video"         ; skos:prefLabel "video"@en .
mko:featureKind-screenshot    a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "screenshot"    ; skos:prefLabel "screenshot"@en .
mko:featureKind-gcp           a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "gcp"           ; skos:prefLabel "ground control point"@en .

# Gesture-synchronous derived facts
mko:featureKind-voice-spatial          a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "voice-spatial"          ; skos:prefLabel "voice spatial position"@en .
mko:featureKind-measurement-dimensional a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "measurement-dimensional" ; skos:prefLabel "measurement dimensional literals"@en .
mko:featureKind-region-geometric        a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "region-geometric"       ; skos:prefLabel "region geometric descriptors"@en .
mko:featureKind-region-visual           a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "region-visual"          ; skos:prefLabel "region visual descriptors"@en .

mko:featureKind-spatial-bucket    a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "spatial-bucket"    ; skos:prefLabel "spatial similarity bucket"@en .
mko:featureKind-morphology-bucket a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "morphology-bucket" ; skos:prefLabel "morphology similarity bucket"@en .
mko:featureKind-appearance-bucket a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "appearance-bucket" ; skos:prefLabel "appearance similarity bucket"@en .
mko:featureKind-semantic-bucket   a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "semantic-bucket"   ; skos:prefLabel "semantic similarity bucket"@en .

# Activity-grain syntheses (literals on mko:DerivedFeature; operational types stay in so:)
mko:featureKind-statistical-profile a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "statistical-profile" ; skos:prefLabel "statistical profile"@en ;
    skos:scopeNote "Counts and distributions on a named programme or session."@en .
mko:featureKind-coverage-matrix a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "coverage-matrix" ; skos:prefLabel "coverage matrix"@en ;
    skos:scopeNote "Documentary saturation of the seven W7 axes on a programme."@en .
mko:featureKind-coverage-dimension a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "coverage-dimension" ; skos:prefLabel "coverage dimension"@en ;
    skos:scopeNote "One W7 axis of a coverage matrix."@en .
mko:featureKind-spatial-coverage a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "spatial-coverage" ; skos:prefLabel "spatial coverage"@en ;
    skos:scopeNote "Visited cells of the same world grid as the spatial buckets."@en .
mko:featureKind-comparative-report a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "comparative-report" ; skos:prefLabel "comparative report"@en ;
    skos:scopeNote "Side-by-side reading of two GraphSnapshot envelopes."@en .
mko:featureKind-comparison-item a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "comparison-item" ; skos:prefLabel "comparison item"@en ;
    skos:scopeNote "One method row of a comparative report."@en .
mko:featureKind-derivation-trace a skos:Concept ; skos:inScheme mko:FeatureKindScheme ;
    skos:notation "derivation-trace" ; skos:prefLabel "derivation trace"@en ;
    skos:scopeNote "Reified execution of a derivation method (parameters, software version, window)."@en .

mko:SpatialAcquisitionContextScheme a skos:ConceptScheme ;
    dct:title "Spatial acquisition contexts"@en ;
    skos:hasTopConcept mko:spatialContext-inSitu , mko:spatialContext-exSitu , mko:spatialContext-unknown .
mko:spatialContext-inSitu  a skos:Concept ; skos:inScheme mko:SpatialAcquisitionContextScheme ;
    skos:notation "inSitu"  ; skos:prefLabel "in situ"@en ; skos:scopeNote "Gesture on site, in the presence of the material referent."@en .
mko:spatialContext-exSitu  a skos:Concept ; skos:inScheme mko:SpatialAcquisitionContextScheme ;
    skos:notation "exSitu"  ; skos:prefLabel "ex situ"@en ; skos:scopeNote "Gesture off site, on a previously acquired shot."@en .
mko:spatialContext-unknown a skos:Concept ; skos:inScheme mko:SpatialAcquisitionContextScheme ;
    skos:notation "unknown" ; skos:prefLabel "unknown"@en .

################################################################################
# 3. Object properties
#
# Grouped by axis:
#   3.1. Production (Activity → Entity)
#   3.2. Mereology (Activity → Activity ; Entity → Entity)
#   3.3. Generic reference (Entity → Entity or Concept)
#   3.4. ObservedFeature anchors (three sub-properties of mko:refersTo)
#   3.5. Lineage (DerivedFeature → source)
#   3.6. Temporal sequence (MicroActivity → MicroActivity)
#   3.7. W7 documentation (Activity → Documentation)
#   3.8. Description reification (KnowledgeEntity → FieldValue / DigitalEntity)
#   3.9. Agency (Activity → Agent)
#   3.10. Snapshot (GraphSnapshot → Project)
################################################################################

# ─── 3.1 Production ─────────────────────────────────────────────────────────

mko:produces a owl:ObjectProperty ;
    rdfs:subPropertyOf prov:generated ;
    rdfs:domain mko:Activity ;
    rdfs:range  mko:Entity ;
    skos:closeMatch crm:P108_has_produced , schema:result ;
    rdfs:label   "produces"@en ;
    rdfs:comment """An activity generates an entity (PROV)."""@en .

# ─── 3.2 Mereology ─────────────────────────────────────────────────────────

mko:partOf a owl:ObjectProperty ;
    skos:closeMatch schema:isPartOf , crm:P9i_forms_part_of ;
    rdfs:label   "part of"@en ;
    rdfs:comment """An activity or entity is part of a larger one (typically meso⊂macro, micro⊂meso)."""@en .

mko:contains a owl:ObjectProperty ;
    owl:inverseOf mko:partOf ;
    rdfs:label   "contains"@en ;
    rdfs:comment """Inverse of partOf."""@en .

# ─── 3.3 Generic reference ────────────────────────────────────────────────

mko:refersTo a owl:ObjectProperty ;
    skos:closeMatch crm:P67_refers_to , schema:about ;
    rdfs:label   "refers to"@en ;
    rdfs:comment """Semantic reference without production or mereology. Super-property of the ObservedFeature anchors."""@en .

# ─── 3.4 ObservedFeature anchors ────────

mko:isFeatureOf a owl:ObjectProperty ;
    rdfs:subPropertyOf mko:refersTo ;
    rdfs:domain mko:ObservedFeature ;
    rdfs:range  mko:MaterialEntity ;
    skos:closeMatch crm:P15_was_influenced_by , schema:about ;
    rdfs:label   "is feature of"@en ;
    rdfs:comment """The observed fact is a characteristic of the material object. Derived features do not carry this property."""@en .

mko:representedBy a owl:ObjectProperty ;
    rdfs:subPropertyOf mko:refersTo ;
    rdfs:domain mko:ObservedFeature ;
    rdfs:range  mko:DigitalEntity ;
    skos:closeMatch crm:P138i_has_representation , schema:image ;
    rdfs:label   "represented by"@en ;
    rdfs:comment """The observed fact is represented by a digital entity (frame, audio, …)."""@en .

mko:interpretedBy a owl:ObjectProperty ;
    rdfs:subPropertyOf mko:refersTo ;
    rdfs:domain mko:ObservedFeature ;
    rdfs:range  mko:KnowledgeEntity ;
    skos:closeMatch crm:P67i_is_referred_to_by , schema:about ;
    rdfs:label   "interpreted by"@en ;
    rdfs:comment """The observed fact is interpreted by a knowledge entity (title, class, template, W7 sheet)."""@en .

mko:hasSpatialBucket a owl:ObjectProperty ;
    rdfs:domain mko:ObservedFeature ;
    rdfs:range  mko:SpatialBucket ;
    rdfs:label  "has spatial bucket"@en ;
    rdfs:comment """Links an observed fact to a shared spatial bucket (emitted when at least two facts share the cell)."""@en .

mko:hasMorphologyBucket a owl:ObjectProperty ;
    rdfs:domain mko:ObservedFeature ;
    rdfs:range  mko:MorphologyBucket ;
    rdfs:label  "has morphology bucket"@en ;
    rdfs:comment """Morphology bucket derived from a geometric descriptor."""@en .

mko:hasAppearanceBucket a owl:ObjectProperty ;
    rdfs:domain mko:ObservedFeature ;
    rdfs:range  mko:AppearanceBucket ;
    rdfs:label  "has appearance bucket"@en ;
    rdfs:comment """Appearance bucket derived from a visual descriptor."""@en .

mko:hasSemanticBucket a owl:ObjectProperty ;
    rdfs:domain mko:ObservedFeature ;
    rdfs:range  mko:SemanticBucket ;
    rdfs:label  "has semantic bucket"@en ;
    rdfs:comment """Semantic bucket from a textual aggregate."""@en .

# ─── 3.5 DerivedFeature lineage ───────────────────────────────────────────

mko:derivedFrom a owl:ObjectProperty ;
    rdfs:subPropertyOf prov:wasDerivedFrom ;
    rdfs:domain mko:DerivedFeature ;
    skos:closeMatch crm:P130_shows_features_of ;
    rdfs:label   "derived from"@en ;
    rdfs:comment """Lineage of a gesture-synchronous derived fact to its source (typically an ObservedFeature, sometimes a DigitalEntity). Material anchoring remains transitive. Activity-grain syntheses use hasDerivationInput instead."""@en .

mko:hasDerivationInput a owl:ObjectProperty ;
    rdfs:subPropertyOf prov:wasDerivedFrom ;
    rdfs:domain mko:DerivedFeature ;
    rdfs:label   "has derivation input"@en ;
    rdfs:comment """Lineage of an activity-grain or collection-grain derived fact to the named Activity, GraphSnapshot or parent DerivedFeature it reads. Distinct from derivedFrom (gesture descriptors)."""@en .

mko:asserts a owl:ObjectProperty ;
    rdfs:subPropertyOf prov:wasAttributedTo ;
    skos:closeMatch crm:P67_refers_to ;
    rdfs:label   "asserts"@en ;
    rdfs:comment """Reserved: interpretive assertion from a derived fact onto its source."""@en .

mko:expresses a owl:ObjectProperty ;
    rdfs:label   "expresses"@en ;
    rdfs:comment """Reserved: a measurement expresses a dimension of a material entity."""@en .

# ─── 3.6 Temporal sequence ────────────────────────────────────────────────

mko:follows a owl:ObjectProperty ;
    rdfs:domain mko:MicroActivity ;
    rdfs:range  mko:MicroActivity ;
    skos:closeMatch crm:P183i_starts_after_the_end_of ;
    rdfs:label   "follows"@en ;
    rdfs:comment """Successive micro-activities in a session (`act_n follows act_(n-1)`)."""@en .

mko:firstStep a owl:ObjectProperty ;
    rdfs:domain mko:MesoActivity ;
    rdfs:range  mko:MicroActivity ;
    rdfs:label   "first step"@en ;
    rdfs:comment """Head of the follows chain in a session."""@en .

mko:lastStep a owl:ObjectProperty ;
    rdfs:domain mko:MesoActivity ;
    rdfs:range  mko:MicroActivity ;
    rdfs:label   "last step"@en ;
    rdfs:comment """Tail of the follows chain in a session."""@en .

# ─── 3.7 W7 documentation ───────────────────────────────────────────────────

mko:documentsWho a owl:ObjectProperty ;
    rdfs:domain mko:Activity ;
    rdfs:range  mko:Documentation ;
    skos:closeMatch schema:participant ;
    rdfs:label "documents who"@en ;
    rdfs:comment "W7 Who documentation of the activity."@en .

mko:documentsWhat a owl:ObjectProperty ;
    rdfs:domain mko:Activity ;
    rdfs:range  mko:Documentation ;
    skos:closeMatch schema:about ;
    rdfs:label "documents what"@en ;
    rdfs:comment "W7 What documentation of the activity."@en .

mko:documentsWhy a owl:ObjectProperty ;
    rdfs:domain mko:Activity ;
    rdfs:range  mko:Documentation ;
    skos:closeMatch crm:P21_had_general_purpose ;
    rdfs:label "documents why"@en ;
    rdfs:comment "W7 Why documentation of the activity."@en .

mko:documentsWhen a owl:ObjectProperty ;
    rdfs:domain mko:Activity ;
    rdfs:range  mko:Documentation ;
    skos:closeMatch crm:P4_has_time-span , schema:startTime ;
    rdfs:label "documents when"@en ;
    rdfs:comment "W7 When documentation of the activity."@en .

mko:documentsWhere a owl:ObjectProperty ;
    rdfs:domain mko:Activity ;
    rdfs:range  mko:Documentation ;
    skos:closeMatch crm:P7_took_place_at , schema:location ;
    rdfs:label "documents where"@en ;
    rdfs:comment "W7 Where documentation of the activity."@en .

mko:documentsHow a owl:ObjectProperty ;
    rdfs:domain mko:Activity ;
    rdfs:range  mko:Documentation ;
    skos:closeMatch crm:P32_used_general_technique ;
    rdfs:label "documents how"@en ;
    rdfs:comment "W7 How documentation of the activity."@en .

mko:documentsWhich a owl:ObjectProperty ;
    rdfs:domain mko:Activity ;
    rdfs:range  mko:Documentation ;
    skos:closeMatch crm:P16_used_specific_object , schema:instrument ;
    rdfs:label "documents which"@en ;
    rdfs:comment "W7 With-what documentation of the activity."@en .

# ─── 3.8 Description reification ─────────────────────────────────

mko:hasFieldValue a owl:ObjectProperty ;
    rdfs:domain mko:KnowledgeEntity ;
    rdfs:range  mko:FieldValue ;
    rdfs:label   "has field value"@en ;
    rdfs:comment """Links a description to its (field, value) pairs."""@en .

mko:hasAttachment a owl:ObjectProperty ;
    rdfs:domain mko:KnowledgeEntity ;
    rdfs:range  mko:DigitalEntity ;
    rdfs:label   "has attachment"@en ;
    rdfs:comment """Links a description to user-attached files."""@en .

# ─── 3.9 Agency ─────────────────────────────────────────────────────────

mko:performedBy a owl:ObjectProperty ;
    rdfs:subPropertyOf prov:wasAssociatedWith ;
    rdfs:domain mko:Activity ;
    skos:closeMatch crm:P14_carried_out_by , schema:agent ;
    rdfs:label   "performed by"@en ;
    rdfs:comment """Agent that performed the activity. Qualified by agentKind."""@en .

# ─── 3.10 Graph snapshot ─────────────────────────────────────────────

mko:describesProject a owl:ObjectProperty ;
    rdfs:domain mko:GraphSnapshot ;
    rdfs:label   "describes project"@en ;
    rdfs:comment """Programme serialised by this graph snapshot."""@en .

################################################################################
# 4. Datatype properties
#
# Grouped by:
#   4.1. Classification (Activity and Entity)
#   4.2. Agency (Activity)
#   4.3. Time (Activity)
#   4.4. Georeference (schema:Place / wgs84:)
#   4.5. ObservedFeature pivot
#   4.6. DerivedFeature voice-spatial
#   4.7. DerivedFeature measurement-dimensional
#   4.8. DerivedFeature region-geometric
#   4.9. DerivedFeature region-visual
#   4.10. Description reification (FieldValue + template)
#   4.11. GraphSnapshot
################################################################################

# ─── 4.1 Classification ───────────────────────────────────────────────

mko:domain a owl:DatatypeProperty ;
    rdfs:domain mko:Entity ;
    rdfs:range  xsd:string ;
    rdfs:label  "domain"@en ;
    rdfs:comment "Domain code ∈ {material, digital, knowledge}."@en .

mko:scale a owl:DatatypeProperty ;
    rdfs:range  xsd:string ;
    rdfs:label  "scale"@en ;
    rdfs:comment "Scale code ∈ {macro, meso, micro}."@en .

mko:featureKind a owl:DatatypeProperty ;
    rdfs:range  xsd:string ;
    rdfs:label  "feature kind"@en ;
    rdfs:comment """Kind of observed or derived fact. See FeatureKindScheme."""@en .

mko:spatialAcquisitionContext a owl:DatatypeProperty ;
    rdfs:range  xsd:string ;
    rdfs:label  "spatial acquisition context"@en ;
    rdfs:comment "Code ∈ {inSitu, exSitu, unknown}."@en .

# ─── 4.2 Agency ────────────────────────────────────────────────────────

mko:agentKind a owl:DatatypeProperty ;
    rdfs:subPropertyOf prov:type ;
    rdfs:domain mko:Activity ;
    rdfs:range  xsd:string ;
    rdfs:label  "agent kind"@en ;
    rdfs:comment "Code ∈ {human, automatic, mixed}."@en .

mko:agentRole a owl:DatatypeProperty ;
    rdfs:subPropertyOf prov:type ;
    rdfs:domain mko:Activity ;
    rdfs:range  xsd:string ;
    rdfs:label  "agent role"@en ;
    rdfs:comment "Code ∈ {acquisition, interpretation, derivation, curation}."@en .

# ─── 4.3 Time ───────────────────────────────────────────────────────

mko:performedAt a owl:DatatypeProperty ;
    rdfs:subPropertyOf prov:atTime ;
    rdfs:domain mko:Activity ;
    rdfs:range  xsd:dateTime ;
    skos:closeMatch crm:P4_has_time-span , schema:startTime ;
    rdfs:label  "performed at"@en ;
    rdfs:comment """Instant of a punctual activity, or session start."""@en .

mko:executionStartTime a owl:DatatypeProperty ;
    rdfs:subPropertyOf prov:startedAtTime ;
    rdfs:domain mko:Activity ;
    rdfs:range  xsd:dateTime ;
    skos:closeMatch crm:P82a_begin_of_the_begin ;
    rdfs:label  "execution start time"@en ;
    rdfs:comment """Start of a durative activity window."""@en .

mko:executionEndTime a owl:DatatypeProperty ;
    rdfs:subPropertyOf prov:endedAtTime ;
    rdfs:domain mko:Activity ;
    rdfs:range  xsd:dateTime ;
    skos:closeMatch crm:P82b_end_of_the_end ;
    rdfs:label  "execution end time"@en ;
    rdfs:comment """End of a durative activity window."""@en .

# ─── 4.4 Georeference (schema:Place) ────────────────────

mko:accuracy a owl:DatatypeProperty ;
    rdfs:domain schema:Place ;
    rdfs:range  xsd:float ;
    rdfs:label  "accuracy"@en ;
    rdfs:comment """Horizontal GPS uncertainty radius, in metres."""@en .

# ─── 4.5 ObservedFeature — no extra literals beyond
#         mko:featureKind and mko:spatialAcquisitionContext (see 4.1)

# ─── 4.6 Voice-spatial ──────────────────────────────────────

mko:position3DX a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "position 3D X"@en ;
    rdfs:comment "World 3D position X, in metres."@en .
mko:position3DY a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "position 3D Y"@en .
mko:position3DZ a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "position 3D Z"@en .

# ─── 4.7 Measurement ────────────────────────────

mko:tool a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ; rdfs:range xsd:string ;
    rdfs:label "measurement tool"@en ;
    rdfs:comment "Measurement tool (ruler, lidar, vision, …)."@en .
mko:rawValue a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "raw measurement value"@en .
mko:unit a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ; rdfs:range xsd:string ;
    rdfs:label "measurement unit"@en ;
    rdfs:comment "Physical unit (m, cm, mm, °, …)."@en .
mko:referencePointCount a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ; rdfs:range xsd:integer ;
    rdfs:label "reference point count"@en .
mko:depthConfidenceLevel a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ; rdfs:range xsd:string ;
    rdfs:label "depth confidence level"@en ;
    rdfs:comment "Qualitative level ∈ {low, medium, high}."@en .
mko:depthConfidenceScore a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "depth confidence score"@en .
mko:depthConfidenceLowCount a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ; rdfs:range xsd:integer ;
    rdfs:label "depth confidence low count"@en .
mko:depthConfidenceMediumCount a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ; rdfs:range xsd:integer ;
    rdfs:label "depth confidence medium count"@en .
mko:depthConfidenceHighCount a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ; rdfs:range xsd:integer ;
    rdfs:label "depth confidence high count"@en .
mko:projectionMethod a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ; rdfs:range xsd:string ;
    rdfs:label "projection method"@en .

# ─── 4.8 Region geometry ───────────────────────────────────

mko:centroidX a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "centroid X"@en ;
    rdfs:comment "Region 3D centroid X."@en .
mko:centroidY a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "centroid Y"@en .
mko:centroidZ a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "centroid Z"@en .
mko:centroidDepth a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "centroid depth"@en .

mko:planarity a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "planarity"@en ;
    rdfs:comment "PCA planarity (0 = volumetric, 1 = planar)."@en .
mko:planeNormalX a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "plane normal X"@en .
mko:planeNormalY a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "plane normal Y"@en .
mko:planeNormalZ a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "plane normal Z"@en .

mko:varianceX a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "variance X"@en .
mko:varianceY a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "variance Y"@en .
mko:varianceZ a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "variance Z"@en .

mko:projectedArea a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "projected area"@en ;
    rdfs:comment "Area projected on the region’s principal plane (m²)."@en .
mko:perimeter3D a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "3D perimeter"@en ;
    rdfs:comment "3D stroke perimeter, in metres."@en .

mko:boundingBoxMinX a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float .
mko:boundingBoxMinY a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float .
mko:boundingBoxMinZ a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float .
mko:boundingBoxMaxX a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float .
mko:boundingBoxMaxY a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float .
mko:boundingBoxMaxZ a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float .
mko:boundingLength  a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float .
mko:boundingHeight  a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float .
mko:boundingDepth   a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float .

mko:volume a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "volume"@en ;
    rdfs:comment "3D bounding-box volume (m³)."@en .
mko:diagonal a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "diagonal"@en .
mko:compactness a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "compactness"@en .
mko:elongation a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "elongation"@en .
mko:convexity a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "convexity"@en .
mko:concavity a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "concavity"@en .

mko:clipNear a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float .
mko:clipFar  a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float .
mko:pointCount a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:integer ;
    rdfs:label "point count"@en ;
    rdfs:comment "Number of 3D points in the original stroke."@en .

# ─── 4.9 Region appearance ──────────────────────────────────────

mko:averageColorR a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "average color R"@en ;
    rdfs:comment "Mean colour, red channel (0–255)."@en .
mko:averageColorG a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "average color G"@en .
mko:averageColorB a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "average color B"@en .
mko:averageColorHex a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:string ;
    rdfs:label "average color hex"@en ;
    rdfs:comment "Mean colour as #RRGGBB."@en .
mko:averageHSLH a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "average HSL hue"@en ;
    rdfs:comment "Mean HSL hue (0–360)."@en .
mko:averageHSLS a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "average HSL saturation"@en ;
    rdfs:comment "Mean HSL saturation (0–1)."@en .
mko:averageHSLL a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "average HSL lightness"@en ;
    rdfs:comment "Mean HSL lightness (0–1)."@en .

mko:contrast a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "contrast"@en .
mko:roughness a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "roughness"@en .
mko:entropy a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "entropy"@en .

mko:dominantColorsHex a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:string ;
    rdfs:label "dominant colors hex"@en ;
    rdfs:comment "Dominant colours of the region (#RRGGBB), most frequent first."@en .
mko:dominantColorsProportions a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:float ;
    rdfs:label "dominant colors proportions"@en ;
    rdfs:comment "Pixel share of each dominant colour (0–1)."@en .
mko:pixelCount a owl:DatatypeProperty ; rdfs:domain mko:DerivedFeature ; rdfs:range xsd:integer ;
    rdfs:label "pixel count"@en ;
    rdfs:comment "Pixel count used for visual descriptors."@en .

# ─── 4.10 Template fields ───────────────────────────────

mko:fieldType a owl:DatatypeProperty ;
    rdfs:domain mko:FieldValue ;
    rdfs:range  xsd:string ;
    rdfs:label  "field type"@en ;
    rdfs:comment "Field type ∈ {text, textarea, select, multiselect, number, date, boolean, url}."@en .

mko:templateKey a owl:DatatypeProperty ;
    rdfs:domain mko:KnowledgeEntity ;
    rdfs:range  xsd:string ;
    rdfs:label  "template key"@en ;
    rdfs:comment "Stable key of the description template."@en .

mko:templateLabel a owl:DatatypeProperty ;
    rdfs:domain mko:KnowledgeEntity ;
    rdfs:range  xsd:string ;
    rdfs:label  "template label"@en ;
    rdfs:comment "Human label of the description template."@en .

# ─── 4.11 GraphSnapshot ────────────────────────────────────────────────────

mko:exportProfile a owl:DatatypeProperty ;
    rdfs:domain mko:GraphSnapshot ;
    rdfs:range  xsd:string ;
    rdfs:label  "export profile"@en ;
    rdfs:comment "Export profile identifier."@en .

mko:schemaVersion a owl:DatatypeProperty ;
    rdfs:domain mko:GraphSnapshot ;
    rdfs:range  xsd:integer ;
    rdfs:label  "schema version"@en ;
    rdfs:comment """Export schema version. ≥ 2 adds similarity buckets; ≥ 3 adds acquisition workspace and deskew lineage."""@en .

mko:acquisitionWorkspace a owl:DatatypeProperty ;
    rdfs:domain mko:MacroActivity ;
    rdfs:range  xsd:string ;
    rdfs:label  "acquisition workspace"@en ;
    rdfs:comment """Acquisition workspace of the campaign: lidar, photogrammetry or twoDimensional."""@en .

################################################################################
# 4.12 Similarity-bucket literals
################################################################################

mko:derivationMethod a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ;
    rdfs:range  xsd:string ;
    rdfs:label  "derivation method"@en ;
    rdfs:comment """Versioned algorithm identifier (e.g. durair.spatial-bucket@node-v3, durair.statistical-profile@node-v1)."""@en .

mko:derivationParametersJson a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ;
    rdfs:range  xsd:string ;
    rdfs:label  "derivation parameters JSON"@en ;
    rdfs:comment "Effective parameters as inline JSON."@en .

mko:bucketScheme a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ;
    rdfs:range  xsd:string ;
    rdfs:label  "bucket scheme"@en ;
    rdfs:comment "Stable discretisation scheme name."@en .

mko:bucketFamily a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ;
    rdfs:range  xsd:string ;
    rdfs:label  "bucket family"@en ;
    rdfs:comment "Similarity axis ∈ {spatial, morphology, appearance, semantic}."@en .

mko:bucketSlot a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ;
    rdfs:range  xsd:integer ;
    rdfs:label  "bucket slot"@en ;
    rdfs:comment "Integer slot 0–4095 after hashing (non-spatial axes)."@en .

mko:spatialCellIndexX a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ; rdfs:range xsd:integer ;
    rdfs:label "spatial cell index X"@en .
mko:spatialCellIndexY a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ; rdfs:range xsd:integer ;
    rdfs:label "spatial cell index Y"@en .
mko:spatialCellIndexZ a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ; rdfs:range xsd:integer ;
    rdfs:label "spatial cell index Z"@en .

mko:spatialCellSizeMeters a owl:DatatypeProperty ;
    rdfs:domain mko:DerivedFeature ;
    rdfs:range  xsd:float ;
    rdfs:label  "spatial cell size (m)"@en ;
    rdfs:comment "Cubic cell side length, in metres."@en .

################################################################################
# 5. Disjointness
#
# The three content domains are disjoint. The three activity scales are disjoint.
# Activity is disjoint from Entity.
################################################################################

[] a owl:AllDisjointClasses ;
   owl:members ( mko:MaterialEntity mko:DigitalEntity mko:KnowledgeEntity ) .

[] a owl:AllDisjointClasses ;
   owl:members ( mko:MacroActivity mko:MesoActivity mko:MicroActivity ) .

mko:Activity owl:disjointWith mko:Entity .

# ObservedFeature and DerivedFeature are not declared disjoint.
