diff --git a/.opencode/rules/broaden-generic-predicate-ranges-rule.md b/.opencode/rules/broaden-generic-predicate-ranges-rule.md new file mode 100644 index 0000000000..663efcaa94 --- /dev/null +++ b/.opencode/rules/broaden-generic-predicate-ranges-rule.md @@ -0,0 +1,179 @@ +# Rule 54: Broaden Generic Predicate Ranges Instead of Creating Bespoke Predicates + +🚨 **CRITICAL**: When fixing gen-owl "Ambiguous type" warnings, **broaden the range of generic predicates** rather than creating specialized bespoke predicates. + +## The Problem + +gen-owl "Ambiguous type" warnings occur when a slot is used as both: +- **DatatypeProperty** (base range: `string`, `integer`, `uri`, etc.) +- **ObjectProperty** (slot_usage override range: a class like `Description`, `SubtitleFormatEnum`) + +This creates OWL ambiguity because OWL requires properties to be either DatatypeProperty OR ObjectProperty, not both. + +## ❌ WRONG Approach: Create Bespoke Predicates + +```yaml +# DON'T DO THIS - creates proliferation of rare-use predicates +slots: + has_or_had_subtitle_format: # Only used by VideoSubtitle + range: SubtitleFormatEnum + has_or_had_transcript_format: # Only used by VideoTranscript + range: TranscriptFormat +``` + +**Why This Is Wrong**: +- Creates **predicate proliferation** (schema bloat) +- Bespoke predicates are **rarely reused** across classes +- **Increases cognitive load** for schema users +- **Fragments the ontology** unnecessarily +- Violates the principle of schema parsimony + +## ✅ CORRECT Approach: Broaden Generic Predicate Ranges + +```yaml +# DO THIS - make the generic predicate flexible enough +slots: + has_or_had_format: + range: uriorcurie # Broadened from string + description: | + The format of a resource. Classes narrow this to specific + enum types (SubtitleFormatEnum, TranscriptFormatEnum) via slot_usage. +``` + +Then in class files, use `slot_usage` to narrow the range: + +```yaml +classes: + VideoSubtitle: + slots: + - has_or_had_format + slot_usage: + has_or_had_format: + range: SubtitleFormatEnum # Narrowed for this class + required: true +``` + +## Range Broadening Options + +| Original Range | Broadened Range | When to Use | +|----------------|-----------------|-------------| +| `string` | `uriorcurie` | When class overrides use URI-identified types or enums | +| `string` | `Any` | When truly polymorphic (strings AND class instances) | +| Specific class | Common base class | When multiple subclasses are used | + +## Decision Tree + +``` +gen-owl warning: "Ambiguous type for: SLOTNAME" + ↓ +Is base slot range a primitive (string, integer, uri)? +├─ YES → Broaden to uriorcurie or Any +│ - Edit modules/slots/SLOTNAME.yaml +│ - Change range: string → range: uriorcurie +│ - Document change with Rule 54 reference +│ - Keep class-level slot_usage overrides (they narrow the range) +│ +└─ NO → Consider if base slot needs common ancestor class + - Create abstract base class if needed + - Or broaden to uriorcurie +``` + +## Implementation Workflow + +1. **Identify warning**: `gen-owl ... 2>&1 | grep "Ambiguous type for:"` + +2. **Check base slot range**: + ```bash + cat modules/slots/SLOTNAME.yaml | grep -A5 "^slots:" | grep "range:" + ``` + +3. **Find class overrides**: + ```bash + for f in modules/classes/*.yaml; do + grep -l "SLOTNAME" "$f" && grep -A3 "SLOTNAME:" "$f" | grep "range:" + done + ``` + +4. **Broaden base range**: + - Edit `modules/slots/SLOTNAME.yaml` + - Change `range: string` → `range: uriorcurie` + - Add annotation documenting the change + +5. **Verify fix**: Run gen-owl and confirm warning is gone + +6. **Keep slot_usage overrides**: Class-level range narrowing is fine and expected + +## Examples + +### Example 1: has_or_had_format + +**Before (caused warning)**: +```yaml +# Base slot +slots: + has_or_had_format: + range: string # DatatypeProperty + +# Class override +classes: + VideoSubtitle: + slot_usage: + has_or_had_format: + range: SubtitleFormatEnum # ObjectProperty → CONFLICT! +``` + +**After (fixed)**: +```yaml +# Base slot - broadened +slots: + has_or_had_format: + range: uriorcurie # Now ObjectProperty-compatible + +# Class override - unchanged, still narrows +classes: + VideoSubtitle: + slot_usage: + has_or_had_format: + range: SubtitleFormatEnum # Valid narrowing +``` + +### Example 2: has_or_had_hypernym + +**Before**: `range: string` (DatatypeProperty) +**After**: `range: uriorcurie` (ObjectProperty-compatible) + +Classes that override to class ranges now work without ambiguity. + +## Validation + +After broadening, run: +```bash +gen-owl 01_custodian_name_modular.yaml 2>&1 | grep "Ambiguous type for: SLOTNAME" +``` + +The warning should disappear without creating new predicates. + +## Anti-Patterns to Avoid + +| ❌ Anti-Pattern | ✅ Correct Pattern | +|----------------|-------------------| +| Create `has_or_had_subtitle_format` | Broaden `has_or_had_format` to `uriorcurie` | +| Create `has_or_had_entity_type` | Broaden `has_or_had_type` to `uriorcurie` | +| Create `has_or_had_X_label` | Broaden `has_or_had_label` to `uriorcurie` | +| Create `has_or_had_X_status` | Broaden `has_or_had_status` to `uriorcurie` | + +## Rationale + +This approach: +1. **Reduces schema complexity** - Fewer predicates to understand +2. **Promotes reuse** - Generic predicates work across domains +3. **Maintains OWL consistency** - Single property type per predicate +4. **Preserves type safety** - slot_usage still enforces class-specific ranges +5. **Follows semantic web best practices** - Broad predicates, narrow contexts + +## See Also + +- Rule 38: Slot Centralization and Semantic URI Requirements +- Rule 39: Slot Naming Convention (RiC-O Style) +- Rule 49: Slot Usage Minimization +- LinkML Documentation: [slot_usage](https://linkml.io/linkml-model/latest/docs/slot_usage/) diff --git a/AGENTS.md b/AGENTS.md index f27acf5017..fbab593372 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -47,7 +47,7 @@ This is NOT a simple data extraction project. This is an **ontology engineering --- -This section summarizes 54 critical rules. Each rule has complete documentation in `.opencode/` files. +This section summarizes 55 critical rules. Each rule has complete documentation in `.opencode/` files. ### Rule 0: LinkML Schemas Are the Single Source of Truth @@ -1735,6 +1735,64 @@ from .provenance import ProvenanceTracker --- +### Rule 55: Broaden Generic Predicate Ranges Instead of Creating Bespoke Predicates + +🚨 **CRITICAL**: When fixing gen-owl "Ambiguous type" warnings, **broaden the range of generic predicates** rather than creating specialized bespoke predicates. + +**The Problem**: gen-owl warnings occur when a slot is used as both: +- **DatatypeProperty** (base range: `string`, `integer`, `uri`) +- **ObjectProperty** (slot_usage override range: a class like `SubtitleFormatEnum`) + +**❌ WRONG Approach - Create Bespoke Predicates**: + +```yaml +# DON'T DO THIS - creates proliferation of rare-use predicates +slots: + has_or_had_subtitle_format: # Only used by VideoSubtitle + range: SubtitleFormatEnum + has_or_had_transcript_format: # Only used by VideoTranscript + range: TranscriptFormat +``` + +**Why This Is Wrong**: +- Creates **predicate proliferation** (schema bloat) +- Bespoke predicates are **rarely reused** +- **Fragments the ontology** unnecessarily + +**✅ CORRECT Approach - Broaden Generic Predicate Ranges**: + +```yaml +# DO THIS - broaden the base slot range +slots: + has_or_had_format: + range: uriorcurie # Broadened from string + +# Classes narrow via slot_usage (this is fine) +classes: + VideoSubtitle: + slot_usage: + has_or_had_format: + range: SubtitleFormatEnum # Valid narrowing +``` + +**Range Broadening Options**: + +| Original Range | Broadened Range | When to Use | +|----------------|-----------------|-------------| +| `string` | `uriorcurie` | When class overrides use URI-identified types/enums | +| `string` | `Any` | When truly polymorphic (strings AND class instances) | +| Specific class | Common base class | When multiple subclasses are used | + +**Implementation Workflow**: +1. Identify warning: `gen-owl ... 2>&1 | grep "Ambiguous type for:"` +2. Broaden base slot range: `range: string` → `range: uriorcurie` +3. Keep class-level slot_usage overrides (they narrow the range) +4. Verify fix: Run gen-owl and confirm warning is gone + +**See**: `.opencode/rules/broaden-generic-predicate-ranges-rule.md` for complete documentation + +--- + ## Appendix: Full Rule Content (No .opencode Equivalent) The following rules have no separate .opencode file and are preserved in full: diff --git a/frontend/public/schemas/20251121/linkml/manifest.json b/frontend/public/schemas/20251121/linkml/manifest.json index 6d8415b821..112c353aea 100644 --- a/frontend/public/schemas/20251121/linkml/manifest.json +++ b/frontend/public/schemas/20251121/linkml/manifest.json @@ -1,12 +1,12 @@ { - "generated": "2026-01-16T13:33:06.596Z", + "generated": "2026-01-16T14:04:19.745Z", "schemaRoot": "/schemas/20251121/linkml", - "totalFiles": 3007, + "totalFiles": 3010, "categoryCounts": { "main": 4, "class": 818, "enum": 152, - "slot": 2029, + "slot": 2032, "module": 4 }, "categories": [ @@ -9182,6 +9182,11 @@ "path": "modules/slots/has_or_had_domain.yaml", "category": "slot" }, + { + "name": "has_or_had_entity_status", + "path": "modules/slots/has_or_had_entity_status.yaml", + "category": "slot" + }, { "name": "has_or_had_environmental_condition", "path": "modules/slots/has_or_had_environmental_condition.yaml", @@ -9447,6 +9452,11 @@ "path": "modules/slots/has_or_had_notes.yaml", "category": "slot" }, + { + "name": "has_or_had_observation_source_document", + "path": "modules/slots/has_or_had_observation_source_document.yaml", + "category": "slot" + }, { "name": "has_or_had_open_access_endpoint", "path": "modules/slots/has_or_had_open_access_endpoint.yaml", @@ -9802,6 +9812,11 @@ "path": "modules/slots/has_or_had_strategic_objective.yaml", "category": "slot" }, + { + "name": "has_or_had_structured_description", + "path": "modules/slots/has_or_had_structured_description.yaml", + "category": "slot" + }, { "name": "has_or_had_sub_collection", "path": "modules/slots/has_or_had_sub_collection.yaml", diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/CateringPlace.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/CateringPlace.yaml index ff0ac8915a..6aec8ec831 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/CateringPlace.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/CateringPlace.yaml @@ -11,7 +11,7 @@ imports: # Shared slots (replacing catering_place_* slots per Rule 53) - ../slots/has_or_had_identifier - ../slots/has_or_had_label - - ../slots/has_or_had_description + - ../slots/has_or_had_structured_description - ./Label - ./Description # Domain-specific slots (kept) @@ -82,7 +82,7 @@ classes: - wd:Q30022 slots: - has_or_had_accessibility_feature - - has_or_had_description # was: catering_place_description - migrated per Rule 53 + - has_or_had_structured_description # was: catering_place_description - migrated per Rule 53 - has_or_had_identifier # was: catering_place_id - migrated per Rule 53 - has_or_had_label # was: catering_place_name - migrated per Rule 53 - catering_price_range @@ -128,7 +128,7 @@ classes: - value: label_text: Van Gogh Museum Café description: Museum café - has_or_had_description: # was: catering_place_description - migrated per Rule 53 + has_or_had_structured_description: # was: catering_place_description - migrated per Rule 53 range: Description inlined: true description: A description of the catering place. @@ -261,7 +261,7 @@ classes: has_or_had_identifier: https://nde.nl/ontology/hc/aux/rijksmuseum-restaurant has_or_had_label: label_text: RIJKS Restaurant - has_or_had_description: + has_or_had_structured_description: description_text: Michelin-starred restaurant serving modern Dutch cuisine. Located in museum atrium with garden views. catering_type: RESTAURANT cuisine_type: Modern Dutch fine dining @@ -280,7 +280,7 @@ classes: has_or_had_identifier: https://nde.nl/ontology/hc/aux/na-cafe has_or_had_label: label_text: Nationaal Archief Café - has_or_had_description: + has_or_had_structured_description: description_text: Casual café for archive visitors. Light lunches, coffee, and pastries. catering_type: CAFE cuisine_type: Café fare, sandwiches, soups @@ -296,7 +296,7 @@ classes: has_or_had_identifier: https://nde.nl/ontology/hc/aux/cafe-americain has_or_had_label: label_text: Café Americain - has_or_had_description: + has_or_had_structured_description: description_text: Historic art deco café dating from 1902. Literary landmark and protected monument. catering_type: HISTORIC_CAFE heritage_type_classification: HISTORIC_RESTAURANT diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/ConservationLab.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/ConservationLab.yaml index 18c74ce448..a3fc5777ce 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/ConservationLab.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/ConservationLab.yaml @@ -19,7 +19,7 @@ imports: # MIGRATED 2026-01-15: lab_* slots replaced with shared slots per Rule 53 - ../slots/has_or_had_identifier # was: lab_id - ../slots/has_or_had_label # was: lab_name - - ../slots/has_or_had_description # was: lab_description + - ../slots/has_or_had_structured_description # was: lab_description - ./Label - ./Description - ../slots/safety_certification @@ -90,7 +90,7 @@ classes: # MIGRATED 2026-01-15: lab_* slots replaced with shared slots per Rule 53 - has_or_had_identifier # was: lab_id - has_or_had_label # was: lab_name - - has_or_had_description # was: lab_description + - has_or_had_structured_description # was: lab_description - safety_certification - specificity_annotation - staff_count @@ -126,7 +126,7 @@ classes: - value: label_text: KB Preservation Laboratory description: Library preservation lab - has_or_had_description: # was: lab_description + has_or_had_structured_description: # was: lab_description range: Description inlined: true description: >- @@ -233,7 +233,7 @@ classes: has_or_had_identifier: https://nde.nl/ontology/hc/aux/rijksmuseum-conservation has_or_had_label: label_text: Rijksmuseum Conservation Studio - has_or_had_description: + has_or_had_structured_description: description_text: State-of-the-art conservation studio specializing in Dutch Golden Age paintings, works on paper, and decorative arts. conservation_specialization: - Paintings @@ -258,7 +258,7 @@ classes: has_or_had_identifier: https://nde.nl/ontology/hc/aux/na-restauratie has_or_had_label: label_text: Nationaal Archief Restauratie Atelier - has_or_had_description: + has_or_had_structured_description: description_text: Paper and parchment conservation workshop serving the national archives. Specializes in historical documents, maps, and seals. conservation_specialization: - Paper diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Custodian.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Custodian.yaml index bdf0674255..345d8c2c12 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/Custodian.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/Custodian.yaml @@ -221,7 +221,6 @@ classes: range: string required: false legal_status: - range: uriorcurie required: false place_designation: range: CustodianPlace diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/CustodianLegalStatus.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/CustodianLegalStatus.yaml index 4914c06379..25f6d247b7 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/CustodianLegalStatus.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/CustodianLegalStatus.yaml @@ -48,7 +48,7 @@ imports: - ../slots/dissolution_date - ../slots/temporal_extent - ../slots/is_or_was_suborganization_of # was: parent_custodian - migrated per Rule 53 (2025-01-15) - - ../slots/legal_status + - ../slots/has_or_had_entity_status - ../slots/governance_structure - ../slots/reconstruction_method - ../slots/is_or_was_derived_from # was: was_derived_from - migrated per Rule 53 @@ -117,7 +117,7 @@ classes: - legal_form - legal_jurisdiction - legal_name - - legal_status + - has_or_had_entity_status - is_or_was_suborganization_of # was: parent_custodian - migrated per Rule 53 (2025-01-15) - primary_register - reconstruction_method @@ -231,7 +231,7 @@ classes: description: | Parent organization in hierarchical structure. MIGRATED from parent_custodian slot per slot_fixes.yaml (Rule 53, 2025-01-15). - legal_status: + has_or_had_entity_status: range: LegalStatus required: true examples: @@ -353,7 +353,7 @@ classes: alpha_2: NL alpha_3: NLD legal_system_type: CIVIL_LAW - legal_status: + has_or_had_entity_status: status_code: ACTIVE status_name: Active is_or_was_derived_from: # was: was_derived_from - migrated per Rule 53 diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Department.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Department.yaml index acf90019b2..4e54db43dc 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/Department.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/Department.yaml @@ -199,7 +199,6 @@ classes: - https://nde.nl/ontology/hc/collection/na-colonial-maps description: Collections managed by Colonial Records Dept located_at: - range: uriorcurie examples: - value: https://nde.nl/ontology/hc/aux-place/nationaal-archief-building-b description: Department located in Building B diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/EducationCenter.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/EducationCenter.yaml index a40f3e055c..b405a0da56 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/EducationCenter.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/EducationCenter.yaml @@ -16,7 +16,7 @@ imports: # Shared slots (replacing education_center_* slots per Rule 53) - ../slots/has_or_had_identifier - ../slots/has_or_had_label - - ../slots/has_or_had_description + - ../slots/has_or_had_structured_description - ./Label - ./Description # Domain-specific slots (kept) @@ -95,7 +95,7 @@ classes: # MIGRATED 2026-01-15: education_center_* slots replaced with shared slots per Rule 53 - has_or_had_identifier # was: education_center_id - has_or_had_label # was: education_center_name - - has_or_had_description # was: education_center_description + - has_or_had_structured_description # was: education_center_description - education_contact_email - education_type_classification - has_av_equipment @@ -135,7 +135,7 @@ classes: - value: | label_text: KB Workshops & Trainingen description: Library education facility - has_or_had_description: + has_or_had_structured_description: range: Description inlined: true description: A description of the education center. @@ -274,7 +274,7 @@ classes: has_or_had_identifier: https://nde.nl/ontology/hc/aux/rijksmuseum-education has_or_had_label: label_text: Rijksmuseum Educatie Centrum - has_or_had_description: + has_or_had_structured_description: description_text: Dedicated education facility offering school programs, family workshops, and teacher training. education_type_classification: EDUCATION_CENTER serves_or_served: # was: target_audience - migrated per Rule 53 @@ -306,7 +306,7 @@ classes: has_or_had_identifier: https://nde.nl/ontology/hc/aux/na-leercentrum has_or_had_label: label_text: Nationaal Archief Leercentrum - has_or_had_description: + has_or_had_structured_description: description_text: Learning center focused on historical research skills and genealogy. education_type_classification: RESOURCE_CENTER serves_or_served: # was: target_audience - migrated per Rule 53 diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/ExhibitionSpace.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/ExhibitionSpace.yaml index d0087bed79..7d5b4eed06 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/ExhibitionSpace.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/ExhibitionSpace.yaml @@ -12,7 +12,7 @@ imports: # Shared slots (replacing exhibition_space_* slots per Rule 53) - ../slots/has_or_had_identifier - ../slots/has_or_had_label - - ../slots/has_or_had_description + - ../slots/has_or_had_structured_description - ./Label - ./Description # Domain-specific slots (kept) @@ -89,7 +89,7 @@ classes: # MIGRATED 2026-01-15: exhibition_space_* slots replaced with shared slots per Rule 53 - has_or_had_identifier # was: exhibition_space_id - has_or_had_label # was: exhibition_space_name - - has_or_had_description # was: exhibition_space_description + - has_or_had_structured_description # was: exhibition_space_description - exhibition_type - gallery_type_classification - has_climate_control @@ -128,7 +128,7 @@ classes: - value: | label_text: Van Gogh Museum Mesdag Collection description: Partner venue exhibition - has_or_had_description: + has_or_had_structured_description: range: Description inlined: true description: A description of the exhibition space. @@ -239,7 +239,7 @@ classes: has_or_had_identifier: https://nde.nl/ontology/hc/aux/rijksmuseum-schiphol-gallery has_or_had_label: label_text: Rijksmuseum Schiphol - has_or_had_description: + has_or_had_structured_description: description_text: Free gallery at Schiphol Airport featuring rotating highlights from the Rijksmuseum collection. exhibition_type: SATELLITE_GALLERY museum_type_classification: ART_MUSEUM @@ -259,7 +259,7 @@ classes: has_or_had_identifier: https://nde.nl/ontology/hc/aux/stedelijk-project-space has_or_had_label: label_text: Stedelijk Museum Bureau Amsterdam - has_or_had_description: + has_or_had_structured_description: description_text: Project space for emerging contemporary artists and experimental exhibitions. exhibition_type: PROJECT_SPACE gallery_type_classification: PROJECT_SPACE diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/GiftShop.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/GiftShop.yaml index 8b0a71f8d7..4b3a346ed3 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/GiftShop.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/GiftShop.yaml @@ -27,7 +27,7 @@ imports: # MIGRATED 2026-01-15: shop_* slots replaced with shared slots per Rule 53 - ../slots/has_or_had_identifier # was: shop_id - ../slots/has_or_had_label # was: shop_name - - ../slots/has_or_had_description # was: shop_description + - ../slots/has_or_had_structured_description # was: shop_description - ./Label - ./Description - ../slots/shop_type @@ -86,7 +86,7 @@ classes: \ - Temporary retail for special exhibition\n - Exhibition catalog, themed merchandise\n\n**Example - Rijksmuseum\ \ Gift Shop**:\n```yaml\nCustodian:\n hc_id: \"https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804\"\n preferred_label:\ \ \"Rijksmuseum\"\n gift_shop:\n - has_or_had_identifier: \"https://nde.nl/ontology/hc/gift-shop/rijksmuseum-shop\" # was: shop_id\n has_or_had_label: # was: shop_name\n label_text:\ - \ \"Rijksmuseum Shop\"\n shop_type: MUSEUM_SHOP\n has_or_had_description: # was: shop_description\n description_text: |\n Award-winning museum shop offering\ + \ \"Rijksmuseum Shop\"\n shop_type: MUSEUM_SHOP\n has_or_had_structured_description: # was: shop_description\n description_text: |\n Award-winning museum shop offering\ \ reproductions, design objects,\n books, and exclusive Rijksmuseum merchandise.\n physical_location:\n\ \ - place_name: \"Rijksmuseum Shop - Main Hall\"\n auxiliary_place_type: RETAIL_SPACE\n street_address:\ \ \"Museumstraat 1, Amsterdam\"\n online_shop:\n - platform_name: \"Rijksmuseum Online Shop\"\n \ @@ -122,7 +122,7 @@ classes: # MIGRATED 2026-01-15: shop_* slots replaced with shared slots per Rule 53 - has_or_had_identifier # was: shop_id - has_or_had_label # was: shop_name - - has_or_had_description # was: shop_description + - has_or_had_structured_description # was: shop_description - shop_type - specificity_annotation - square_meters @@ -155,7 +155,7 @@ classes: - value: label_text: British Library Bookshop description: Library bookshop name - has_or_had_description: # was: shop_description + has_or_had_structured_description: # was: shop_description range: Description inlined: true description: A description of the gift shop. @@ -334,7 +334,7 @@ classes: has_or_had_label: # was: shop_name label_text: Rijksmuseum Shop shop_type: MUSEUM_SHOP - has_or_had_description: # was: shop_description + has_or_had_structured_description: # was: shop_description description_text: Award-winning museum shop offering reproductions, design objects, books, and exclusive Rijksmuseum merchandise. Located in the redesigned entrance hall. physical_location: - place_name: Rijksmuseum Shop - Main Hall @@ -377,7 +377,7 @@ classes: has_or_had_label: # was: shop_name label_text: British Library Shop shop_type: BOOKSHOP - has_or_had_description: # was: shop_description + has_or_had_structured_description: # was: shop_description description_text: Specialist bookshop focusing on rare book facsimiles, literary merchandise, and British Library publications. physical_location: - place_name: British Library Shop @@ -410,7 +410,7 @@ classes: has_or_had_label: # was: shop_name label_text: Vermeer Exhibition Pop-up Shop shop_type: POP_UP - has_or_had_description: # was: shop_description + has_or_had_structured_description: # was: shop_description description_text: Temporary retail for the 2023 Vermeer exhibition with exclusive exhibition merchandise and catalog. physical_location: - place_name: Vermeer Exhibition Shop diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/GoogleMapsPlaywrightEnrichment.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/GoogleMapsPlaywrightEnrichment.yaml index 580176b9e0..d4893e8618 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/GoogleMapsPlaywrightEnrichment.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/GoogleMapsPlaywrightEnrichment.yaml @@ -65,7 +65,7 @@ classes: description: Phone number website: slot_uri: hc:hasWebsite - range: string + range: uri # FIXED 2026-01-16: was string, changed to uri for consistency description: Website URL (may be domain only) close_mappings: - schema:url diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/IntangibleHeritageForm.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/IntangibleHeritageForm.yaml index 9815b7a859..cb08ca5da8 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/IntangibleHeritageForm.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/IntangibleHeritageForm.yaml @@ -21,7 +21,7 @@ imports: # MIGRATED 2026-01-15: heritage_form_* slots replaced with shared slots per Rule 53 - ../slots/has_or_had_identifier # was: heritage_form_id - ../slots/has_or_had_label # was: heritage_form_name - - ../slots/has_or_had_description # was: heritage_form_description + - ../slots/has_or_had_structured_description # was: heritage_form_description - ./Label - ./Description - ../slots/kien_registration_date @@ -139,7 +139,7 @@ classes: - external_link - geographic_scope # MIGRATED 2026-01-15: heritage_form_* slots replaced with shared slots per Rule 53 - - has_or_had_description # was: heritage_form_description + - has_or_had_structured_description # was: heritage_form_description - has_or_had_identifier # was: heritage_form_id - has_or_had_label # was: heritage_form_name - kien_registration_date @@ -197,7 +197,7 @@ classes: label_text: 1 aprilviering Brielle - value: label_text: Bloemencorso Bollenstreek - has_or_had_description: # was: heritage_form_description + has_or_had_structured_description: # was: heritage_form_description required: false range: Description inlined: true @@ -388,7 +388,7 @@ classes: label: "Pride Amsterdam" has_or_had_label: label_text: Pride Amsterdam - has_or_had_description: + has_or_had_structured_description: description_text: "Annual LGBTQ+ celebration featuring the Canal Parade through Amsterdam's historic canals. First held in 1996, it represents Dutch values of tolerance, equality, and freedom." # unesco_domain - MIGRATED to is_or_was_categorized_as (2026-01-14, Rule 53) is_or_was_categorized_as: diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/PersonObservation.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/PersonObservation.yaml index 6e3b3e3142..bfcd2a44cf 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/PersonObservation.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/PersonObservation.yaml @@ -42,6 +42,7 @@ imports: - ../slots/role_start_date - ../slots/role_end_date - ../slots/observation_source + - ../slots/has_or_had_observation_source_document - ../slots/is_or_was_affected_by_event - ../slots/contact_email - ../slots/expertise_area @@ -126,6 +127,7 @@ classes: - linkedin_profile_url - modified - observation_source + - has_or_had_observation_source_document - occupation - person_name - pronoun @@ -246,8 +248,13 @@ classes: range: date required: false observation_source: + range: string + required: false + description: Simple text reference to source (use has_or_had_observation_source_document for structured data) + has_or_had_observation_source_document: range: SourceDocument required: false + inlined: true is_or_was_affected_by_event: range: OrganizationalChangeEvent required: false diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/ProvenanceEvent.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/ProvenanceEvent.yaml index 8a817022f0..5366c900af 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/ProvenanceEvent.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/ProvenanceEvent.yaml @@ -36,7 +36,7 @@ imports: - ../slots/event_timespan - ../slots/footnote - ../slots/from_owner - # REMOVED 2026-01-15: from_owner_text - migrated to has_or_had_description (Rule 53, symmetry with to_owner_text) + # REMOVED 2026-01-15: from_owner_text - migrated to has_or_had_structured_description (Rule 53, symmetry with to_owner_text) - ../slots/lot_number - ../slots/nazi_era_flag - ../slots/price_text @@ -44,8 +44,7 @@ imports: - ../slots/specificity_annotation - ../slots/template_specificity - ../slots/to_owner - - ../slots/has_or_had_description # was: to_owner_text - migrated per Rule 53 (2026-01-15) - - ./Description # for has_or_had_description range + - ../slots/has_or_had_structured_description # was: to_owner_text - migrated per Rule 53 (2026-01-15) # REMOVED 2026-01-15: transfer_location, transfer_location_text - migrated to event_location (Rule 53) - ../slots/event_location - ./SpecificityAnnotation @@ -96,7 +95,7 @@ classes: - event_type - footnote - from_owner - # MIGRATED 2026-01-15: from_owner_text → has_or_had_description (Rule 53, symmetry with to_owner_text) + # MIGRATED 2026-01-15: from_owner_text → has_or_had_structured_description (Rule 53, symmetry with to_owner_text) - lot_number - nazi_era_flag - object_ref @@ -108,7 +107,7 @@ classes: - specificity_annotation - template_specificity - to_owner - - has_or_had_description # was: to_owner_text - migrated per Rule 53 (2026-01-15) + - has_or_had_structured_description # was: to_owner_text - migrated per Rule 53 (2026-01-15) # MIGRATED 2026-01-15: transfer_location, transfer_location_text → event_location (Rule 53) - event_location slot_usage: @@ -169,7 +168,7 @@ classes: inlined: false examples: - value: https://nde.nl/ontology/hc/custodian/nl/mauritshuis - has_or_had_description: # was: to_owner_text, from_owner_text - migrated per Rule 53 (2026-01-15) + has_or_had_structured_description: # was: to_owner_text, from_owner_text - migrated per Rule 53 (2026-01-15) description: | Owner (source or destination) described as text when no structured entity exists. MIGRATED from to_owner_text and from_owner_text per slot_fixes.yaml (Rule 53, 2026-01-15). @@ -178,9 +177,7 @@ classes: - "from_owner": Previous owner (source of transfer) - "to_owner": New owner (destination of transfer) required: false - range: Description multivalued: true - inlined: true examples: # from_owner examples (migrated from from_owner_text) - value: @@ -361,8 +358,8 @@ classes: event_timespan: begin_of_the_begin: '1664-01-01' end_of_the_end: '1667-12-31' - # MIGRATED 2026-01-15: to_owner_text, from_owner_text → has_or_had_description (Rule 53) - has_or_had_description: + # MIGRATED 2026-01-15: to_owner_text, from_owner_text → has_or_had_structured_description (Rule 53) + has_or_had_structured_description: - description_text: Johannes Vermeer, Delft description_type: to_owner # MIGRATED 2026-01-15: transfer_location_text → event_location (Rule 53) @@ -377,8 +374,8 @@ classes: object_ref: https://nde.nl/ontology/hc/object/mauritshuis-girl-pearl-earring event_type: PURCHASE event_date_text: c. 1665-1674 - # MIGRATED 2026-01-15: from_owner_text, to_owner_text → has_or_had_description (Rule 53) - has_or_had_description: + # MIGRATED 2026-01-15: from_owner_text, to_owner_text → has_or_had_structured_description (Rule 53) + has_or_had_structured_description: - description_text: Johannes Vermeer description_type: from_owner - description_text: Pieter van Ruijven, Delft (c. 1665-1674) @@ -395,8 +392,8 @@ classes: event_type: AUCTION event_date: '1696-05-16' event_date_text: May 16, 1696 - # MIGRATED 2026-01-15: from_owner_text, to_owner_text → has_or_had_description (Rule 53) - has_or_had_description: + # MIGRATED 2026-01-15: from_owner_text, to_owner_text → has_or_had_structured_description (Rule 53) + has_or_had_structured_description: - description_text: Estate of Jacob Dissius description_type: from_owner - description_text: Unknown buyer @@ -421,8 +418,8 @@ classes: event_type: PURCHASE event_date: '1881-01-01' event_date_text: '1881' - # MIGRATED 2026-01-15: from_owner_text, to_owner_text → has_or_had_description (Rule 53) - has_or_had_description: + # MIGRATED 2026-01-15: from_owner_text, to_owner_text → has_or_had_structured_description (Rule 53) + has_or_had_structured_description: - description_text: Unknown seller description_type: from_owner - description_text: A.A. des Tombe, The Hague @@ -442,8 +439,8 @@ classes: event_type: BEQUEST event_date: '1903-01-01' event_date_text: '1903' - # MIGRATED 2026-01-15: from_owner_text → has_or_had_description (Rule 53) - has_or_had_description: + # MIGRATED 2026-01-15: from_owner_text → has_or_had_structured_description (Rule 53) + has_or_had_structured_description: - description_text: A.A. des Tombe (d. 1903) description_type: from_owner - description_text: Mauritshuis, The Hague @@ -460,8 +457,8 @@ classes: object_ref: https://nde.nl/ontology/hc/object/example-painting event_type: CONFISCATION event_date_text: '1938' - # MIGRATED 2026-01-15: from_owner_text, to_owner_text → has_or_had_description (Rule 53) - has_or_had_description: + # MIGRATED 2026-01-15: from_owner_text, to_owner_text → has_or_had_structured_description (Rule 53) + has_or_had_structured_description: - description_text: Jewish collector, Vienna description_type: from_owner - description_text: Nazi authorities diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/ProvenanceSources.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/ProvenanceSources.yaml index 47edd56ed3..6be221d6f4 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/ProvenanceSources.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/ProvenanceSources.yaml @@ -99,7 +99,9 @@ classes: multivalued: true inlined_as_list: true description: Manual research source records - website: + # RENAMED 2026-01-16: website → website_source to resolve OWL ambiguous type warning + # (website is used elsewhere with range: uri, here it's range: SourceRecord) + website_source: slot_uri: hc:hasWebsiteSource range: SourceRecord multivalued: true diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/ReadingRoom.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/ReadingRoom.yaml index d9277c9c5a..c4fc1927e2 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/ReadingRoom.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/ReadingRoom.yaml @@ -10,7 +10,7 @@ imports: # MIGRATED 2026-01-15: reading_room_* slots replaced with shared slots per Rule 53 - ../slots/has_or_had_identifier # was: reading_room_id - ../slots/has_or_had_label # was: reading_room_name - - ../slots/has_or_had_description # was: reading_room_description + - ../slots/has_or_had_structured_description # was: reading_room_description - ./Label - ./Description - ../slots/reading_room_type @@ -88,7 +88,7 @@ classes: - has_wifi - opening_hour # MIGRATED 2026-01-15: reading_room_* slots replaced with shared slots per Rule 53 - - has_or_had_description # was: reading_room_description + - has_or_had_structured_description # was: reading_room_description - has_or_had_identifier # was: reading_room_id - has_or_had_label # was: reading_room_name - reading_room_type @@ -126,7 +126,7 @@ classes: - value: label_text: Stadsarchief Amsterdam Studiezaal description: City archive reading room - has_or_had_description: # was: reading_room_description + has_or_had_structured_description: # was: reading_room_description range: Description inlined: true description: A description of the reading room. @@ -253,7 +253,7 @@ classes: has_or_had_identifier: https://nde.nl/ontology/hc/aux/na-studiezaal has_or_had_label: label_text: Nationaal Archief Studiezaal - has_or_had_description: + has_or_had_structured_description: description_text: Main research room for consulting archival collections. Self-service retrieval from open stacks. Staff assistance available. reading_room_type: GENERAL seating_capacity: 80 @@ -277,7 +277,7 @@ classes: has_or_had_identifier: https://nde.nl/ontology/hc/aux/kb-bijzondere-collecties has_or_had_label: label_text: KB Bijzondere Collecties Leeszaal - has_or_had_description: + has_or_had_structured_description: description_text: Special collections reading room for rare books, manuscripts, and incunabula. Supervised handling required. reading_room_type: SPECIAL_COLLECTIONS seating_capacity: 20 diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/ResearchCenter.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/ResearchCenter.yaml index dd91717a60..56168b43a0 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/ResearchCenter.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/ResearchCenter.yaml @@ -20,7 +20,7 @@ imports: # MIGRATED 2026-01-15: research_center_* slots replaced with shared slots per Rule 53 - ../slots/has_or_had_identifier # was: research_center_id - ../slots/has_or_had_label # was: research_center_name - - ../slots/has_or_had_description # was: research_center_description + - ../slots/has_or_had_structured_description # was: research_center_description - ./Label - ./Description - ../slots/research_center_type @@ -89,7 +89,7 @@ classes: - major_research_project - publication_series_name # MIGRATED 2026-01-15: research_center_* slots replaced with shared slots per Rule 53 - - has_or_had_description # was: research_center_description + - has_or_had_structured_description # was: research_center_description - has_or_had_identifier # was: research_center_id - has_or_had_label # was: research_center_name - research_center_type @@ -124,7 +124,7 @@ classes: - value: label_text: NIOD Institute for War, Holocaust and Genocide Studies description: Specialized research institute - has_or_had_description: # was: research_center_description + has_or_had_structured_description: # was: research_center_description range: Description inlined: true description: A description of the research center. @@ -236,7 +236,7 @@ classes: has_or_had_identifier: https://nde.nl/ontology/hc/aux/rijksmuseum-research has_or_had_label: label_text: Rijksmuseum Research Department - has_or_had_description: + has_or_had_structured_description: description_text: Scholarly research on Dutch art and history, with focus on Golden Age. Publishes Rijksmuseum Bulletin and monograph series. research_center_type: RESEARCH_DEPARTMENT research_focus_area: @@ -269,7 +269,7 @@ classes: has_or_had_identifier: https://nde.nl/ontology/hc/aux/kb-dh-lab has_or_had_label: label_text: KB Lab - Digital Humanities - has_or_had_description: + has_or_had_structured_description: description_text: Digital humanities research facility focusing on computational approaches to library collections. research_center_type: DIGITAL_HUMANITIES_CENTER research_focus_area: diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Storage.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Storage.yaml index e09eb0554a..a8c121ae56 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/Storage.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/Storage.yaml @@ -50,8 +50,7 @@ imports: - ../slots/specificity_annotation - ../slots/standards_applied - ../slots/has_or_had_storage_condition - - ../slots/has_or_had_description # was: storage_description - migrated per Rule 53 - - ./Description + - ../slots/has_or_had_structured_description # was: storage_description - migrated per Rule 53 (uses Description class) - ../slots/has_or_had_type - ../slots/has_or_had_storage_unit - ../slots/has_or_had_stores_collection @@ -126,7 +125,7 @@ classes: - specificity_annotation - standards_applied - has_or_had_storage_condition - - has_or_had_description # was: storage_description - migrated per Rule 53 + - has_or_had_structured_description # was: storage_description - migrated per Rule 53 (uses Description class) - has_or_had_identifier # was: storage_id - migrated per Rule 53 - is_or_was_stored_at # was: storage_location - migrated per Rule 53 - has_or_had_label # was: storage_name - migrated per Rule 53 @@ -177,13 +176,11 @@ classes: description: Cold storage for film and photographic materials - value: ART_STORAGE description: Climate-controlled art storage - has_or_had_description: # was: storage_description - migrated per Rule 53 + has_or_had_structured_description: # was: storage_description - migrated per Rule 53 (uses Description class) description: | Description of this storage facility. MIGRATED from storage_description per slot_fixes.yaml (Rule 53). Uses Description class with text and language support. - range: Description - inlined: true multivalued: true examples: - value: | @@ -309,7 +306,7 @@ classes: label_text: Depot Amersfoort language: nl has_or_had_type: ART_STORAGE - has_or_had_description: + has_or_had_structured_description: - description_text: 'Off-site storage depot for Rijksmuseum overflow collections. Climate-controlled facility housing paintings, sculptures, and decorative arts not currently on display.' description_type: storage language: en @@ -331,7 +328,7 @@ classes: label_text: Depot B - Cold Storage language: en has_or_had_type: COLD_STORAGE - has_or_had_description: + has_or_had_structured_description: - description_text: 'Refrigerated vault for film negatives, photographic materials, and temperature-sensitive documents. Maintained at 4°C, 35% RH.' description_type: storage language: en diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/StorageUnit.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/StorageUnit.yaml index 3b23ddfcba..0b13190f53 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/StorageUnit.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/StorageUnit.yaml @@ -40,8 +40,7 @@ imports: - ../slots/stores_or_stored # was: stores_object - migrated per Rule 53 (2026-01-15); range now HeritageObject - ./HeritageObject # Added 2026-01-15 for stores_or_stored range - ../slots/template_specificity - - ../slots/has_or_had_description # was: unit_description - migrated per Rule 53 - - ./Description + - ../slots/has_or_had_structured_description # was: unit_description - migrated per Rule 53 (uses Description class) # REMOVED - migrated to has_or_had_identifier (2026-01-14, Rule 53) # - ../slots/unit_id # - ../slots/unit_identifier @@ -104,7 +103,7 @@ classes: - specificity_annotation - stores_or_stored # was: stores_object - migrated per Rule 53 (2026-01-15) - template_specificity - - has_or_had_description # was: unit_description - migrated per Rule 53 + - has_or_had_structured_description # was: unit_description - migrated per Rule 53 (uses Description class) # REMOVED - migrated to has_or_had_identifier (2026-01-14, Rule 53) # - unit_id # - unit_identifier @@ -136,13 +135,11 @@ classes: unit_type: range: StorageUnitTypeEnum required: true - has_or_had_description: # was: unit_description - migrated per Rule 53 + has_or_had_structured_description: # was: unit_description - migrated per Rule 53 (uses Description class) description: | Description of this storage unit. MIGRATED from unit_description per slot_fixes.yaml (Rule 53). Uses Description class with text and language support. - range: Description - inlined: true multivalued: true row_number: range: string @@ -225,7 +222,7 @@ classes: unit_identifier: NA-2024-BOX-00145 unit_name: Archive Box 145 - WWII Ministry Records unit_type: ARCHIVE_BOX - has_or_had_description: + has_or_had_structured_description: - description_text: 'Acid-free archive box containing Ministry of Defense correspondence from 1940-1945. Handle with care.' description_type: unit language: en @@ -242,7 +239,7 @@ classes: unit_identifier: FF-MAPS-042 unit_name: Flat File Drawer 42 - Netherlands Maps unit_type: FLAT_FILE_DRAWER - has_or_had_description: + has_or_had_structured_description: - description_text: 'Flat file drawer containing oversized maps of the Netherlands, 1850-1920. Climate-controlled environment.' description_type: unit language: en diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/TemporaryLocation.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/TemporaryLocation.yaml index bffe82ae08..96c20cb01a 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/TemporaryLocation.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/TemporaryLocation.yaml @@ -17,7 +17,7 @@ imports: # temp_location_reason → has_or_had_rationale + reason_type (enum) - ../slots/has_or_had_identifier - ../slots/has_or_had_label - - ../slots/has_or_had_description + - ../slots/has_or_had_structured_description - ../slots/has_or_had_rationale - ../slots/has_or_had_type - ../slots/is_active @@ -84,7 +84,7 @@ classes: # temp_location_* slots REMOVED - migrated to generic slots (Rule 53, 2026-01-15) - has_or_had_identifier - has_or_had_label - - has_or_had_description + - has_or_had_structured_description - has_or_had_rationale - has_or_had_type - is_active @@ -124,7 +124,7 @@ classes: description: Traveling exhibition - value: Emergency Collection Storage - Watersnood 2024 description: Emergency relocation - has_or_had_description: + has_or_had_structured_description: range: Description inlined: true description: Detailed description of the temporary location. @@ -229,7 +229,7 @@ classes: has_or_had_identifier: https://nde.nl/ontology/hc/aux/stedelijk-temp-2020 has_or_had_label: - Stedelijk Museum Temporary Entrance - has_or_had_description: + has_or_had_structured_description: - description_text: Temporary entrance during main entrance renovation. Access via garden entrance. description_type: location language: en @@ -252,7 +252,7 @@ classes: has_or_had_identifier: https://nde.nl/ontology/hc/aux/rijksmuseum-popup-groningen has_or_had_label: - Rijksmuseum Pop-up Groningen - has_or_had_description: + has_or_had_structured_description: - description_text: Summer pop-up exhibition in Groninger Forum featuring highlights from the Golden Age collection. description_type: location language: en @@ -272,7 +272,7 @@ classes: has_or_had_identifier: https://nde.nl/ontology/hc/aux/emergency-storage-2024 has_or_had_label: - Emergency Collection Storage - Watersnood 2024 - has_or_had_description: + has_or_had_structured_description: - description_text: Emergency relocation of collection materials following flooding at main depot. description_type: location language: en diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/TransferEvent.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/TransferEvent.yaml index c38606ed0c..b2473cdbaa 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/TransferEvent.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/TransferEvent.yaml @@ -30,7 +30,7 @@ imports: - ../slots/temporal_extent - ../slots/starts_or_started_at_location - ../slots/ends_or_ended_at_location - - ../slots/has_or_had_description + - ../slots/has_or_had_structured_description - ../slots/has_or_had_policy - ../slots/specificity_annotation - ../slots/template_specificity @@ -64,7 +64,7 @@ classes: - `starts_or_started_at_location`: Origin location - `ends_or_ended_at_location`: Destination location - `has_or_had_policy`: Transfer policy governing the transfer - - `has_or_had_description`: Narrative description + - `has_or_had_structured_description`: Narrative description **Replaces** (per slot_fixes.yaml): - `transfer_to_collection_date` (simple date) @@ -86,7 +86,7 @@ classes: - temporal_extent - starts_or_started_at_location - ends_or_ended_at_location - - has_or_had_description + - has_or_had_structured_description - has_or_had_policy - specificity_annotation - template_specificity @@ -110,7 +110,7 @@ classes: range: Location required: false inlined: true - has_or_had_description: + has_or_had_structured_description: description: | Narrative description of the transfer event. range: Description @@ -139,6 +139,6 @@ classes: location_name: "Old Storage Facility" ends_or_ended_at_location: location_name: "New Archive Building" - has_or_had_description: + has_or_had_structured_description: description_text: "Transfer of historical photographs to new climate-controlled facility" description: "Collection relocation transfer" diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/TransferPolicy.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/TransferPolicy.yaml index 1ece8c4d41..bfd9af0a56 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/TransferPolicy.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/TransferPolicy.yaml @@ -24,7 +24,7 @@ imports: - ../metadata - ../slots/policy_name - ../slots/policy_text - - ../slots/has_or_had_description + - ../slots/has_or_had_structured_description - ../slots/specificity_annotation - ../slots/template_specificity - ./Description @@ -65,7 +65,7 @@ classes: slots: - policy_name - policy_text - - has_or_had_description + - has_or_had_structured_description - specificity_annotation - template_specificity @@ -80,7 +80,7 @@ classes: Full text of the policy. range: string required: false - has_or_had_description: + has_or_had_structured_description: description: | Summary description of the policy. range: Description diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/VideoSubtitle.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/VideoSubtitle.yaml index 99cd17d66a..dc32de741d 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/VideoSubtitle.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/VideoSubtitle.yaml @@ -16,7 +16,7 @@ imports: - ../slots/is_sdh - ../slots/raw_subtitle_content - ../slots/specificity_annotation - - ../slots/has_or_had_format # was: subtitle_format - migrated per Rule 53 (2026-01-15) + - ../slots/has_or_had_format - ../slots/template_specificity - ../slots/has_or_had_identifier # MIGRATED: was ../slots/track_id (2026-01-14) - ./TrackIdentifier # Added for has_or_had_identifier migration @@ -241,7 +241,7 @@ classes: - is_sdh - raw_subtitle_content - specificity_annotation - - has_or_had_format # was: subtitle_format - migrated per Rule 53 (2026-01-15) + - has_or_had_format - template_specificity - has_or_had_identifier # MIGRATED: was track_id (2026-01-14) - has_or_had_label # was: track_name @@ -250,10 +250,10 @@ classes: required: true includes_timestamp: ifabsent: 'true' - has_or_had_format: # was: subtitle_format - migrated per Rule 53 (2026-01-15) + has_or_had_format: description: | The subtitle format for this video subtitle track. - Migrated from subtitle_format to align with RiC-O naming conventions. + Values: SRT, VTT, TTML, SBV, ASS range: SubtitleFormatEnum required: true examples: diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/VideoTranscript.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/VideoTranscript.yaml index f639edbe56..9accb4624d 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/VideoTranscript.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/VideoTranscript.yaml @@ -16,9 +16,8 @@ imports: - ../slots/speaker_count - ../slots/specificity_annotation - ../slots/template_specificity - # REMOVED 2026-01-14: ../slots/transcript_format - migrated to has_or_had_format with TranscriptFormat + # REMOVED 2026-01-14: ../slots/transcript_format - migrated to has_or_had_transcript_format with TranscriptFormat - ../slots/has_or_had_format - - ./TranscriptFormat - ./SpecificityAnnotation - ./TemplateSpecificityScores - ../enums/TranscriptFormatEnum @@ -82,7 +81,7 @@ classes: - speaker_count - specificity_annotation - template_specificity - # REMOVED 2026-01-14: transcript_format - migrated to has_or_had_format with TranscriptFormat + # REMOVED 2026-01-14: transcript_format - migrated to has_or_had_format with TranscriptFormatEnum - has_or_had_format slot_usage: full_text: @@ -105,7 +104,7 @@ classes: ' description: Transcript with speaker labels - # REMOVED 2026-01-14: transcript_format - migrated to has_or_had_format with TranscriptFormat + # REMOVED 2026-01-14: transcript_format - migrated to has_or_had_format with TranscriptFormatEnum # transcript_format: # range: TranscriptFormatEnum # required: false @@ -114,7 +113,7 @@ classes: # - value: STRUCTURED # description: Text with speaker labels and paragraph breaks has_or_had_format: - range: TranscriptFormat + range: TranscriptFormatEnum required: false description: The format of the transcript (plain text, structured, timestamped, etc.) examples: diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Warehouse.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Warehouse.yaml index e4bc6ce99f..151b3689d8 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/Warehouse.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/Warehouse.yaml @@ -15,19 +15,18 @@ imports: - ../slots/specificity_annotation - ../slots/template_specificity # Migrated per slot_fixes.yaml (Rule 53) - 2026-01-14 - # warehouse_description → has_or_had_description + Description + # warehouse_description → has_or_had_structured_description + Description # warehouse_floor_area_sqm → has_or_had_area + Area # warehouse_id → has_or_had_identifier (uriorcurie range) # warehouse_managed_by → is_or_was_managed_by + Group # warehouse_name → has_or_had_label # warehouse_security_level → has_or_had_security_level + SecurityLevel - - ../slots/has_or_had_description + - ../slots/has_or_had_structured_description # was: warehouse_description - uses Description class - ../slots/has_or_had_area - ../slots/has_or_had_identifier - ../slots/is_or_was_managed_by - ../slots/has_or_had_label - ../slots/has_or_had_security_level - - ./Description - ./Area - ./Group - ./SecurityLevel @@ -92,7 +91,7 @@ classes: - specificity_annotation - template_specificity # Migrated per slot_fixes.yaml (Rule 53) - 2026-01-14 - - has_or_had_description # was: warehouse_description + - has_or_had_structured_description # was: warehouse_description (uses Description class) - has_or_had_area # was: warehouse_floor_area_sqm - has_or_had_identifier # was: warehouse_id - is_or_was_managed_by # was: warehouse_managed_by @@ -124,12 +123,10 @@ classes: description: Museum logistics facility - value: KB Operations Warehouse Leiden description: Library operations warehouse - has_or_had_description: # was: warehouse_description + has_or_had_structured_description: # was: warehouse_description (uses Description class) description: | Description of warehouse purpose and contents. MIGRATED from warehouse_description per slot_fixes.yaml (Rule 53). - range: Description - inlined: true examples: - value: description_text: Logistics warehouse for exhibition equipment, packing materials, and furniture. Facilities team access only. @@ -241,7 +238,7 @@ classes: - value: has_or_had_identifier: https://nde.nl/ontology/hc/aux/rm-logistics-warehouse # was: warehouse_id has_or_had_label: Rijksmuseum Logistics Warehouse # was: warehouse_name - has_or_had_description: # was: warehouse_description + has_or_had_structured_description: # was: warehouse_description description_text: Logistics warehouse for exhibition equipment and packing materials. Used by exhibition services team. description_type: warehouse has_or_had_type: EXHIBITION_EQUIPMENT @@ -265,7 +262,7 @@ classes: - value: has_or_had_identifier: https://nde.nl/ontology/hc/aux/na-supplies-warehouse # was: warehouse_id has_or_had_label: Nationaal Archief Supplies Warehouse # was: warehouse_name - has_or_had_description: # was: warehouse_description + has_or_had_structured_description: # was: warehouse_description description_text: General supplies warehouse for archival boxes, office furniture, and operational materials. description_type: warehouse has_or_had_type: GENERAL_SUPPLIES diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/WebPortal.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/WebPortal.yaml index 3d350eb5dc..bfa86ed4c5 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/WebPortal.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/WebPortal.yaml @@ -21,7 +21,7 @@ imports: - ../slots/metadata_standard - ../slots/sparql_endpoint - ../slots/oai_pmh_endpoint - - ../slots/identifier + - ../slots/external_identifier - ../slots/has_or_had_portal_data_source - ../slots/operated_by - ../slots/has_or_had_exposed_collection @@ -143,7 +143,7 @@ classes: - has_or_had_data_service_endpoint - has_or_had_exposed_collection - geographic_scope - - identifier + - external_identifier - implements_auxiliary_platform - implements_digital_platform - launch_date @@ -327,7 +327,7 @@ classes: description: 'Archieven.nl: 80+ archives' - value: 4000 description: 'Europeana: 4000+ institutions' - identifier: + external_identifier: range: uriorcurie multivalued: true inlined_as_list: true @@ -496,7 +496,7 @@ classes: portal_status: ACTIVE record_count: 50000000 participating_institutions: 4000 - identifier: + external_identifier: - http://www.wikidata.org/entity/Q209441 data_license_policy: - policy_id: https://nde.nl/ontology/hc/policy/europeana-data-exchange diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_entity_status.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_entity_status.yaml new file mode 100644 index 0000000000..dc1084b8ce --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_entity_status.yaml @@ -0,0 +1,64 @@ +# has_or_had_entity_status - Entity operational status slot +# +# Following RiC-O style naming convention (Rule 39): +# - has_or_had_* indicates temporal relationship +# +# Created to resolve OWL ambiguous type warning on legal_status slot. +# This slot is for LegalStatus objects (ACTIVE, DISSOLVED, etc.), +# distinct from legal_status slot which links to CustodianLegalStatus. + +id: https://nde.nl/ontology/hc/slot/has_or_had_entity_status +name: has_or_had_entity_status_slot +title: Has Or Had Entity Status Slot + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + gleif_base: https://www.gleif.org/ontology/Base/ + schema: http://schema.org/ + +imports: + - linkml:types + - ../classes/RegistrationInfo # Contains LegalStatus class + +default_prefix: hc + +slots: + has_or_had_entity_status: + slot_uri: hc:hasOrHadEntityStatus + range: LegalStatus + description: | + Current or past operational status of a legal entity. + + Links to LegalStatus with: + - status_code: ACTIVE, DISSOLVED, MERGED, SUSPENDED, etc. + - status_name: Human-readable status name + + **ONTOLOGY ALIGNMENT**: + + | Ontology | Property | Notes | + |----------|----------|-------| + | **GLEIF** | `gleif_base:hasEntityStatus` | Close - entity lifecycle status | + | **Schema.org** | `schema:status` | Related - general status | + + **DISTINCTION FROM legal_status SLOT**: + + | Slot | Range | Purpose | + |------|-------|---------| + | `legal_status` | `CustodianLegalStatus` | Links to legal entity object | + | `has_or_had_entity_status` | `LegalStatus` | Indicates operational status (ACTIVE/DISSOLVED) | + + required: true + close_mappings: + - gleif_base:hasEntityStatus + related_mappings: + - schema:status + examples: + - value: + status_code: ACTIVE + status_name: Active + description: Currently operating entity + - value: + status_code: DISSOLVED + status_name: Dissolved + description: Legally dissolved entity diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_format.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_format.yaml index 8a5526752d..2e5dc1a2f3 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_format.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_format.yaml @@ -2,7 +2,8 @@ # # Created per slot_fixes.yaml migration for: typical_response_formats, transcript_format # Creation date: 2026-01-14 -# Rule compliance: 39 (RiC-O naming), 50 (ontology mapping) +# Updated: 2026-01-16 - Broadened range to uriorcurie per Rule 54 +# Rule compliance: 39 (RiC-O naming), 50 (ontology mapping), 54 (broaden range) id: https://nde.nl/ontology/hc/slot/has_or_had_format name: has_or_had_format @@ -16,7 +17,6 @@ prefixes: default_prefix: hc - imports: - linkml:types @@ -32,19 +32,21 @@ slots: - File formats for documents (PDF, DOCX, TXT) - Media formats (JPEG, MP3, MP4) - Transcript formats (VTT, SRT, plain text) + - Subtitle formats (WebVTT, SRT, etc.) **ONTOLOGY ALIGNMENT**: - - **Primary** (`slot_uri`): `hc:hasOrHadFormat` - Heritage Custodian ObjectProperty - for class-valued format ranges - - **Close**: `dct:format` - Dublin Core format (DatatypeProperty) + - **Primary** (`slot_uri`): `hc:hasOrHadFormat` - Heritage Custodian property + - **Close**: `dct:format` - Dublin Core format - **Close**: `schema:encodingFormat` - Schema.org encoding format - **Note**: slot_uri changed from dct:format to hc:hasOrHadFormat (2026-01-16) - to allow class-valued ranges (SubtitleFormatEnum, TranscriptFormat). + **Range**: `uriorcurie` (Rule 54) + Broadened range to accept URI/CURIE references to format specifications. + This allows linking to IANA media types, format registries, or internal + format classes while resolving OWL ambiguous type warnings. - **Range**: `Any` (2026-01-16) - Allows string values and class instances. + Classes can narrow to specific format enums/classes via slot_usage. - range: string + range: uriorcurie multivalued: true close_mappings: @@ -52,13 +54,21 @@ slots: - schema:encodingFormat examples: - - value: "application/json" - description: JSON MIME type for API responses - - value: "text/vtt" - description: WebVTT subtitle/transcript format - - value: "image/jpeg" - description: JPEG image format + - value: "iana:application/json" + description: JSON MIME type for API responses (CURIE) + - value: "iana:text/vtt" + description: WebVTT subtitle/transcript format (CURIE) + - value: "hc:TranscriptFormat/STRUCTURED" + description: Structured transcript with speaker labels (internal CURIE) + - value: "https://www.iana.org/assignments/media-types/image/jpeg" + description: JPEG image format (full URI) annotations: custodian_types: '["*"]' custodian_types_rationale: "Format specifications applicable to all custodian types." + range_broadening_date: "2026-01-16" + range_broadening_rationale: | + Changed from range:string to range:uriorcurie per Rule 54. + This allows linking to IANA media types, format registries, or format classes + while resolving OWL ambiguous type warnings. Replaces need for bespoke slots + like has_or_had_transcript_format or has_or_had_subtitle_format. diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_hypernym.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_hypernym.yaml index 68a391f141..1745013b76 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_hypernym.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_hypernym.yaml @@ -50,9 +50,13 @@ slots: to allow consistent class-valued ranges when classes override. skos:broader moved to exact_mappings (it is already an ObjectProperty in SKOS). - **Range**: `Any` (2026-01-16) - Allows uriorcurie values and class instances. + **Range**: `uriorcurie` (2026-01-16) - Allows both URIs and CURIE references. - range: string + Note: Individual Type classes may override to their specific type in slot_usage, + but since they're all referring to URIs, this causes no OWL ambiguity when + the base range is uriorcurie (compatible with ObjectProperty). + + range: uriorcurie required: false multivalued: false diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_hyponym.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_hyponym.yaml index 4f3f5450e4..ce8ea71095 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_hyponym.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_hyponym.yaml @@ -53,9 +53,13 @@ slots: to allow consistent class-valued ranges when classes override. skos:narrower moved to exact_mappings (it is already an ObjectProperty in SKOS). - **Range**: `Any` (2026-01-16) - Allows uriorcurie values and class instances. + **Range**: `uriorcurie` (2026-01-16) - Allows both URIs and CURIE references. - range: string + Note: Individual Type classes may override to their specific type in slot_usage, + but since they're all referring to URIs, this causes no OWL ambiguity when + the base range is uriorcurie (compatible with ObjectProperty). + + range: uriorcurie required: false multivalued: true inlined_as_list: true diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_label.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_label.yaml index b59a66f572..7e324d8b29 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_label.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_label.yaml @@ -51,7 +51,7 @@ slots: **Range**: `Any` (2026-01-16) - Allows both string values and Label class instances. - range: string + range: uriorcurie required: false multivalued: true diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_observation_source_document.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_observation_source_document.yaml new file mode 100644 index 0000000000..2afbfc205a --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_observation_source_document.yaml @@ -0,0 +1,67 @@ +# has_or_had_observation_source_document - Source document for observation +# +# Following RiC-O style naming convention (Rule 39): +# - has_or_had_* indicates temporal relationship +# +# Created to resolve OWL ambiguous type warning on observation_source slot. +# This slot is for SourceDocument objects (structured source references), +# distinct from observation_source slot which uses string values. + +id: https://nde.nl/ontology/hc/slot/has_or_had_observation_source_document +name: has_or_had_observation_source_document_slot +title: Has Or Had Observation Source Document Slot + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + prov: http://www.w3.org/ns/prov# + dcterms: http://purl.org/dc/terms/ + +imports: + - linkml:types + - ../classes/SourceDocument + +default_prefix: hc + +slots: + has_or_had_observation_source_document: + slot_uri: hc:hasOrHadObservationSourceDocument + range: SourceDocument + description: | + Structured source document where this observation was found. + + Links to SourceDocument with: + - source_type: "Staff directory", "Annual report", etc. + - source_uri: URL if available + - observation_date: When source was consulted + + **PiCo Pattern**: PersonObservation MUST link to source (evidence-based) + **PROV-O**: `prov:hadPrimarySource` for provenance tracking + + **Source Types**: + - Staff directory (online or print) + - Organizational chart + - Annual report + - Institutional website + - Archival personnel records + - Publication credits + - Email signature + + **DISTINCTION FROM observation_source SLOT**: + + | Slot | Range | Purpose | + |------|-------|---------| + | `observation_source` | `string` | Simple text reference to source | + | `has_or_had_observation_source_document` | `SourceDocument` | Structured source with metadata | + + required: false + close_mappings: + - prov:hadPrimarySource + related_mappings: + - dcterms:source + examples: + - value: + source_type: Staff directory + source_uri: https://example.org/staff + observation_date: "2025-01-10" + description: Staff directory source with structured metadata diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_rationale.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_rationale.yaml index 0b8234cdfe..aedda75e61 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_rationale.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_rationale.yaml @@ -40,7 +40,7 @@ slots: **Note**: slot_uri changed from skos:note to hc:hasOrHadRationale (2026-01-16) to allow class-valued ranges when classes use Rationale class. - range: string + range: uriorcurie close_mappings: - skos:note diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_status.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_status.yaml index da4ab01aac..0f76e139e1 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_status.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_status.yaml @@ -23,7 +23,7 @@ default_prefix: hc slots: has_or_had_status: slot_uri: hc:hasOrHadStatus - range: string + range: uriorcurie description: | Current or past status of an entity. diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_structured_description.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_structured_description.yaml new file mode 100644 index 0000000000..f21f4cf90d --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_structured_description.yaml @@ -0,0 +1,62 @@ +# has_or_had_structured_description slot +# Slot for structured Description class instances +# +# Following RiC-O naming convention (Rule 39): "hasOrHad..." pattern +# for temporal relationships in heritage domain. +# +# Created to resolve OWL ambiguous type warning on has_or_had_description slot. +# This slot is for Description class (structured descriptions with language/type), +# distinct from has_or_had_description slot which uses string values. +# +# Generation date: 2026-01-16 +# Rule compliance: 38 (slot centralization + semantic URI), 39 (RiC-O naming), 42 (no prefix) + +id: https://nde.nl/ontology/hc/slot/has_or_had_structured_description +name: has_or_had_structured_description_slot +title: Has Or Had Structured Description Slot + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + dcterms: http://purl.org/dc/terms/ + skos: http://www.w3.org/2004/02/skos/core# + +default_prefix: hc + +imports: + - linkml:types + - ../classes/Description + +slots: + has_or_had_structured_description: + slot_uri: hc:hasOrHadStructuredDescription + range: Description + description: | + Structured description with language, type, and provenance metadata. + + **DISTINCTION FROM has_or_had_description SLOT**: + + | Slot | Range | Purpose | + |------|-------|---------| + | `has_or_had_description` | `string` | Simple text description | + | `has_or_had_structured_description` | `Description` | Typed description with metadata | + + **Temporal Semantics** (RiC-O Pattern): + The "hasOrHad" naming follows RiC-O convention indicating this relationship + may be historical - an entity's description may change over time. + + **Ontological Alignment**: + - **Primary** (`slot_uri`): `hc:hasOrHadStructuredDescription` - ObjectProperty + - **Close**: `dcterms:description` - Dublin Core (DatatypeProperty) + - **Close**: `skos:definition` - SKOS definition + required: false + inlined: true + close_mappings: + - dcterms:description + - skos:definition + examples: + - value: + description_text: "A historic reading room with original 19th century furnishings" + description_type: FACILITY + description_language: en + description: Structured facility description with language tag diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_type.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_type.yaml index 040f24ee94..7849c70444 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_type.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_type.yaml @@ -5,7 +5,8 @@ # for temporal relationships in heritage domain. # # Generation date: 2026-01-13 -# Rule compliance: 38 (slot centralization + semantic URI), 39 (RiC-O naming), 42 (no prefix) +# Updated: 2026-01-16 - Broadened range to uriorcurie per Rule 54 +# Rule compliance: 38, 39, 42, 53, 54 (broaden range, not bespoke predicates) id: https://nde.nl/ontology/hc/slot/has_or_had_type name: has_or_had_type_slot @@ -35,29 +36,25 @@ slots: may be historical - an entity may have been reclassified over time. **Ontological Alignment**: - - **Primary** (`slot_uri`): `hc:hasOrHadType` - Heritage Custodian ObjectProperty - allowing class-valued ranges for type hierarchies + - **Primary** (`slot_uri`): `hc:hasOrHadType` - Heritage Custodian property - **Exact**: `crm:P2_has_type` - CIDOC-CRM predicate for typing entities - (range: E55_Type, an ObjectProperty) - **Close**: `dcterms:type` - Dublin Core type predicate - **Related**: `schema:additionalType` - Schema.org for web semantics **Usage**: This is a GENERIC slot intended for reuse across multiple classes. - Classes should specialize the range in slot_usage to reference the - appropriate Type class hierarchy (e.g., StorageType, ZoneType, etc.). + Classes may narrow the range in slot_usage to reference specific Type class + hierarchies (e.g., StorageType, ZoneType, etc.). + + **Range**: `uriorcurie` (Rule 54) + Broadened range to accept URI/CURIE references to type concepts. + This resolves OWL "Ambiguous type" warnings while maintaining semantic richness. + Classes can still narrow to specific Type classes via slot_usage. **Cardinality**: Multivalued - entities may have multiple type classifications. - **Note**: slot_uri changed from crm:P2_has_type to hc:hasOrHadType (2026-01-16) - to resolve OWL ambiguous type warning when classes override range to class types. - crm:P2_has_type moved to exact_mappings (it is an ObjectProperty in CIDOC-CRM). - - **Range**: `Any` (2026-01-16) - Allows both string values and class instances. - Classes narrow this to specific Type class hierarchies via slot_usage. - - range: string + range: uriorcurie required: false multivalued: true inlined_as_list: true @@ -86,20 +83,27 @@ slots: zone_type, warehouse_type, unit_type, treatment_type, storage_type, statement_type, sub_guide_type, wikidata_mapping_type migration_date: "2026-01-13" + range_broadening_date: "2026-01-16" + range_broadening_rationale: | + Changed from range:string to range:uriorcurie per Rule 54. + This resolves OWL "Ambiguous type" warning while maintaining + semantic flexibility. Classes can narrow to specific Type classes + via slot_usage without causing DatatypeProperty/ObjectProperty ambiguity. predicate_clarification: | - slot_uri references a PREDICATE (crm:P2_has_type), not a class. - The range should be specialized per class to reference appropriate Type classes. + slot_uri references a PREDICATE (hc:hasOrHadType), not a class. comments: - "Generic type slot for reuse across multiple classes" - - "Specialize range in slot_usage for specific Type class hierarchies" - - "slot_uri=crm:P2_has_type is a PREDICATE, not a class" + - "Range: uriorcurie - accepts URI/CURIE references to type concepts" + - "slot_uri=hc:hasOrHadType is a PREDICATE, not a class" - "RiC-O naming: hasOrHad indicates potentially historical relationship" - "Multivalued: entities may have multiple type classifications" - - "Range: Any - resolves OWL ambiguous type warning (2026-01-16)" + - "Rule 54: Broadened range instead of creating bespoke predicates" examples: - - value: StorageType:ARCHIVE_DEPOT - description: "Storage typed as archive depot" - - value: ZoneType:CLIMATE_CONTROLLED - description: "Environmental zone type" + - value: "hc:StorageType/ARCHIVE_DEPOT" + description: "Storage typed as archive depot (CURIE reference)" + - value: "hc:ZoneType/CLIMATE_CONTROLLED" + description: "Environmental zone type (CURIE reference)" + - value: "https://example.org/vocab/historic-building" + description: "External vocabulary reference (full URI)" diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_url.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_url.yaml index e83b66b00f..942c780b61 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_url.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_url.yaml @@ -58,7 +58,7 @@ slots: **Range**: `Any` (2026-01-16) - Allows uri/string values and URL class instances. - range: URL + range: uriorcurie # Broadened per Rule 55 (2026-01-16) to resolve OWL ambiguous type warning required: false multivalued: true inlined: true diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_categorized_as.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_categorized_as.yaml index f0b667db37..6c9308c53a 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_categorized_as.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_categorized_as.yaml @@ -37,7 +37,7 @@ slots: **Range**: `Any` (2026-01-16) - Allows uriorcurie values and class instances. - range: uriorcurie + range: uriorcurie # Broadened per Rule 55 (2026-01-16) to resolve OWL ambiguous type warning multivalued: true exact_mappings: diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_derived_from.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_derived_from.yaml index 27cf0a579d..b0b2a9f6e8 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_derived_from.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_derived_from.yaml @@ -37,7 +37,7 @@ slots: to resolve OWL ambiguous type warning when classes override range to class types (e.g., CustodianObservation). - range: uriorcurie + range: uriorcurie # Broadened per Rule 55 (2026-01-16) to resolve OWL ambiguous type warning exact_mappings: - prov:wasDerivedFrom diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_equivalent_to.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_equivalent_to.yaml index 7ed75726ff..6f030797c6 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_equivalent_to.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_equivalent_to.yaml @@ -55,7 +55,7 @@ slots: **Cardinality**: Multivalued - an entity may have equivalences in multiple systems. - range: string + range: uriorcurie # Broadened per Rule 55 (2026-01-16) to resolve OWL ambiguous type warning required: false multivalued: true inlined_as_list: true diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_generated_by.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_generated_by.yaml index d3acf0a1d4..47631a5888 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_generated_by.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_generated_by.yaml @@ -37,7 +37,7 @@ slots: to resolve OWL ambiguous type warning when classes override range to class types (e.g., ReconstructionActivity). - range: uriorcurie + range: uriorcurie # Broadened per Rule 55 (2026-01-16) to resolve OWL ambiguous type warning exact_mappings: - prov:wasGeneratedBy diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_instance_of.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_instance_of.yaml index bc00ec6c2e..3b50f2206b 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_instance_of.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_instance_of.yaml @@ -60,7 +60,7 @@ slots: **Cardinality**: Multivalued - entities may have multiple classifications. - range: string + range: uriorcurie # Broadened per Rule 55 (2026-01-16) to resolve OWL ambiguous type warning required: false multivalued: true inlined_as_list: true diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_related_to.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_related_to.yaml index d146d70548..9b5cc6ca5e 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_related_to.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_related_to.yaml @@ -62,7 +62,7 @@ slots: **Cardinality**: Multivalued - an entity may have multiple associations. - range: string + range: uriorcurie # Broadened per Rule 55 (2026-01-16) to resolve OWL ambiguous type warning required: false multivalued: true inlined_as_list: true 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 c1b59bb2ef..52341575e2 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml @@ -5669,4 +5669,214 @@ fixes: using Description class with description_type: from_owner. Migrated for symmetry with to_owner_text which was migrated earlier in same session. Owner class not used (existing from_owner slot provides structured reference). Original slot - archived to archive/from_owner_text_archived_20260115.yaml.' \ No newline at end of file + archived to archive/from_owner_text_archived_20260115.yaml.' +- original_slot_id: https://nde.nl/ontology/hc/slot/about_text + revision: + - label: has_or_had_description + type: slot + - label: Description + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/address_type + revision: + - label: has_or_had_address + type: slot + - label: Address + type: class + - label: has_or_had_type + type: slot + - label: AddressType + type: class + - label: includes_or_included + type: slot + - label: AddressTypes + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/algorithm_name + revision: + - label: has_or_had_label + type: slot + - label: Label + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/algorithm_version + revision: + - label: has_or_had_version + type: slot + - label: Version + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/amount + revision: + - label: has_or_had_quantity + type: slot + - label: Quantity + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/applies_or_applied_to_call + revision: + - label: applies_or_applied_to + type: slot + - label: CallForApplication + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/approximation_level + revision: + - label: has_or_had_level + type: slot + - label: ApproximationLevel + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/archival_reference + revision: + - label: has_or_had_provenance + type: slot + - label: Provenance + type: class + - label: has_or_had_reference + type: slot + - label: Reference + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/area_value + revision: + - label: has_or_had_area + type: slot + - label: Area + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/arrangement_level + revision: + - label: has_or_had_level + type: slot + - label: ArrangementLevel + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/asserter_contact + revision: + - label: has_or_had_contact_person + type: slot + - label: ContactPerson + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/asserter_type + revision: + - label: has_or_had_type + type: slot + - label: AsserterType + type: class + - label: includes_or_included + type: slot + - label: AsserterTypes + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/asserter_version + revision: + - label: has_or_had_version + type: slot + - label: Version + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/assessment_date + revision: + - label: is_or_was_assessed + type: slot + - label: Assessment + type: class + - label: temporal_extent + type: slot + - label: TimeSpan + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/audience_size + revision: + - label: serves_or_served + type: slot + - label: UserCommunity + type: class + - label: has_or_had_quantity + type: slot + - label: AudienceSize + type: class + - label: has_or_had_unit + type: slot + - label: MeasurementUnit + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/audience_type + revision: + - label: serves_or_served + type: slot + - label: UserCommunity + type: class + - label: has_or_had_type + type: slot + - label: UserCommunityType + type: class + - label: includes_or_included + type: slot + - label: UserCommunityTypes + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/audio_quality_score + revision: + - label: has_or_had_audio + type: slot + - label: Audio + type: class + - label: has_or_had_score + type: slot + - label: QualityScore + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/audit_date + revision: + - label: is_or_was_audited + type: slot + - label: AuditEvent + type: class + - label: temporal_extent + type: slot + - label: TimeSpan + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/audit_opinion + revision: + - label: is_or_was_audited + type: slot + - label: AuditEvent + type: class + - label: concludes_or_concluded + type: slot + - label: AuditOpinion + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/audit_status + revision: + - label: is_or_was_audited + type: slot + - label: AuditEvent + type: class + - label: has_or_had_status + type: slot + - label: AuditStatus + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/auditor_name + revision: + - label: is_or_was_audited + type: slot + - label: AuditEvent + type: class + - label: is_or_was_conducted_by + type: slot + - label: Auditor + type: class + - label: has_or_had_name + type: slot + - label: Name + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/author_affiliation + revision: + - label: is_or_was_affiliated_with + type: slot + - label: Affiliation + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/author_identifier + revision: + - label: has_or_had_identifier + type: slot + - label: Identifier + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/author_name + revision: + - label: has_or_had_name + type: slot + - label: Name + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/author_role + revision: + - label: has_or_had_role + type: slot + - label: AuthorRole + type: class \ No newline at end of file diff --git a/frontend/public/schemas/20251121/linkml/scripts/gen-heritage-owl.sh b/frontend/public/schemas/20251121/linkml/scripts/gen-heritage-owl.sh new file mode 100755 index 0000000000..ef34f264f1 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/scripts/gen-heritage-owl.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# gen-heritage-owl.sh - Generate OWL ontology from Heritage Custodian LinkML schema +# +# Usage: +# ./scripts/gen-heritage-owl.sh [output-file] [additional-args...] +# +# Examples: +# ./scripts/gen-heritage-owl.sh # Output to stdout +# ./scripts/gen-heritage-owl.sh heritage_custodian.owl # Output to file +# ./scripts/gen-heritage-owl.sh -f ttl # Turtle format +# +# Why --type-objects is required: +# The Heritage Custodian schema uses generic slots (e.g., has_or_had_type, +# has_or_had_format) with `range: uriorcurie` that are narrowed by classes +# via slot_usage. While the range broadening to uriorcurie resolves most +# OWL ambiguity warnings, using --type-objects ensures consistent +# ObjectProperty treatment for all polymorphic slots. +# +# See also: +# - Rule 55: Broaden Generic Predicate Ranges (.opencode/rules/broaden-generic-predicate-ranges-rule.md) +# - Rule 53: Full Slot Migration (slot_fixes.yaml) +# +# Created: 2026-01-16 +# Updated: 2026-01-16 + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SCHEMA_DIR="$(dirname "$SCRIPT_DIR")" +SCHEMA_FILE="${SCHEMA_DIR}/01_custodian_name_modular.yaml" + +if [[ ! -f "$SCHEMA_FILE" ]]; then + echo "Error: Schema file not found: $SCHEMA_FILE" >&2 + exit 1 +fi + +# Run gen-owl with --type-objects flag +# This treats types as objects (ObjectProperty) rather than literals (DatatypeProperty) +# which matches our polymorphic slot design pattern +exec gen-owl --type-objects "$SCHEMA_FILE" "$@" diff --git a/frontend/src/pages/EntityReviewPage.css b/frontend/src/pages/EntityReviewPage.css index c982f9b30e..074977aa6b 100644 --- a/frontend/src/pages/EntityReviewPage.css +++ b/frontend/src/pages/EntityReviewPage.css @@ -381,6 +381,19 @@ color: #f59e0b; } +.stat-card.info .stat-value { + color: #3b82f6; +} + +.stat-card.info.active { + border-color: #3b82f6; + background: rgba(59, 130, 246, 0.1); +} + +.dark .stat-card.info.active { + background: rgba(59, 130, 246, 0.15); +} + .stat-card.progress { position: relative; } @@ -2121,3 +2134,118 @@ background: rgba(239, 68, 68, 0.15); color: #f87171; } + +/* WCMS-Only Profiles Styles */ +.wcms-only-search { + position: relative; + padding: 0.75rem; + border-bottom: 1px solid var(--border-color, #e0e0e0); +} + +.wcms-only-search .search-input { + width: 100%; + padding: 0.5rem 2rem 0.5rem 0.75rem; + border: 1px solid var(--border-color, #e0e0e0); + border-radius: 6px; + font-size: 0.875rem; + background: var(--bg-primary, #fff); + color: var(--text-primary, #1a1a1a); +} + +.wcms-only-search .search-input:focus { + outline: none; + border-color: #3b82f6; + box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); +} + +.wcms-only-search .clear-search { + position: absolute; + right: 1rem; + top: 50%; + transform: translateY(-50%); + background: none; + border: none; + color: var(--text-secondary, #666); + cursor: pointer; + padding: 0.25rem; + display: flex; + align-items: center; + justify-content: center; +} + +.wcms-only-search .clear-search:hover { + color: var(--text-primary, #1a1a1a); +} + +.wcms-only-list .profile-item { + display: flex; + flex-direction: column; + gap: 0.5rem; + padding: 0.75rem 1rem; +} + +.profile-item-actions { + display: flex; + gap: 0.5rem; + margin-top: 0.25rem; +} + +.linkedin-search-btn { + display: inline-flex; + align-items: center; + gap: 0.35rem; + padding: 0.35rem 0.75rem; + background: linear-gradient(135deg, #0077b5 0%, #005885 100%); + color: white; + border: none; + border-radius: 4px; + font-size: 0.75rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; +} + +.linkedin-search-btn:hover { + background: linear-gradient(135deg, #005885 0%, #004266 100%); + transform: translateY(-1px); + box-shadow: 0 2px 8px rgba(0, 119, 181, 0.3); +} + +.status-badge { + font-size: 0.65rem; + padding: 0.15rem 0.4rem; + border-radius: 3px; + font-weight: 500; + text-transform: uppercase; +} + +.status-badge.active { + background: rgba(34, 197, 94, 0.15); + color: #16a34a; +} + +.status-badge.blocked { + background: rgba(239, 68, 68, 0.15); + color: #dc2626; +} + +.dark .status-badge.active { + background: rgba(34, 197, 94, 0.2); + color: #4ade80; +} + +.dark .status-badge.blocked { + background: rgba(239, 68, 68, 0.2); + color: #f87171; +} + +.date-badge { + font-size: 0.7rem; + color: var(--text-secondary, #666); +} + +.pagination-info { + font-size: 0.8rem; + color: var(--text-secondary, #666); + padding: 0 0.5rem; +} diff --git a/frontend/src/pages/EntityReviewPage.tsx b/frontend/src/pages/EntityReviewPage.tsx index 839c99c084..a11badb7bd 100644 --- a/frontend/src/pages/EntityReviewPage.tsx +++ b/frontend/src/pages/EntityReviewPage.tsx @@ -585,6 +585,38 @@ export default function EntityReviewPage() { } }, [fetchProfiles, fetchStats, fetchSignalTypes, isAuthenticated]); + // Fetch WCMS-only profiles when that filter is selected + useEffect(() => { + if (!isAuthenticated || statsFilter !== 'wcms_only') return; + + const fetchWcmsOnlyProfiles = async () => { + setWcmsOnlyLoading(true); + try { + const params = new URLSearchParams({ + page: wcmsOnlyPage.toString(), + page_size: '50', + }); + if (wcmsOnlySearch.trim()) { + params.append('search', wcmsOnlySearch.trim()); + } + + const response = await fetch(`${API_BASE}/api/review/wcms-only?${params}`); + if (!response.ok) throw new Error('Failed to fetch WCMS-only profiles'); + const data = await response.json(); + setWcmsOnlyProfiles(data.profiles || []); + setWcmsOnlyTotal(data.total || 0); + } catch (err) { + console.error('Failed to fetch WCMS-only profiles:', err); + setWcmsOnlyProfiles([]); + setWcmsOnlyTotal(0); + } finally { + setWcmsOnlyLoading(false); + } + }; + + fetchWcmsOnlyProfiles(); + }, [isAuthenticated, statsFilter, wcmsOnlyPage, wcmsOnlySearch]); + // Keyboard shortcuts useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { @@ -814,6 +846,15 @@ export default function EntityReviewPage() { In afwachting + +
{ setStatsFilter('wcms_only'); setWcmsOnlyPage(1); }} + > + {(stats.wcms_only_count || 0).toLocaleString()} + Zoek LinkedIn +
+
{stats.likely_wrong_person !== undefined && stats.likely_wrong_person > 0 && (
@@ -1165,6 +1206,147 @@ export default function EntityReviewPage() { {language === 'nl' ? 'Geen resultaten gevonden' : 'No results found'}
+ ) : statsFilter === 'wcms_only' ? ( + /* WCMS-Only Profiles View */ + <> + {/* Search Input for WCMS-only */} +
+ { + setWcmsOnlySearch(e.target.value); + setWcmsOnlyPage(1); + }} + className="search-input" + /> + {wcmsOnlySearch && ( + + )} +
+ + {/* Results count */} + {!wcmsOnlyLoading && wcmsOnlyTotal > 0 && ( +
+ {wcmsOnlyTotal.toLocaleString()} {language === 'nl' ? 'profielen zonder LinkedIn' : 'profiles without LinkedIn'} +
+ )} + + {wcmsOnlyLoading ? ( +
+ + {language === 'nl' ? 'Laden...' : 'Loading...'} +
+ ) : wcmsOnlyProfiles.length === 0 ? ( +
+ + {language === 'nl' ? 'Geen profielen gevonden' : 'No profiles found'} +
+ ) : ( + <> + + + {/* Pagination for WCMS-only */} +
+ + + + {wcmsOnlyPage} / {Math.ceil(wcmsOnlyTotal / 50)} + + + +
+ + )} + ) : loading ? (
diff --git a/schemas/20251121/linkml/manifest.json b/schemas/20251121/linkml/manifest.json index 112c353aea..e71a7279ad 100644 --- a/schemas/20251121/linkml/manifest.json +++ b/schemas/20251121/linkml/manifest.json @@ -1,5 +1,5 @@ { - "generated": "2026-01-16T14:04:19.745Z", + "generated": "2026-01-16T14:06:37.301Z", "schemaRoot": "/schemas/20251121/linkml", "totalFiles": 3010, "categoryCounts": { diff --git a/schemas/20251121/linkml/modules/classes/TypeClass.yaml b/schemas/20251121/linkml/modules/classes/TypeClass.yaml deleted file mode 100644 index cf67f13d3c..0000000000 --- a/schemas/20251121/linkml/modules/classes/TypeClass.yaml +++ /dev/null @@ -1,61 +0,0 @@ -# TypeClass - Abstract base class for all type classification classes -# -# This class serves as the common ancestor for all *Type classes in the heritage ontology. -# It enables the `any_of` pattern in generic slots like `has_or_had_type` to accept -# both string values and class instances, resolving OWL "Ambiguous type" warnings. -# -# Rule compliance: -# - Rule 53: Enables generic slots via any_of pattern -# - Rule 39: Supports RiC-O temporal naming convention -# - Rule 0b: Part of Type/Types naming convention -# -# Generation date: 2026-01-16 -# Purpose: Resolve 18 OWL ambiguous type warnings from gen-owl - -id: https://nde.nl/ontology/hc/class/TypeClass -name: type_class -title: Type Class (Abstract Base) - -prefixes: - linkml: https://w3id.org/linkml/ - hc: https://nde.nl/ontology/hc/ - skos: http://www.w3.org/2004/02/skos/core# - -default_prefix: hc - -imports: - - linkml:types - -classes: - TypeClass: - class_uri: skos:Concept - abstract: true - description: | - Abstract base class for all type classification classes in the heritage ontology. - - **Purpose**: - Enables the `any_of` pattern in generic slots (e.g., `has_or_had_type`) to accept - both string literals and class instances. This resolves OWL "Ambiguous type" - warnings that occur when slots have `range: string` but classes override to - class types via `slot_usage`. - - **Inheritance**: - All concrete Type classes (AddressType, BackupType, ConditionType, etc.) - should inherit from this class using `is_a: TypeClass`. - - **Ontological Alignment**: - - class_uri: `skos:Concept` - Type classes represent controlled vocabulary concepts - - **See Also**: - - Rule 0b: LinkML Type/Types File Naming Convention - - Rule 53: No bespoke slots - generic/reusable patterns - - annotations: - specificity_score: 0.10 - specificity_rationale: | - Very low specificity - this is a foundational abstract class used as the - base for all type classification classes across the entire ontology. - owl_fix_date: "2026-01-16" - owl_fix_purpose: | - Created to resolve 18 "Ambiguous type" warnings from gen-owl. - Serves as range in any_of patterns for generic slots. diff --git a/schemas/20251121/linkml/modules/classes/VideoSubtitle.yaml b/schemas/20251121/linkml/modules/classes/VideoSubtitle.yaml index 6563f39663..dc32de741d 100644 --- a/schemas/20251121/linkml/modules/classes/VideoSubtitle.yaml +++ b/schemas/20251121/linkml/modules/classes/VideoSubtitle.yaml @@ -16,7 +16,7 @@ imports: - ../slots/is_sdh - ../slots/raw_subtitle_content - ../slots/specificity_annotation - - ../slots/has_or_had_subtitle_format # was: has_or_had_format - specialized for SubtitleFormatEnum (2026-01-16) + - ../slots/has_or_had_format - ../slots/template_specificity - ../slots/has_or_had_identifier # MIGRATED: was ../slots/track_id (2026-01-14) - ./TrackIdentifier # Added for has_or_had_identifier migration @@ -241,7 +241,7 @@ classes: - is_sdh - raw_subtitle_content - specificity_annotation - - has_or_had_subtitle_format # was: has_or_had_format - specialized for SubtitleFormatEnum (2026-01-16) + - has_or_had_format - template_specificity - has_or_had_identifier # MIGRATED: was track_id (2026-01-14) - has_or_had_label # was: track_name @@ -250,11 +250,11 @@ classes: required: true includes_timestamp: ifabsent: 'true' - has_or_had_subtitle_format: # was: has_or_had_format - specialized for SubtitleFormatEnum (2026-01-16) + has_or_had_format: description: | The subtitle format for this video subtitle track. - Migrated from subtitle_format to align with RiC-O naming conventions. - # range: SubtitleFormatEnum - defined in slot, no override needed + Values: SRT, VTT, TTML, SBV, ASS + range: SubtitleFormatEnum required: true examples: - value: VTT diff --git a/schemas/20251121/linkml/modules/classes/VideoTranscript.yaml b/schemas/20251121/linkml/modules/classes/VideoTranscript.yaml index 6d6bf557ef..9accb4624d 100644 --- a/schemas/20251121/linkml/modules/classes/VideoTranscript.yaml +++ b/schemas/20251121/linkml/modules/classes/VideoTranscript.yaml @@ -17,7 +17,7 @@ imports: - ../slots/specificity_annotation - ../slots/template_specificity # REMOVED 2026-01-14: ../slots/transcript_format - migrated to has_or_had_transcript_format with TranscriptFormat - - ../slots/has_or_had_transcript_format + - ../slots/has_or_had_format - ./SpecificityAnnotation - ./TemplateSpecificityScores - ../enums/TranscriptFormatEnum @@ -81,8 +81,8 @@ classes: - speaker_count - specificity_annotation - template_specificity - # REMOVED 2026-01-14: transcript_format - migrated to has_or_had_transcript_format with TranscriptFormat - - has_or_had_transcript_format + # REMOVED 2026-01-14: transcript_format - migrated to has_or_had_format with TranscriptFormatEnum + - has_or_had_format slot_usage: full_text: range: string @@ -104,7 +104,7 @@ classes: ' description: Transcript with speaker labels - # REMOVED 2026-01-14: transcript_format - migrated to has_or_had_transcript_format with TranscriptFormat + # REMOVED 2026-01-14: transcript_format - migrated to has_or_had_format with TranscriptFormatEnum # transcript_format: # range: TranscriptFormatEnum # required: false @@ -112,8 +112,8 @@ classes: # examples: # - value: STRUCTURED # description: Text with speaker labels and paragraph breaks - has_or_had_transcript_format: - # range: TranscriptFormat - defined in slot, no override needed + has_or_had_format: + range: TranscriptFormatEnum required: false description: The format of the transcript (plain text, structured, timestamped, etc.) examples: diff --git a/schemas/20251121/linkml/modules/slots/has_or_had_format.yaml b/schemas/20251121/linkml/modules/slots/has_or_had_format.yaml index 8a5526752d..2e5dc1a2f3 100644 --- a/schemas/20251121/linkml/modules/slots/has_or_had_format.yaml +++ b/schemas/20251121/linkml/modules/slots/has_or_had_format.yaml @@ -2,7 +2,8 @@ # # Created per slot_fixes.yaml migration for: typical_response_formats, transcript_format # Creation date: 2026-01-14 -# Rule compliance: 39 (RiC-O naming), 50 (ontology mapping) +# Updated: 2026-01-16 - Broadened range to uriorcurie per Rule 54 +# Rule compliance: 39 (RiC-O naming), 50 (ontology mapping), 54 (broaden range) id: https://nde.nl/ontology/hc/slot/has_or_had_format name: has_or_had_format @@ -16,7 +17,6 @@ prefixes: default_prefix: hc - imports: - linkml:types @@ -32,19 +32,21 @@ slots: - File formats for documents (PDF, DOCX, TXT) - Media formats (JPEG, MP3, MP4) - Transcript formats (VTT, SRT, plain text) + - Subtitle formats (WebVTT, SRT, etc.) **ONTOLOGY ALIGNMENT**: - - **Primary** (`slot_uri`): `hc:hasOrHadFormat` - Heritage Custodian ObjectProperty - for class-valued format ranges - - **Close**: `dct:format` - Dublin Core format (DatatypeProperty) + - **Primary** (`slot_uri`): `hc:hasOrHadFormat` - Heritage Custodian property + - **Close**: `dct:format` - Dublin Core format - **Close**: `schema:encodingFormat` - Schema.org encoding format - **Note**: slot_uri changed from dct:format to hc:hasOrHadFormat (2026-01-16) - to allow class-valued ranges (SubtitleFormatEnum, TranscriptFormat). + **Range**: `uriorcurie` (Rule 54) + Broadened range to accept URI/CURIE references to format specifications. + This allows linking to IANA media types, format registries, or internal + format classes while resolving OWL ambiguous type warnings. - **Range**: `Any` (2026-01-16) - Allows string values and class instances. + Classes can narrow to specific format enums/classes via slot_usage. - range: string + range: uriorcurie multivalued: true close_mappings: @@ -52,13 +54,21 @@ slots: - schema:encodingFormat examples: - - value: "application/json" - description: JSON MIME type for API responses - - value: "text/vtt" - description: WebVTT subtitle/transcript format - - value: "image/jpeg" - description: JPEG image format + - value: "iana:application/json" + description: JSON MIME type for API responses (CURIE) + - value: "iana:text/vtt" + description: WebVTT subtitle/transcript format (CURIE) + - value: "hc:TranscriptFormat/STRUCTURED" + description: Structured transcript with speaker labels (internal CURIE) + - value: "https://www.iana.org/assignments/media-types/image/jpeg" + description: JPEG image format (full URI) annotations: custodian_types: '["*"]' custodian_types_rationale: "Format specifications applicable to all custodian types." + range_broadening_date: "2026-01-16" + range_broadening_rationale: | + Changed from range:string to range:uriorcurie per Rule 54. + This allows linking to IANA media types, format registries, or format classes + while resolving OWL ambiguous type warnings. Replaces need for bespoke slots + like has_or_had_transcript_format or has_or_had_subtitle_format. diff --git a/schemas/20251121/linkml/modules/slots/has_or_had_label.yaml b/schemas/20251121/linkml/modules/slots/has_or_had_label.yaml index b59a66f572..7e324d8b29 100644 --- a/schemas/20251121/linkml/modules/slots/has_or_had_label.yaml +++ b/schemas/20251121/linkml/modules/slots/has_or_had_label.yaml @@ -51,7 +51,7 @@ slots: **Range**: `Any` (2026-01-16) - Allows both string values and Label class instances. - range: string + range: uriorcurie required: false multivalued: true diff --git a/schemas/20251121/linkml/modules/slots/has_or_had_rationale.yaml b/schemas/20251121/linkml/modules/slots/has_or_had_rationale.yaml index 0b8234cdfe..aedda75e61 100644 --- a/schemas/20251121/linkml/modules/slots/has_or_had_rationale.yaml +++ b/schemas/20251121/linkml/modules/slots/has_or_had_rationale.yaml @@ -40,7 +40,7 @@ slots: **Note**: slot_uri changed from skos:note to hc:hasOrHadRationale (2026-01-16) to allow class-valued ranges when classes use Rationale class. - range: string + range: uriorcurie close_mappings: - skos:note diff --git a/schemas/20251121/linkml/modules/slots/has_or_had_status.yaml b/schemas/20251121/linkml/modules/slots/has_or_had_status.yaml index da4ab01aac..0f76e139e1 100644 --- a/schemas/20251121/linkml/modules/slots/has_or_had_status.yaml +++ b/schemas/20251121/linkml/modules/slots/has_or_had_status.yaml @@ -23,7 +23,7 @@ default_prefix: hc slots: has_or_had_status: slot_uri: hc:hasOrHadStatus - range: string + range: uriorcurie description: | Current or past status of an entity. diff --git a/schemas/20251121/linkml/modules/slots/has_or_had_subtitle_format.yaml b/schemas/20251121/linkml/modules/slots/has_or_had_subtitle_format.yaml deleted file mode 100644 index 1d67a4fb52..0000000000 --- a/schemas/20251121/linkml/modules/slots/has_or_had_subtitle_format.yaml +++ /dev/null @@ -1,64 +0,0 @@ -# has_or_had_subtitle_format - Subtitle format specification slot -# -# Created to fix gen-owl "Ambiguous type for: has_or_had_format" warning. -# The base has_or_had_format slot has range: string, but VideoSubtitle needs -# range: SubtitleFormatEnum. This specialized slot provides the enum-typed range. -# -# Creation date: 2026-01-16 -# Rule compliance: 39 (RiC-O naming), 50 (ontology mapping) - -id: https://nde.nl/ontology/hc/slot/has_or_had_subtitle_format -name: has_or_had_subtitle_format -title: Has or Had Subtitle Format - -prefixes: - linkml: https://w3id.org/linkml/ - hc: https://nde.nl/ontology/hc/ - schema: http://schema.org/ - -default_prefix: hc - -imports: - - linkml:types - - ../enums/SubtitleFormatEnum - -slots: - has_or_had_subtitle_format: - slot_uri: hc:hasOrHadSubtitleFormat - description: | - The subtitle format for video subtitle tracks. - - **USAGE**: - Specifies the technical format of a subtitle file (SRT, VTT, TTML, etc.). - This slot is used exclusively by VideoSubtitle and related classes. - - **SUBTITLE FORMATS**: - | Format | Extension | Features | Use Case | - |--------|-----------|----------|----------| - | SRT | .srt | Simple, universal | Most video players | - | VTT | .vtt | W3C standard, styling | HTML5 video, web | - | TTML | .ttml/.dfxp | XML, rich styling | Broadcast, streaming | - | SBV | .sbv | YouTube native | YouTube uploads | - | ASS | .ass | Advanced styling | Anime, complex layouts | - - **ONTOLOGY ALIGNMENT**: - - **Primary** (`slot_uri`): `hc:hasOrHadSubtitleFormat` - Heritage Custodian property - - **Related**: `schema:encodingFormat` - General encoding format - - range: SubtitleFormatEnum - required: false - - close_mappings: - - schema:encodingFormat - - examples: - - value: VTT - description: WebVTT format (W3C standard for HTML5 video) - - value: SRT - description: SubRip format (most widely supported) - - value: TTML - description: Timed Text Markup Language (broadcast standard) - - annotations: - custodian_types: '["*"]' - custodian_types_rationale: "Subtitle formats applicable to all custodian types with video content." diff --git a/schemas/20251121/linkml/modules/slots/has_or_had_transcript_format.yaml b/schemas/20251121/linkml/modules/slots/has_or_had_transcript_format.yaml deleted file mode 100644 index bcc3bccd73..0000000000 --- a/schemas/20251121/linkml/modules/slots/has_or_had_transcript_format.yaml +++ /dev/null @@ -1,64 +0,0 @@ -# has_or_had_transcript_format - Transcript format specification slot -# -# Created to fix gen-owl "Ambiguous type for: has_or_had_format" warning. -# The base has_or_had_format slot has range: string, but VideoTranscript needs -# range: TranscriptFormat. This specialized slot provides the class-typed range. -# -# Creation date: 2026-01-16 -# Rule compliance: 39 (RiC-O naming), 50 (ontology mapping) - -id: https://nde.nl/ontology/hc/slot/has_or_had_transcript_format -name: has_or_had_transcript_format -title: Has or Had Transcript Format - -prefixes: - linkml: https://w3id.org/linkml/ - hc: https://nde.nl/ontology/hc/ - schema: http://schema.org/ - -default_prefix: hc - -imports: - - linkml:types - - ../classes/TranscriptFormat - -slots: - has_or_had_transcript_format: - slot_uri: hc:hasOrHadTranscriptFormat - description: | - The format of a transcript (plain text, structured, timestamped, etc.). - - **USAGE**: - Specifies the structural format of a transcript. This slot is used - exclusively by VideoTranscript and related classes. - - **TRANSCRIPT FORMATS**: - | Format | Description | Use Case | - |--------|-------------|----------| - | PLAIN_TEXT | Continuous text, no structure | Simple search indexing | - | PARAGRAPHED | Text broken into paragraphs | Human reading | - | STRUCTURED | Segments with speaker labels | Research, analysis | - | TIMESTAMPED | Segments with time markers | Navigation, subtitling | - - **ONTOLOGY ALIGNMENT**: - - **Primary** (`slot_uri`): `hc:hasOrHadTranscriptFormat` - Heritage Custodian property - - **Related**: `schema:encodingFormat` - General encoding format - - range: TranscriptFormat - required: false - inlined: true - - close_mappings: - - schema:encodingFormat - - examples: - - value: STRUCTURED - description: Text with speaker labels and paragraph breaks - - value: TIMESTAMPED - description: Segments with time codes for navigation - - value: PLAIN_TEXT - description: Continuous text without structure - - annotations: - custodian_types: '["*"]' - custodian_types_rationale: "Transcript formats applicable to all custodian types with video content." diff --git a/schemas/20251121/linkml/modules/slots/has_or_had_type.yaml b/schemas/20251121/linkml/modules/slots/has_or_had_type.yaml index 47390e3b4c..7849c70444 100644 --- a/schemas/20251121/linkml/modules/slots/has_or_had_type.yaml +++ b/schemas/20251121/linkml/modules/slots/has_or_had_type.yaml @@ -5,8 +5,8 @@ # for temporal relationships in heritage domain. # # Generation date: 2026-01-13 -# Updated: 2026-01-16 - Added any_of pattern to resolve OWL ambiguous type warning -# Rule compliance: 38 (slot centralization + semantic URI), 39 (RiC-O naming), 42 (no prefix), 53 (generic slots) +# Updated: 2026-01-16 - Broadened range to uriorcurie per Rule 54 +# Rule compliance: 38, 39, 42, 53, 54 (broaden range, not bespoke predicates) id: https://nde.nl/ontology/hc/slot/has_or_had_type name: has_or_had_type_slot @@ -24,7 +24,6 @@ default_prefix: hc imports: - linkml:types - - ../classes/TypeClass slots: has_or_had_type: @@ -37,28 +36,25 @@ slots: may be historical - an entity may have been reclassified over time. **Ontological Alignment**: - - **Primary** (`slot_uri`): `hc:hasOrHadType` - Heritage Custodian ObjectProperty - allowing class-valued ranges for type hierarchies + - **Primary** (`slot_uri`): `hc:hasOrHadType` - Heritage Custodian property - **Exact**: `crm:P2_has_type` - CIDOC-CRM predicate for typing entities - (range: E55_Type, an ObjectProperty) - **Close**: `dcterms:type` - Dublin Core type predicate - **Related**: `schema:additionalType` - Schema.org for web semantics **Usage**: This is a GENERIC slot intended for reuse across multiple classes. - Classes may specialize the range in slot_usage to reference the - appropriate Type class hierarchy (e.g., StorageType, ZoneType, etc.). + Classes may narrow the range in slot_usage to reference specific Type class + hierarchies (e.g., StorageType, ZoneType, etc.). - **Range** (any_of pattern): - Accepts both string literals and TypeClass instances. This resolves the - OWL "Ambiguous type" warning by explicitly declaring both valid ranges. + **Range**: `uriorcurie` (Rule 54) + Broadened range to accept URI/CURIE references to type concepts. + This resolves OWL "Ambiguous type" warnings while maintaining semantic richness. + Classes can still narrow to specific Type classes via slot_usage. **Cardinality**: Multivalued - entities may have multiple type classifications. - any_of: - - range: string - - range: TypeClass + range: uriorcurie required: false multivalued: true inlined_as_list: true @@ -87,27 +83,27 @@ slots: zone_type, warehouse_type, unit_type, treatment_type, storage_type, statement_type, sub_guide_type, wikidata_mapping_type migration_date: "2026-01-13" - any_of_fix_date: "2026-01-16" - any_of_fix_purpose: | - Added any_of pattern with TypeClass to resolve OWL "Ambiguous type" warning. - gen-owl was reporting ambiguity because slot had range:string but classes - overrode to class types via slot_usage. + range_broadening_date: "2026-01-16" + range_broadening_rationale: | + Changed from range:string to range:uriorcurie per Rule 54. + This resolves OWL "Ambiguous type" warning while maintaining + semantic flexibility. Classes can narrow to specific Type classes + via slot_usage without causing DatatypeProperty/ObjectProperty ambiguity. predicate_clarification: | slot_uri references a PREDICATE (hc:hasOrHadType), not a class. - The range is polymorphic via any_of, accepting both strings and TypeClass instances. comments: - "Generic type slot for reuse across multiple classes" - - "any_of pattern: accepts both string and TypeClass values" + - "Range: uriorcurie - accepts URI/CURIE references to type concepts" - "slot_uri=hc:hasOrHadType is a PREDICATE, not a class" - "RiC-O naming: hasOrHad indicates potentially historical relationship" - "Multivalued: entities may have multiple type classifications" - - "OWL fix: any_of pattern resolves Ambiguous type warning (2026-01-16)" + - "Rule 54: Broadened range instead of creating bespoke predicates" examples: - - value: StorageType:ARCHIVE_DEPOT - description: "Storage typed as archive depot (class instance)" - - value: ZoneType:CLIMATE_CONTROLLED - description: "Environmental zone type (class instance)" - - value: "historic building" - description: "Free-text type description (string literal)" + - value: "hc:StorageType/ARCHIVE_DEPOT" + description: "Storage typed as archive depot (CURIE reference)" + - value: "hc:ZoneType/CLIMATE_CONTROLLED" + description: "Environmental zone type (CURIE reference)" + - value: "https://example.org/vocab/historic-building" + description: "External vocabulary reference (full URI)" diff --git a/schemas/20251121/linkml/modules/slots/has_or_had_url.yaml b/schemas/20251121/linkml/modules/slots/has_or_had_url.yaml index e83b66b00f..942c780b61 100644 --- a/schemas/20251121/linkml/modules/slots/has_or_had_url.yaml +++ b/schemas/20251121/linkml/modules/slots/has_or_had_url.yaml @@ -58,7 +58,7 @@ slots: **Range**: `Any` (2026-01-16) - Allows uri/string values and URL class instances. - range: URL + range: uriorcurie # Broadened per Rule 55 (2026-01-16) to resolve OWL ambiguous type warning required: false multivalued: true inlined: true diff --git a/schemas/20251121/linkml/modules/slots/is_or_was_categorized_as.yaml b/schemas/20251121/linkml/modules/slots/is_or_was_categorized_as.yaml index f0b667db37..6c9308c53a 100644 --- a/schemas/20251121/linkml/modules/slots/is_or_was_categorized_as.yaml +++ b/schemas/20251121/linkml/modules/slots/is_or_was_categorized_as.yaml @@ -37,7 +37,7 @@ slots: **Range**: `Any` (2026-01-16) - Allows uriorcurie values and class instances. - range: uriorcurie + range: uriorcurie # Broadened per Rule 55 (2026-01-16) to resolve OWL ambiguous type warning multivalued: true exact_mappings: diff --git a/schemas/20251121/linkml/modules/slots/is_or_was_derived_from.yaml b/schemas/20251121/linkml/modules/slots/is_or_was_derived_from.yaml index 27cf0a579d..b0b2a9f6e8 100644 --- a/schemas/20251121/linkml/modules/slots/is_or_was_derived_from.yaml +++ b/schemas/20251121/linkml/modules/slots/is_or_was_derived_from.yaml @@ -37,7 +37,7 @@ slots: to resolve OWL ambiguous type warning when classes override range to class types (e.g., CustodianObservation). - range: uriorcurie + range: uriorcurie # Broadened per Rule 55 (2026-01-16) to resolve OWL ambiguous type warning exact_mappings: - prov:wasDerivedFrom diff --git a/schemas/20251121/linkml/modules/slots/is_or_was_equivalent_to.yaml b/schemas/20251121/linkml/modules/slots/is_or_was_equivalent_to.yaml index 7ed75726ff..6f030797c6 100644 --- a/schemas/20251121/linkml/modules/slots/is_or_was_equivalent_to.yaml +++ b/schemas/20251121/linkml/modules/slots/is_or_was_equivalent_to.yaml @@ -55,7 +55,7 @@ slots: **Cardinality**: Multivalued - an entity may have equivalences in multiple systems. - range: string + range: uriorcurie # Broadened per Rule 55 (2026-01-16) to resolve OWL ambiguous type warning required: false multivalued: true inlined_as_list: true diff --git a/schemas/20251121/linkml/modules/slots/is_or_was_generated_by.yaml b/schemas/20251121/linkml/modules/slots/is_or_was_generated_by.yaml index d3acf0a1d4..47631a5888 100644 --- a/schemas/20251121/linkml/modules/slots/is_or_was_generated_by.yaml +++ b/schemas/20251121/linkml/modules/slots/is_or_was_generated_by.yaml @@ -37,7 +37,7 @@ slots: to resolve OWL ambiguous type warning when classes override range to class types (e.g., ReconstructionActivity). - range: uriorcurie + range: uriorcurie # Broadened per Rule 55 (2026-01-16) to resolve OWL ambiguous type warning exact_mappings: - prov:wasGeneratedBy diff --git a/schemas/20251121/linkml/modules/slots/is_or_was_instance_of.yaml b/schemas/20251121/linkml/modules/slots/is_or_was_instance_of.yaml index bc00ec6c2e..3b50f2206b 100644 --- a/schemas/20251121/linkml/modules/slots/is_or_was_instance_of.yaml +++ b/schemas/20251121/linkml/modules/slots/is_or_was_instance_of.yaml @@ -60,7 +60,7 @@ slots: **Cardinality**: Multivalued - entities may have multiple classifications. - range: string + range: uriorcurie # Broadened per Rule 55 (2026-01-16) to resolve OWL ambiguous type warning required: false multivalued: true inlined_as_list: true diff --git a/schemas/20251121/linkml/modules/slots/is_or_was_related_to.yaml b/schemas/20251121/linkml/modules/slots/is_or_was_related_to.yaml index d146d70548..9b5cc6ca5e 100644 --- a/schemas/20251121/linkml/modules/slots/is_or_was_related_to.yaml +++ b/schemas/20251121/linkml/modules/slots/is_or_was_related_to.yaml @@ -62,7 +62,7 @@ slots: **Cardinality**: Multivalued - an entity may have multiple associations. - range: string + range: uriorcurie # Broadened per Rule 55 (2026-01-16) to resolve OWL ambiguous type warning required: false multivalued: true inlined_as_list: true diff --git a/schemas/20251121/linkml/modules/slots/slot_fixes.yaml b/schemas/20251121/linkml/modules/slots/slot_fixes.yaml index c1b59bb2ef..52341575e2 100644 --- a/schemas/20251121/linkml/modules/slots/slot_fixes.yaml +++ b/schemas/20251121/linkml/modules/slots/slot_fixes.yaml @@ -5669,4 +5669,214 @@ fixes: using Description class with description_type: from_owner. Migrated for symmetry with to_owner_text which was migrated earlier in same session. Owner class not used (existing from_owner slot provides structured reference). Original slot - archived to archive/from_owner_text_archived_20260115.yaml.' \ No newline at end of file + archived to archive/from_owner_text_archived_20260115.yaml.' +- original_slot_id: https://nde.nl/ontology/hc/slot/about_text + revision: + - label: has_or_had_description + type: slot + - label: Description + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/address_type + revision: + - label: has_or_had_address + type: slot + - label: Address + type: class + - label: has_or_had_type + type: slot + - label: AddressType + type: class + - label: includes_or_included + type: slot + - label: AddressTypes + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/algorithm_name + revision: + - label: has_or_had_label + type: slot + - label: Label + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/algorithm_version + revision: + - label: has_or_had_version + type: slot + - label: Version + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/amount + revision: + - label: has_or_had_quantity + type: slot + - label: Quantity + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/applies_or_applied_to_call + revision: + - label: applies_or_applied_to + type: slot + - label: CallForApplication + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/approximation_level + revision: + - label: has_or_had_level + type: slot + - label: ApproximationLevel + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/archival_reference + revision: + - label: has_or_had_provenance + type: slot + - label: Provenance + type: class + - label: has_or_had_reference + type: slot + - label: Reference + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/area_value + revision: + - label: has_or_had_area + type: slot + - label: Area + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/arrangement_level + revision: + - label: has_or_had_level + type: slot + - label: ArrangementLevel + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/asserter_contact + revision: + - label: has_or_had_contact_person + type: slot + - label: ContactPerson + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/asserter_type + revision: + - label: has_or_had_type + type: slot + - label: AsserterType + type: class + - label: includes_or_included + type: slot + - label: AsserterTypes + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/asserter_version + revision: + - label: has_or_had_version + type: slot + - label: Version + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/assessment_date + revision: + - label: is_or_was_assessed + type: slot + - label: Assessment + type: class + - label: temporal_extent + type: slot + - label: TimeSpan + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/audience_size + revision: + - label: serves_or_served + type: slot + - label: UserCommunity + type: class + - label: has_or_had_quantity + type: slot + - label: AudienceSize + type: class + - label: has_or_had_unit + type: slot + - label: MeasurementUnit + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/audience_type + revision: + - label: serves_or_served + type: slot + - label: UserCommunity + type: class + - label: has_or_had_type + type: slot + - label: UserCommunityType + type: class + - label: includes_or_included + type: slot + - label: UserCommunityTypes + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/audio_quality_score + revision: + - label: has_or_had_audio + type: slot + - label: Audio + type: class + - label: has_or_had_score + type: slot + - label: QualityScore + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/audit_date + revision: + - label: is_or_was_audited + type: slot + - label: AuditEvent + type: class + - label: temporal_extent + type: slot + - label: TimeSpan + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/audit_opinion + revision: + - label: is_or_was_audited + type: slot + - label: AuditEvent + type: class + - label: concludes_or_concluded + type: slot + - label: AuditOpinion + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/audit_status + revision: + - label: is_or_was_audited + type: slot + - label: AuditEvent + type: class + - label: has_or_had_status + type: slot + - label: AuditStatus + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/auditor_name + revision: + - label: is_or_was_audited + type: slot + - label: AuditEvent + type: class + - label: is_or_was_conducted_by + type: slot + - label: Auditor + type: class + - label: has_or_had_name + type: slot + - label: Name + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/author_affiliation + revision: + - label: is_or_was_affiliated_with + type: slot + - label: Affiliation + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/author_identifier + revision: + - label: has_or_had_identifier + type: slot + - label: Identifier + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/author_name + revision: + - label: has_or_had_name + type: slot + - label: Name + type: class +- original_slot_id: https://nde.nl/ontology/hc/slot/author_role + revision: + - label: has_or_had_role + type: slot + - label: AuthorRole + type: class \ No newline at end of file diff --git a/schemas/20251121/linkml/scripts/gen-heritage-owl.sh b/schemas/20251121/linkml/scripts/gen-heritage-owl.sh new file mode 100755 index 0000000000..ef34f264f1 --- /dev/null +++ b/schemas/20251121/linkml/scripts/gen-heritage-owl.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# gen-heritage-owl.sh - Generate OWL ontology from Heritage Custodian LinkML schema +# +# Usage: +# ./scripts/gen-heritage-owl.sh [output-file] [additional-args...] +# +# Examples: +# ./scripts/gen-heritage-owl.sh # Output to stdout +# ./scripts/gen-heritage-owl.sh heritage_custodian.owl # Output to file +# ./scripts/gen-heritage-owl.sh -f ttl # Turtle format +# +# Why --type-objects is required: +# The Heritage Custodian schema uses generic slots (e.g., has_or_had_type, +# has_or_had_format) with `range: uriorcurie` that are narrowed by classes +# via slot_usage. While the range broadening to uriorcurie resolves most +# OWL ambiguity warnings, using --type-objects ensures consistent +# ObjectProperty treatment for all polymorphic slots. +# +# See also: +# - Rule 55: Broaden Generic Predicate Ranges (.opencode/rules/broaden-generic-predicate-ranges-rule.md) +# - Rule 53: Full Slot Migration (slot_fixes.yaml) +# +# Created: 2026-01-16 +# Updated: 2026-01-16 + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SCHEMA_DIR="$(dirname "$SCRIPT_DIR")" +SCHEMA_FILE="${SCHEMA_DIR}/01_custodian_name_modular.yaml" + +if [[ ! -f "$SCHEMA_FILE" ]]; then + echo "Error: Schema file not found: $SCHEMA_FILE" >&2 + exit 1 +fi + +# Run gen-owl with --type-objects flag +# This treats types as objects (ObjectProperty) rather than literals (DatatypeProperty) +# which matches our polymorphic slot design pattern +exec gen-owl --type-objects "$SCHEMA_FILE" "$@"