@@ -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'}
+
+ ) : (
+ <>
+
+ {wcmsOnlyProfiles.map((profile, idx) => (
+ -
+
+
+ {profile.name || profile.username || 'Unknown'}
+ {profile.status && (
+
+ {profile.status}
+
+ )}
+
+
+ {profile.email && (
+
+
+ {profile.email}
+
+ )}
+ {profile.abs_id && (
+
+ ID: {profile.abs_id}
+
+ )}
+ {profile.registered_since && (
+
+ {profile.registered_since}
+
+ )}
+
+
+
+
+
+ ))}
+
+
+ {/* 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" "$@"