From 5ddb7e818aaf96cef4c6ba9179c04151613f9211 Mon Sep 17 00:00:00 2001 From: kempersc Date: Wed, 14 Jan 2026 15:20:53 +0100 Subject: [PATCH] Refactor schema: Migrate slots to new patterns and create new classes - Migrated `audio_event_segments` to `has_or_had_segment` with range `AudioEventSegment` in VideoAudioAnnotation.yaml. - Removed deprecated slots: `approved_by`, `audio_event_segments`, `bay_number`, `box_number`, and `budget_status`. - Created new classes: `AudioEventSegment`, `BayNumber`, `BoxNumber`, and `BudgetStatus` to encapsulate previously slot-based data. - Introduced `has_or_had_auxiliary_entities` slot to replace `auxiliary_places` and `auxiliary_platforms`. - Archived removed slots to maintain historical context. - Updated LinkMLViewerPage to utilize new schema element popup for better navigation. --- .../schemas/20251121/linkml/manifest.json | 53 +++--- .../modules/classes/AudioEventSegment.yaml | 172 ++++++++++++++++++ .../linkml/modules/classes/BayNumber.yaml | 92 ++++++++++ .../linkml/modules/classes/BoxNumber.yaml | 97 ++++++++++ .../linkml/modules/classes/Budget.yaml | 38 +++- .../linkml/modules/classes/BudgetStatus.yaml | 105 +++++++++++ .../classes/StorageConditionPolicy.yaml | 5 +- .../linkml/modules/classes/StorageUnit.yaml | 41 +++-- .../modules/classes/VideoAudioAnnotation.yaml | 23 ++- .../approved_by_archived_20260114.yaml} | 0 ...dio_event_segments_archived_20260114.yaml} | 0 .../bay_number_archived_20260114.yaml} | 0 .../box_number_archived_20260114.yaml} | 0 .../budget_status_archived_20260114.yaml} | 0 .../linkml/modules/slots/slot_fixes.yaml | 103 +++++++++++ frontend/src/pages/LinkMLViewerPage.tsx | 18 +- schemas/20251121/linkml/manifest.json | 53 +++--- .../modules/classes/CustodianPlace.yaml | 16 +- .../approved_by_archived_20260114.yaml} | 0 .../auxiliary_places_archived_20260114.yaml} | 0 .../slots/has_or_had_auxiliary_entities.yaml | 58 ++++++ .../linkml/modules/slots/slot_fixes.yaml | 26 ++- 22 files changed, 803 insertions(+), 97 deletions(-) create mode 100644 frontend/public/schemas/20251121/linkml/modules/classes/AudioEventSegment.yaml create mode 100644 frontend/public/schemas/20251121/linkml/modules/classes/BayNumber.yaml create mode 100644 frontend/public/schemas/20251121/linkml/modules/classes/BoxNumber.yaml create mode 100644 frontend/public/schemas/20251121/linkml/modules/classes/BudgetStatus.yaml rename frontend/public/schemas/20251121/linkml/modules/slots/{approved_by.yaml => archive/approved_by_archived_20260114.yaml} (100%) rename frontend/public/schemas/20251121/linkml/modules/slots/{audio_event_segments.yaml => archive/audio_event_segments_archived_20260114.yaml} (100%) rename frontend/public/schemas/20251121/linkml/modules/slots/{bay_number.yaml => archive/bay_number_archived_20260114.yaml} (100%) rename frontend/public/schemas/20251121/linkml/modules/slots/{box_number.yaml => archive/box_number_archived_20260114.yaml} (100%) rename frontend/public/schemas/20251121/linkml/modules/slots/{budget_status.yaml => archive/budget_status_archived_20260114.yaml} (100%) rename schemas/20251121/linkml/modules/slots/{approved_by.yaml => archive/approved_by_archived_20260114.yaml} (100%) rename schemas/20251121/linkml/modules/slots/{auxiliary_places.yaml => archive/auxiliary_places_archived_20260114.yaml} (100%) create mode 100644 schemas/20251121/linkml/modules/slots/has_or_had_auxiliary_entities.yaml diff --git a/frontend/public/schemas/20251121/linkml/manifest.json b/frontend/public/schemas/20251121/linkml/manifest.json index f71dc78aad..17515d8d8b 100644 --- a/frontend/public/schemas/20251121/linkml/manifest.json +++ b/frontend/public/schemas/20251121/linkml/manifest.json @@ -1,12 +1,12 @@ { - "generated": "2026-01-14T14:13:07.428Z", + "generated": "2026-01-14T14:15:37.461Z", "schemaRoot": "/schemas/20251121/linkml", - "totalFiles": 2884, + "totalFiles": 2883, "categoryCounts": { "main": 4, - "class": 679, + "class": 683, "enum": 147, - "slot": 2050, + "slot": 2045, "module": 4 }, "categories": [ @@ -280,6 +280,11 @@ "path": "modules/classes/AssociationArchive.yaml", "category": "class" }, + { + "name": "AudioEventSegment", + "path": "modules/classes/AudioEventSegment.yaml", + "category": "class" + }, { "name": "AudiovisualArchive", "path": "modules/classes/AudiovisualArchive.yaml", @@ -345,6 +350,11 @@ "path": "modules/classes/BankArchiveRecordSetTypes.yaml", "category": "class" }, + { + "name": "BayNumber", + "path": "modules/classes/BayNumber.yaml", + "category": "class" + }, { "name": "Bildstelle", "path": "modules/classes/Bildstelle.yaml", @@ -380,6 +390,11 @@ "path": "modules/classes/Bookplate.yaml", "category": "class" }, + { + "name": "BoxNumber", + "path": "modules/classes/BoxNumber.yaml", + "category": "class" + }, { "name": "BranchOffice", "path": "modules/classes/BranchOffice.yaml", @@ -400,6 +415,11 @@ "path": "modules/classes/Budget.yaml", "category": "class" }, + { + "name": "BudgetStatus", + "path": "modules/classes/BudgetStatus.yaml", + "category": "class" + }, { "name": "BudgetType", "path": "modules/classes/BudgetType.yaml", @@ -4227,11 +4247,6 @@ "path": "modules/slots/applies_to_call.yaml", "category": "slot" }, - { - "name": "approved_by", - "path": "modules/slots/approved_by.yaml", - "category": "slot" - }, { "name": "approximate", "path": "modules/slots/approximate.yaml", @@ -4252,11 +4267,6 @@ "path": "modules/slots/asserted_by.yaml", "category": "slot" }, - { - "name": "audio_event_segments", - "path": "modules/slots/audio_event_segments.yaml", - "category": "slot" - }, { "name": "authors", "path": "modules/slots/authors.yaml", @@ -4282,11 +4292,6 @@ "path": "modules/slots/base_surname.yaml", "category": "slot" }, - { - "name": "bay_number", - "path": "modules/slots/bay_number.yaml", - "category": "slot" - }, { "name": "begin_of_the_begin", "path": "modules/slots/begin_of_the_begin.yaml", @@ -4342,11 +4347,6 @@ "path": "modules/slots/bounding_box.yaml", "category": "slot" }, - { - "name": "box_number", - "path": "modules/slots/box_number.yaml", - "category": "slot" - }, { "name": "branch_head", "path": "modules/slots/branch_head.yaml", @@ -4367,11 +4367,6 @@ "path": "modules/slots/budget_currency.yaml", "category": "slot" }, - { - "name": "budget_status", - "path": "modules/slots/budget_status.yaml", - "category": "slot" - }, { "name": "building_floor_area_sqm", "path": "modules/slots/building_floor_area_sqm.yaml", diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/AudioEventSegment.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/AudioEventSegment.yaml new file mode 100644 index 0000000000..fdb9cf924b --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/AudioEventSegment.yaml @@ -0,0 +1,172 @@ +id: https://nde.nl/ontology/hc/class/AudioEventSegment +name: audio_event_segment_class +title: Audio Event Segment Class +description: | + A temporal segment of audio containing a detected audio event (speech, music, silence, etc.). + + MIGRATED from audio_event_segments slot (Rule 53). + Uses generic has_or_had_segment slot with range narrowed to AudioEventSegment. +imports: + - linkml:types + - ../slots/start_seconds + - ../slots/end_seconds + - ../slots/start_time + - ../slots/end_time + - ../slots/segment_index + - ../slots/segment_text + - ../slots/confidence + - ../slots/specificity_annotation + - ../slots/template_specificity + - ./SpecificityAnnotation + - ./TemplateSpecificityScores + - ../enums/AudioEventTypeEnum +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + dcterms: http://purl.org/dc/terms/ + crm: http://www.cidoc-crm.org/cidoc-crm/ + oa: http://www.w3.org/ns/oa# + ma: http://www.w3.org/ns/ma-ont# +default_prefix: hc + +classes: + AudioEventSegment: + class_uri: hc:AudioEventSegment + description: | + A temporal segment of audio containing a detected audio event. + + **DEFINITION**: + + AudioEventSegment represents a bounded temporal portion of audio content + where a specific type of audio event has been detected. This includes: + - Speech segments (with optional speaker/language info) + - Music segments (with optional genre/type info) + - Silence segments (gaps between audio) + - Sound event segments (applause, laughter, ambient sounds) + - Noise segments (for quality assessment) + + **RELATIONSHIP TO VideoTimeSegment**: + + AudioEventSegment is a specialized sibling of VideoTimeSegment: + - Both extend CIDOC-CRM E52_Time-Span concept + - VideoTimeSegment: general video temporal segments + - AudioEventSegment: audio-specific event segments + + **AUDIO EVENT TYPES**: + + | Event Type | Description | Example | + |------------|-------------|---------| + | SPEECH | Human speech detected | Interview segment | + | MUSIC | Music detected | Background soundtrack | + | SILENCE | Very low or no audio | Gap between segments | + | SOUND_EVENT | Non-speech/music sounds | Applause, footsteps | + | NOISE | Noise/interference | Quality issue marker | + | MIXED | Multiple event types | Overlapping audio | + + **HERITAGE USE CASES**: + + | Content Type | Application | + |--------------|-------------| + | Oral histories | Speech segment identification | + | Virtual tours | Background music detection | + | Lecture recordings | Audience reaction segments | + | Conservation videos | Narration vs ambient sound | + | Archival footage | Audio quality assessment | + + **PROVENANCE**: + + Created as part of slot migration (Rule 53) from deprecated + `audio_event_segments` slot to generic `has_or_had_segment` pattern. + exact_mappings: + - hc:AudioEventSegment + close_mappings: + - crm:E52_Time-Span + - ma:MediaFragment + related_mappings: + - oa:FragmentSelector + slots: + - start_seconds + - end_seconds + - start_time + - end_time + - segment_index + - segment_text + - confidence + - specificity_annotation + - template_specificity + attributes: + audio_event_type: + range: AudioEventTypeEnum + required: true + description: The type of audio event detected in this segment. + examples: + - value: SPEECH + description: Speech detected in this segment + - value: MUSIC + description: Music detected in this segment + slot_usage: + start_seconds: + range: float + required: true + minimum_value: 0.0 + description: Start time in seconds for this audio event segment. + examples: + - value: 0.0 + description: Audio event starts at beginning + - value: 45.5 + description: Audio event starts at 45.5 seconds + end_seconds: + range: float + required: true + minimum_value: 0.0 + description: End time in seconds for this audio event segment. + examples: + - value: 15.0 + description: Audio event ends at 15 seconds + - value: 60.0 + description: Audio event ends at 1 minute + start_time: + range: string + required: false + pattern: "^PT(\\d+H)?(\\d+M)?(\\d+(\\.\\d+)?S)?$" + description: Start time in ISO 8601 duration format. + examples: + - value: PT0M30S + description: 30 seconds from start + end_time: + range: string + required: false + pattern: "^PT(\\d+H)?(\\d+M)?(\\d+(\\.\\d+)?S)?$" + description: End time in ISO 8601 duration format. + examples: + - value: PT0M45S + description: 45 seconds from start + segment_text: + range: string + required: false + description: Text content for this segment (e.g., speech transcript, music description). + examples: + - value: "Welcome to the Rijksmuseum" + description: Speech transcript text + - value: "Classical background music" + description: Music segment description + confidence: + range: float + required: false + minimum_value: 0.0 + maximum_value: 1.0 + description: Confidence score (0.0-1.0) for the audio event detection. + examples: + - value: 0.95 + description: High confidence detection + - value: 0.72 + description: Medium confidence detection + comments: + - Audio event segment for speech, music, silence, sound event detection + - Temporal boundaries with start/end seconds (primary) and ISO 8601 (secondary) + - Confidence scoring for AI-generated detections + - Part of Rule 53 slot migration from audio_event_segments + see_also: + - https://www.w3.org/TR/media-frags/ + - https://www.w3.org/ns/ma-ont diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/BayNumber.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/BayNumber.yaml new file mode 100644 index 0000000000..fde8859b81 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/BayNumber.yaml @@ -0,0 +1,92 @@ +id: https://nde.nl/ontology/hc/class/BayNumber +name: bay_number_class +title: Bay Number Class +description: | + A storage bay or section identifier within a storage row. + + MIGRATED from bay_number slot (Rule 53). + Uses generic has_or_had_identifier slot with range narrowed to BayNumber. +imports: + - linkml:types + - ../slots/identifier_value + - ../slots/specificity_annotation + - ../slots/template_specificity + - ./SpecificityAnnotation + - ./TemplateSpecificityScores +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + dcterms: http://purl.org/dc/terms/ + crm: http://www.cidoc-crm.org/cidoc-crm/ +default_prefix: hc + +classes: + BayNumber: + class_uri: hc:BayNumber + description: | + An identifier for a storage bay or section within a row/aisle of a storage facility. + + **DEFINITION**: + + BayNumber represents a discrete location identifier within a storage system. + In heritage storage facilities, storage is typically organized hierarchically: + + ``` + Storage Facility + └── Zone (environmental control) + └── Row/Aisle (physical corridor) + └── Bay/Section (THIS CLASS - vertical unit in row) + └── Shelf (horizontal level within bay) + └── Storage Unit (box, drawer, etc.) + ``` + + **TYPICAL VALUES**: + + | Format | Example | Description | + |--------|---------|-------------| + | Numeric | "3", "12" | Sequential bay numbers | + | Alphabetic | "A", "C", "AA" | Lettered bays | + | Mixed | "3A", "B2" | Combined formats | + | Descriptive | "North-3" | Location-based | + + **HERITAGE USE CASES**: + + | Institution Type | Bay Naming Convention | + |------------------|----------------------| + | Archives | Sequential numeric (1, 2, 3...) | + | Museums | Alphanumeric by collection area | + | Libraries | By call number range | + | Natural history | By specimen type | + + **PROVENANCE**: + + Created as part of slot migration (Rule 53) from deprecated + `bay_number` slot to generic `has_or_had_identifier` pattern. + exact_mappings: + - hc:BayNumber + close_mappings: + - crm:E42_Identifier + related_mappings: + - schema:identifier + slots: + - specificity_annotation + - template_specificity + attributes: + value: + range: string + required: true + description: The bay number/identifier value. + examples: + - value: "3" + description: Numeric bay number + - value: "C" + description: Alphabetic bay identifier + - value: "North-3" + description: Location-descriptive bay + comments: + - Storage bay identifier within a row/aisle + - Part of hierarchical storage location addressing + - Part of Rule 53 slot migration from bay_number + see_also: + - https://nde.nl/ontology/hc/StorageUnit diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/BoxNumber.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/BoxNumber.yaml new file mode 100644 index 0000000000..91e6d1867a --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/BoxNumber.yaml @@ -0,0 +1,97 @@ +id: https://nde.nl/ontology/hc/class/BoxNumber +name: box_number_class +title: Box Number Class +description: | + A storage box number or position identifier on a shelf. + + MIGRATED from box_number slot (Rule 53). + Uses generic has_or_had_identifier slot with range narrowed to BoxNumber. +imports: + - linkml:types + - ../slots/identifier_value + - ../slots/specificity_annotation + - ../slots/template_specificity + - ./SpecificityAnnotation + - ./TemplateSpecificityScores +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + dcterms: http://purl.org/dc/terms/ + crm: http://www.cidoc-crm.org/cidoc-crm/ +default_prefix: hc + +classes: + BoxNumber: + class_uri: hc:BoxNumber + description: | + An identifier for a storage box or its position on a shelf. + + **DEFINITION**: + + BoxNumber represents the position or identifier of a storage box within + a storage unit hierarchy. Archive boxes are the most common physical + containers for heritage materials, particularly in archives. + + ``` + Shelf + └── Box 1 (THIS CLASS - position on shelf) + └── Box 2 + └── Box 3 + ... + ``` + + **TYPICAL VALUES**: + + | Type | Example | Description | + |------|---------|-------------| + | Sequential | 1, 2, 3, 12 | Position on shelf left-to-right | + | Inventory | 145, 2024-0042 | Unique box inventory number | + | Combined | 12.3 | Bay 12, Box 3 | + + **ARCHIVE BOX STANDARDS**: + + Heritage institutions typically use acid-free archive boxes conforming to: + - ISO 16245 (Boxes for documents) + - ANSI/NISO Z39.77 (Guidelines for materials in archives) + + **HERITAGE USE CASES**: + + | Material Type | Box Format | + |---------------|------------| + | Documents | Standard archive box (legal/letter) | + | Photographs | Photo storage boxes | + | Oversized | Flat boxes, tubes | + | Fragile | Custom padded boxes | + + **PROVENANCE**: + + Created as part of slot migration (Rule 53) from deprecated + `box_number` slot to generic `has_or_had_identifier` pattern. + exact_mappings: + - hc:BoxNumber + close_mappings: + - crm:E42_Identifier + related_mappings: + - schema:identifier + slots: + - specificity_annotation + - template_specificity + attributes: + value: + range: integer + required: true + minimum_value: 1 + description: The box number (position on shelf or inventory number). + examples: + - value: 12 + description: Box at position 12 on shelf + - value: 145 + description: Archive box inventory number 145 + comments: + - Storage box position identifier + - Typically integer representing shelf position or inventory number + - Part of Rule 53 slot migration from box_number + see_also: + - https://nde.nl/ontology/hc/StorageUnit + - https://www.wikidata.org/wiki/Q854619 diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Budget.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Budget.yaml index 6ce70c552b..68e29d853b 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/Budget.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/Budget.yaml @@ -16,7 +16,10 @@ imports: - ../slots/budget_currency - ../slots/has_or_had_description - ../slots/has_or_had_label -- ../slots/budget_status +# REMOVED - migrated to has_or_had_status with range BudgetStatus (Rule 53) +# - ../slots/budget_status +- ../slots/has_or_had_status +- ./BudgetStatus - ../slots/has_or_had_type - ../slots/capital_budget - ./BudgetType @@ -97,7 +100,9 @@ classes: - budget_currency - has_or_had_description - has_or_had_label - - budget_status + # MIGRATED from budget_status to has_or_had_status (Rule 53) + # - budget_status + - has_or_had_status - has_or_had_type - capital_budget - digitization_budget @@ -249,12 +254,25 @@ classes: description: Agent (person/organization) that approved this budget range: string required: false - budget_status: - range: string + # MIGRATED from budget_status to has_or_had_status (Rule 53) + # budget_status: + # range: string + # required: true + # examples: + # - value: ACTIVE + # description: Current fiscal year budget in effect + has_or_had_status: + description: | + MIGRATED from budget_status (Rule 53). + Current status of this budget in its lifecycle. + Uses BudgetStatus class for structured status tracking. + range: BudgetStatus required: true examples: - - value: ACTIVE - description: Current fiscal year budget in effect + - value: '{value: "ACTIVE", effective_date: "2024-01-01"}' + description: Budget currently in effect + - value: '{value: "DRAFT", effective_date: "2023-10-01"}' + description: Budget under development revision_number: range: integer required: false @@ -319,7 +337,9 @@ classes: endowment_draw: 5000000.0 approval_date: '2023-11-15' is_or_was_approved_by: Board of Directors - budget_status: ACTIVE + has_or_had_status: + value: ACTIVE + effective_date: '2024-01-01' refers_to_custodian: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804 description: Major museum annual operating budget - value: @@ -341,6 +361,8 @@ classes: internal_funding: 2500000.0 approval_date: '2024-03-01' is_or_was_approved_by: Province of Noord-Holland - budget_status: ACTIVE + has_or_had_status: + value: ACTIVE + effective_date: '2024-04-01' refers_to_custodian: https://nde.nl/ontology/hc/nl-nh-haa-a-nha description: Regional archive government-funded budget diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/BudgetStatus.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/BudgetStatus.yaml new file mode 100644 index 0000000000..94761f3d60 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/BudgetStatus.yaml @@ -0,0 +1,105 @@ +id: https://nde.nl/ontology/hc/class/BudgetStatus +name: budget_status_class +title: Budget Status Class +description: | + Status of a heritage custodian budget throughout its lifecycle. + + MIGRATED from budget_status slot (Rule 53). + Uses generic has_or_had_status slot with range narrowed to BudgetStatus. +imports: + - linkml:types + - ../slots/specificity_annotation + - ../slots/template_specificity + - ./SpecificityAnnotation + - ./TemplateSpecificityScores +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + dcterms: http://purl.org/dc/terms/ + frapo: http://purl.org/cerif/frapo/ +default_prefix: hc + +classes: + BudgetStatus: + class_uri: hc:BudgetStatus + description: | + Status of a budget document throughout its lifecycle. + + **DEFINITION**: + + BudgetStatus represents the current state of a budget document + as it moves through the approval and execution lifecycle. + + **BUDGET LIFECYCLE STAGES**: + + ``` + DRAFT → PROPOSED → APPROVED → ACTIVE → REVISED → CLOSED + ↓ ↓ + REJECTED SUPERSEDED + ``` + + **STATUS VALUES**: + + | Status | Description | Typical Duration | + |--------|-------------|------------------| + | DRAFT | Under development | Weeks/months | + | PROPOSED | Submitted for approval | Days/weeks | + | APPROVED | Officially approved | Until fiscal start | + | ACTIVE | Currently in effect | Fiscal year | + | REVISED | Modified after approval | Variable | + | CLOSED | Fiscal period ended | Permanent | + | REJECTED | Not approved | Terminal | + | SUPERSEDED | Replaced by revision | Terminal | + + **HERITAGE INSTITUTION CONTEXT**: + + Heritage institution budgets typically follow these approval paths: + + | Institution Type | Approval Authority | + |------------------|-------------------| + | Museum (stichting) | Board of Directors | + | Regional Archive | Provincial Government | + | National Library | Ministry of Culture | + | University Collection | University Board | + + **PROVENANCE**: + + Created as part of slot migration (Rule 53) from deprecated + `budget_status` slot to generic `has_or_had_status` pattern. + exact_mappings: + - hc:BudgetStatus + close_mappings: + - schema:status + related_mappings: + - dcterms:status + slots: + - specificity_annotation + - template_specificity + attributes: + value: + range: string + required: true + description: | + The budget status value. + Valid values: DRAFT, PROPOSED, APPROVED, ACTIVE, REVISED, CLOSED, REJECTED, SUPERSEDED + examples: + - value: ACTIVE + description: Budget currently in effect + - value: DRAFT + description: Budget under development + - value: CLOSED + description: Fiscal period ended + effective_date: + range: date + required: false + description: Date when this status became effective. + examples: + - value: "2024-01-01" + description: Status effective from start of year + comments: + - Budget lifecycle status tracking + - Supports audit trail of budget state changes + - Part of Rule 53 slot migration from budget_status + see_also: + - https://nde.nl/ontology/hc/Budget diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/StorageConditionPolicy.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/StorageConditionPolicy.yaml index badc553fcd..c9d0cb6654 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/StorageConditionPolicy.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/StorageConditionPolicy.yaml @@ -31,7 +31,7 @@ imports: - ../slots/light_max_lux - ../slots/particulate_max - ../slots/pest_management_required -- ../slots/policy_approved_by +- ../slots/is_or_was_approved_by # MIGRATED: was ../slots/policy_approved_by (2026-01-15) - ../slots/policy_description - ../slots/policy_effective_from - ../slots/policy_effective_to @@ -46,6 +46,7 @@ imports: - ../slots/uv_filtered_required - ./SpecificityAnnotation - ./TemplateSpecificityScores +- ./Approver # Added for is_or_was_approved_by migration (2026-01-15) classes: StorageConditionPolicy: class_uri: odrl:Policy @@ -91,7 +92,7 @@ classes: - note - particulate_max - pest_management_required - - policy_approved_by + - is_or_was_approved_by # MIGRATED: was policy_approved_by (2026-01-15) - policy_description - policy_effective_from - policy_effective_to diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/StorageUnit.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/StorageUnit.yaml index a3a893de6a..7191e38001 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/StorageUnit.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/StorageUnit.yaml @@ -17,8 +17,13 @@ imports: - ../slots/unit_name - ../slots/unit_type - ../slots/capacity_item -- ../slots/bay_number -- ../slots/box_number +# REMOVED - migrated to has_or_had_identifier with range BayNumber (Rule 53) +# - ../slots/bay_number +# REMOVED - migrated to has_or_had_identifier with range BoxNumber (Rule 53) +# - ../slots/box_number +- ../slots/has_or_had_identifier +- ./BayNumber +- ./BoxNumber - ../slots/current_item_count - ../slots/drawer_number - ../slots/part_of_storage @@ -75,8 +80,10 @@ classes: - hc:EnvironmentalZone - schema:Place slots: - - bay_number - - box_number + # MIGRATED from bay_number and box_number to has_or_had_identifier (Rule 53) + # - bay_number + # - box_number + - has_or_had_identifier - capacity_item - current_item_count - drawer_number @@ -124,11 +131,22 @@ classes: - value: A - value: '12' - value: North-3 - bay_number: + has_or_had_identifier: + description: | + MIGRATED from bay_number and box_number (Rule 53). + Storage location identifiers including bay and box numbers. + Use BayNumber for bay/section identifiers, BoxNumber for box positions. range: string + multivalued: true examples: - - value: '3' - - value: C + - value: '[{type: BayNumber, value: "3"}, {type: BoxNumber, value: 12}]' + description: Bay 3, Box 12 + # DEPRECATED - use has_or_had_identifier with range BayNumber + # bay_number: + # range: string + # examples: + # - value: '3' + # - value: C shelf_number: range: integer examples: @@ -138,10 +156,11 @@ classes: range: integer examples: - value: 3 - box_number: - range: integer - examples: - - value: 12 + # DEPRECATED - use has_or_had_identifier with range BoxNumber + # box_number: + # range: integer + # examples: + # - value: 12 capacity_item: range: integer current_item_count: diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/VideoAudioAnnotation.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/VideoAudioAnnotation.yaml index fa28485a39..b899e80a1c 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/VideoAudioAnnotation.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/VideoAudioAnnotation.yaml @@ -5,7 +5,10 @@ imports: - linkml:types - ./VideoAnnotation - ./VideoTimeSegment -- ../slots/audio_event_segments +- ./AudioEventSegment +# REMOVED - migrated to has_or_had_segment with range AudioEventSegment (Rule 53) +# - ../slots/audio_event_segments +- ../slots/has_or_had_segment - ../slots/has_audio_quality_score - ../slots/diarization_confidence - ../slots/diarization_enabled @@ -112,7 +115,9 @@ classes: - wikidata:Q11028 - wikidata:Q638 slots: - - audio_event_segments + # MIGRATED from audio_event_segments to has_or_had_segment (Rule 53) + # - audio_event_segments + - has_or_had_segment - audio_quality_score - diarization_enabled - has_or_had_diarization_segment @@ -138,6 +143,20 @@ classes: - has_or_had_speech_segment - template_specificity slot_usage: + has_or_had_segment: + description: | + MIGRATED from audio_event_segments (Rule 53). + Audio event segments detected in the video content. + range: AudioEventSegment + multivalued: true + required: false + inlined_as_list: true + examples: + - value: '[{audio_event_type: SPEECH, start_seconds: 0.0, end_seconds: 15.0, segment_text: "Speech detected - Speaker 1", confidence: 0.95}]' + description: Speech detection segment + - value: '[{audio_event_type: MUSIC, start_seconds: 30.0, end_seconds: 60.0, segment_text: "Background classical music", confidence: 0.88}]' + description: Music detection segment + # NOTE: has_audio_event_segment is deprecated - use has_or_had_segment above has_audio_event_segment: range: VideoTimeSegment multivalued: true diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/approved_by.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/approved_by_archived_20260114.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/approved_by.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/approved_by_archived_20260114.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/audio_event_segments.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/audio_event_segments_archived_20260114.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/audio_event_segments.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/audio_event_segments_archived_20260114.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/bay_number.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/bay_number_archived_20260114.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/bay_number.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/bay_number_archived_20260114.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/box_number.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/box_number_archived_20260114.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/box_number.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/box_number_archived_20260114.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/budget_status.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/budget_status_archived_20260114.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/budget_status.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/budget_status_archived_20260114.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml index c12aa52f82..cc69eef75d 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml @@ -1344,3 +1344,106 @@ fixes: type: slot - label: WritingSystem type: class + - original_slot_id: https://nde.nl/ontology/hc/slot/worldcat_id + revision: + - label: has_or_had_identifier + type: slot + - label: WorldCatIdentifier + type: class + - original_slot_id: https://nde.nl/ontology/hc/slot/workshop_space + revision: + - label: has_or_had_quantity + type: slot + - label: Quantity + type: class + - original_slot_id: https://nde.nl/ontology/hc/slot/work_location + revision: + - label: has_or_had_location + type: slot + - label: Location + type: class + - original_slot_id: https://nde.nl/ontology/hc/slot/word_count + revision: + - label: has_or_had_quantity + type: slot + - label: WordCount + type: class + - original_slot_id: https://nde.nl/ontology/hc/slot/within_place + revision: + - label: is_or_was_located_within + type: slot + - label: Place + type: class + - original_slot_id: https://nde.nl/ontology/hc/slot/within_auxiliary_place + revision: + - label: is_or_was_located_within + type: slot + - label: Place + type: class + - original_slot_id: https://nde.nl/ontology/hc/slot/wikidata_mapping_rationale + revision: + - label: has_or_had_rationale + type: slot + - label: Rationale + type: class + - original_slot_id: https://nde.nl/ontology/hc/slot/wikidata_mapping + revision: + - label: is_or_was_related_to + type: slot + - label: WikiDataEntry + type: class + - original_slot_id: https://nde.nl/ontology/hc/slot/wikidata_id + revision: + - label: has_or_had_identifier + type: slot + - label: WikiDataIdentifier + type: class + - original_slot_id: https://nde.nl/ontology/hc/slot/wikidata_equivalent + revision: + - label: is_or_was_equivalent_to + type: slot + - label: WikiDataEntry + type: class + - original_slot_id: https://nde.nl/ontology/hc/slot/wikidata_entity_label + revision: + - label: has_or_had_label + type: slot + - label: Label + type: class + - original_slot_id: https://nde.nl/ontology/hc/slot/wikidata_entity_id + revision: + - label: has_or_had_identifier + type: slot + - label: WikiDataIdentifier + type: class + - original_slot_id: https://nde.nl/ontology/hc/slot/wikidata_entity + revision: + - label: has_or_had_identifier + type: slot + - label: WikiDataIdentifier + type: class + - original_slot_id: https://nde.nl/ontology/hc/slot/wikidata_class + revision: + - label: is_or_was_instance_of + type: slot + - label: WikiDataEntry + type: class + - original_slot_id: https://nde.nl/ontology/hc/slot/wikidata_alignment + revision: + - label: is_or_was_related_to + type: slot + - label: WikiDataEntry + type: class + - original_slot_id: https://nde.nl/ontology/hc/slot/wikidata + revision: + - label: is_or_was_instance_of + type: slot + - label: WikiDataEntry + type: class + - original_slot_id: https://nde.nl/ontology/hc/slot/whatsapp_enrichment + revision: + - label: has_or_had_contact_details + type: slot + - label: WhatsAppProfile + type: class + - diff --git a/frontend/src/pages/LinkMLViewerPage.tsx b/frontend/src/pages/LinkMLViewerPage.tsx index b943f61361..70fe5ce5b1 100644 --- a/frontend/src/pages/LinkMLViewerPage.tsx +++ b/frontend/src/pages/LinkMLViewerPage.tsx @@ -2595,7 +2595,7 @@ const LinkMLViewerPage: React.FC = () => { @@ -2612,7 +2612,7 @@ const LinkMLViewerPage: React.FC = () => { @@ -2642,7 +2642,7 @@ const LinkMLViewerPage: React.FC = () => { @@ -4158,6 +4158,16 @@ const LinkMLViewerPage: React.FC = () => { onClose={() => setOntologyPopupCurie(null)} /> )} + + {/* Schema Element Popup - renders when clicking class/slot/enum in Imports/Exports */} + {schemaElementPopup && ( + setSchemaElementPopup(null)} + onNavigate={handleSchemaElementNavigate} + /> + )} ); }; diff --git a/schemas/20251121/linkml/manifest.json b/schemas/20251121/linkml/manifest.json index 9ea6330e99..694547060b 100644 --- a/schemas/20251121/linkml/manifest.json +++ b/schemas/20251121/linkml/manifest.json @@ -1,12 +1,12 @@ { - "generated": "2026-01-14T14:14:23.659Z", + "generated": "2026-01-14T14:20:53.577Z", "schemaRoot": "/schemas/20251121/linkml", - "totalFiles": 2884, + "totalFiles": 2883, "categoryCounts": { "main": 4, - "class": 679, + "class": 683, "enum": 147, - "slot": 2050, + "slot": 2045, "module": 4 }, "categories": [ @@ -280,6 +280,11 @@ "path": "modules/classes/AssociationArchive.yaml", "category": "class" }, + { + "name": "AudioEventSegment", + "path": "modules/classes/AudioEventSegment.yaml", + "category": "class" + }, { "name": "AudiovisualArchive", "path": "modules/classes/AudiovisualArchive.yaml", @@ -345,6 +350,11 @@ "path": "modules/classes/BankArchiveRecordSetTypes.yaml", "category": "class" }, + { + "name": "BayNumber", + "path": "modules/classes/BayNumber.yaml", + "category": "class" + }, { "name": "Bildstelle", "path": "modules/classes/Bildstelle.yaml", @@ -380,6 +390,11 @@ "path": "modules/classes/Bookplate.yaml", "category": "class" }, + { + "name": "BoxNumber", + "path": "modules/classes/BoxNumber.yaml", + "category": "class" + }, { "name": "BranchOffice", "path": "modules/classes/BranchOffice.yaml", @@ -400,6 +415,11 @@ "path": "modules/classes/Budget.yaml", "category": "class" }, + { + "name": "BudgetStatus", + "path": "modules/classes/BudgetStatus.yaml", + "category": "class" + }, { "name": "BudgetType", "path": "modules/classes/BudgetType.yaml", @@ -4227,11 +4247,6 @@ "path": "modules/slots/applies_to_call.yaml", "category": "slot" }, - { - "name": "approved_by", - "path": "modules/slots/approved_by.yaml", - "category": "slot" - }, { "name": "approximate", "path": "modules/slots/approximate.yaml", @@ -4252,11 +4267,6 @@ "path": "modules/slots/asserted_by.yaml", "category": "slot" }, - { - "name": "audio_event_segments", - "path": "modules/slots/audio_event_segments.yaml", - "category": "slot" - }, { "name": "authors", "path": "modules/slots/authors.yaml", @@ -4282,11 +4292,6 @@ "path": "modules/slots/base_surname.yaml", "category": "slot" }, - { - "name": "bay_number", - "path": "modules/slots/bay_number.yaml", - "category": "slot" - }, { "name": "begin_of_the_begin", "path": "modules/slots/begin_of_the_begin.yaml", @@ -4342,11 +4347,6 @@ "path": "modules/slots/bounding_box.yaml", "category": "slot" }, - { - "name": "box_number", - "path": "modules/slots/box_number.yaml", - "category": "slot" - }, { "name": "branch_head", "path": "modules/slots/branch_head.yaml", @@ -4367,11 +4367,6 @@ "path": "modules/slots/budget_currency.yaml", "category": "slot" }, - { - "name": "budget_status", - "path": "modules/slots/budget_status.yaml", - "category": "slot" - }, { "name": "building_floor_area_sqm", "path": "modules/slots/building_floor_area_sqm.yaml", diff --git a/schemas/20251121/linkml/modules/classes/CustodianPlace.yaml b/schemas/20251121/linkml/modules/classes/CustodianPlace.yaml index b27255adc1..f4bb936ecc 100644 --- a/schemas/20251121/linkml/modules/classes/CustodianPlace.yaml +++ b/schemas/20251121/linkml/modules/classes/CustodianPlace.yaml @@ -14,7 +14,9 @@ imports: - ./GeoSpatialPlace - ../enums/PlaceSpecificityEnum - ./ReconstructedEntity -- ../slots/auxiliary_places +# REMOVED - migrated to has_or_had_auxiliary_entities with range AuxiliaryPlace (Rule 53) +# - ../slots/auxiliary_places +- ../slots/has_or_had_auxiliary_entities - ../slots/place_name - ../slots/place_language - ../slots/place_specificity @@ -65,7 +67,9 @@ classes: - prov:Entity - crm:E27_Site slots: - - auxiliary_places + # MIGRATED from auxiliary_places to has_or_had_auxiliary_entities (Rule 53) + # - auxiliary_places + - has_or_had_auxiliary_entities - country - has_feature_type - has_geospatial_location @@ -171,7 +175,11 @@ classes: has_accuracy_in_meters: 50.0 spatial_resolution: NEIGHBORHOOD description: Approximate location from neighborhood reference - has_auxiliary_place: + # MIGRATED from auxiliary_places / has_auxiliary_place (Rule 53) + has_or_had_auxiliary_entities: + description: | + MIGRATED from auxiliary_places (Rule 53). + Subordinate or auxiliary locations associated with this custodian place. range: AuxiliaryPlace multivalued: true inlined_as_list: true @@ -211,7 +219,7 @@ classes: - Link to GeoSpatialPlace via has_geospatial_location slot (TOOI pattern) - Can be vague ('the mansion') or specific ('het museum op het Museumplein 1') - Historical place names capture how custodians were referenced in archival documents - - 'NEW: auxiliary_places links to subordinate AuxiliaryPlace sites (depots, branches, labs)' + - 'MIGRATED: auxiliary_places → has_or_had_auxiliary_entities for AuxiliaryPlace sites (depots, branches, labs)' - Hierarchical pattern mirrors CustodianName → CustodianAppellation relationship see_also: - http://www.cidoc-crm.org/html/cidoc_crm_v7.1.3.html#E53 diff --git a/schemas/20251121/linkml/modules/slots/approved_by.yaml b/schemas/20251121/linkml/modules/slots/archive/approved_by_archived_20260114.yaml similarity index 100% rename from schemas/20251121/linkml/modules/slots/approved_by.yaml rename to schemas/20251121/linkml/modules/slots/archive/approved_by_archived_20260114.yaml diff --git a/schemas/20251121/linkml/modules/slots/auxiliary_places.yaml b/schemas/20251121/linkml/modules/slots/archive/auxiliary_places_archived_20260114.yaml similarity index 100% rename from schemas/20251121/linkml/modules/slots/auxiliary_places.yaml rename to schemas/20251121/linkml/modules/slots/archive/auxiliary_places_archived_20260114.yaml diff --git a/schemas/20251121/linkml/modules/slots/has_or_had_auxiliary_entities.yaml b/schemas/20251121/linkml/modules/slots/has_or_had_auxiliary_entities.yaml new file mode 100644 index 0000000000..c6681c6e82 --- /dev/null +++ b/schemas/20251121/linkml/modules/slots/has_or_had_auxiliary_entities.yaml @@ -0,0 +1,58 @@ +id: https://nde.nl/ontology/hc/slot/has_or_had_auxiliary_entities +name: has_or_had_auxiliary_entities_slot +title: Has Or Had Auxiliary Entities Slot +description: | + Generic slot for auxiliary/supporting entities associated with a primary entity. + + CREATED as part of slot migration (Rule 53) to replace: + - `auxiliary_places` → range: AuxiliaryPlace + - `auxiliary_platforms` → range: AuxiliaryPlatform + + Follows RiC-O temporal predicate pattern (has_or_had_*). +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + rico: https://www.ica.org/standards/RiC/ontology# + schema: http://schema.org/ +imports: +- linkml:types +default_prefix: hc +slots: + has_or_had_auxiliary_entities: + description: >- + Auxiliary or supporting entities associated with the primary entity. + + **SEMANTIC PATTERN**: + + This slot follows the RiC-O temporal predicate pattern (has_or_had_*) + to indicate that auxiliary relationships may change over time. + + **REPLACES**: + + - `auxiliary_places` - Physical locations supporting the main entity + - `auxiliary_platforms` - Digital platforms supporting the main entity + + **USE CASES**: + + 1. **Storage locations**: Off-site storage, external repositories + 2. **Branch facilities**: Satellite offices, reading rooms + 3. **Partner platforms**: External discovery services, aggregators + + slot_uri: rico:hasOrHadPart + range: uriorcurie + multivalued: true + exact_mappings: + - rico:hasOrHadPart + close_mappings: + - schema:hasPart + annotations: + custodian_types: '["*"]' + custodian_types_rationale: Applicable to all heritage custodian types. + custodian_types_primary: M + specificity_score: 0.4 + specificity_rationale: Broadly applicable auxiliary entity relationship. + examples: + - value: "hc:auxiliary-place/rijksmuseum-depot-amersfoort" + description: Off-site storage depot + - value: "hc:auxiliary-platform/europeana-aggregation" + description: External discovery platform diff --git a/schemas/20251121/linkml/modules/slots/slot_fixes.yaml b/schemas/20251121/linkml/modules/slots/slot_fixes.yaml index fea10ebb42..e7bf681de5 100644 --- a/schemas/20251121/linkml/modules/slots/slot_fixes.yaml +++ b/schemas/20251121/linkml/modules/slots/slot_fixes.yaml @@ -421,10 +421,15 @@ fixes: - original_slot_id: https://nde.nl/ontology/hc/slot/approved_by processed: - status: false - timestamp: null - session: null - notes: "Requires Approver class creation" + status: true + timestamp: '2026-01-14T11:15:00Z' + session: "slot-migration-session-8" + notes: | + MIGRATED: approved_by → is_or_was_approved_by + Approver + - is_or_was_approved_by slot already existed + - Approver class already existed + - Budget.yaml already migrated (session 2026-01-15) + - Archived to modules/slots/archive/approved_by_archived_20260114.yaml revision: - label: is_or_was_approved_by type: slot @@ -610,10 +615,15 @@ fixes: - original_slot_id: https://nde.nl/ontology/hc/slot/auxiliary_places processed: - status: false - timestamp: null - session: null - notes: "Maps to existing AuxiliaryPlace class" + status: true + timestamp: '2026-01-14T11:30:00Z' + session: "slot-migration-session-8" + notes: | + MIGRATED: auxiliary_places → has_or_had_auxiliary_entities + AuxiliaryPlace + - Created has_or_had_auxiliary_entities.yaml slot + - AuxiliaryPlace class already existed + - Updated CustodianPlace.yaml: imports, slots list, slot_usage + - Archived to modules/slots/archive/auxiliary_places_archived_20260114.yaml revision: - label: has_or_had_auxiliary_entities type: slot