Migrate multiple slots to enhance semantic clarity and align with best practices

- Migrated catering_type to CateringType with subclasses for better classification.
- Updated certainty_level to has_or_had_level for improved metadata consistency.
- Addressed cessation_observed_in by confirming existing temporal data structure.
- Created NetAsset class and updated financial statements for richer financial modeling.
- Completed migrations for default_access_policy, default_audio_language, and default_language to structured classes.
- Migrated default_position to structured Alignment class for better representation.
- Updated defined_by_standard to broaden range for identifier standards.
- Migrated definition to structured Resolution class for video resolution modeling.
- Completed migrations for degree_name, deliverable, and departement_code to structured classes.
- Migrated deployment_date to structured DeploymentEvent with temporal extent.
- Migrated derived_from_entity and derived_from_observation to new reference structures.
- Completed description and description_text migrations to enhance content modeling.
- Migrated detection_count, detection_level, and detection_threshold to structured slots with classes.
- Migrated device-related slots to structured classes for better identification and classification.
- Added new slots and classes for historic building and web address modeling.
This commit is contained in:
kempersc 2026-01-25 12:47:38 +01:00
parent 511fc99847
commit 776462de90
188 changed files with 9617 additions and 1215 deletions

View file

@ -1,12 +1,12 @@
{
"generated": "2026-01-24T12:26:12.079Z",
"generated": "2026-01-25T11:26:41.239Z",
"schemaRoot": "/schemas/20251121/linkml",
"totalFiles": 3044,
"totalFiles": 3045,
"categoryCounts": {
"main": 4,
"class": 1004,
"class": 1026,
"enum": 154,
"slot": 1878,
"slot": 1857,
"module": 4
},
"categories": [
@ -135,6 +135,11 @@
"path": "modules/classes/Agent.yaml",
"category": "class"
},
{
"name": "Alignment",
"path": "modules/classes/Alignment.yaml",
"category": "class"
},
{
"name": "AllocationAgency",
"path": "modules/classes/AllocationAgency.yaml",
@ -670,6 +675,16 @@
"path": "modules/classes/CateringPlace.yaml",
"category": "class"
},
{
"name": "CateringType",
"path": "modules/classes/CateringType.yaml",
"category": "class"
},
{
"name": "CateringTypes",
"path": "modules/classes/CateringTypes.yaml",
"category": "class"
},
{
"name": "CathedralArchive",
"path": "modules/classes/CathedralArchive.yaml",
@ -1395,6 +1410,11 @@
"path": "modules/classes/DeceasedStatus.yaml",
"category": "class"
},
{
"name": "Deliverable",
"path": "modules/classes/Deliverable.yaml",
"category": "class"
},
{
"name": "Department",
"path": "modules/classes/Department.yaml",
@ -1415,6 +1435,11 @@
"path": "modules/classes/DepartmentalArchivesRecordSetTypes.yaml",
"category": "class"
},
{
"name": "DeploymentEvent",
"path": "modules/classes/DeploymentEvent.yaml",
"category": "class"
},
{
"name": "DepositArchive",
"path": "modules/classes/DepositArchive.yaml",
@ -1440,6 +1465,31 @@
"path": "modules/classes/DetectedEntity.yaml",
"category": "class"
},
{
"name": "DetectionLevelType",
"path": "modules/classes/DetectionLevelType.yaml",
"category": "class"
},
{
"name": "DetectionLevelTypes",
"path": "modules/classes/DetectionLevelTypes.yaml",
"category": "class"
},
{
"name": "DetectionThreshold",
"path": "modules/classes/DetectionThreshold.yaml",
"category": "class"
},
{
"name": "DeviceType",
"path": "modules/classes/DeviceType.yaml",
"category": "class"
},
{
"name": "DeviceTypes",
"path": "modules/classes/DeviceTypes.yaml",
"category": "class"
},
{
"name": "DigitalArchive",
"path": "modules/classes/DigitalArchive.yaml",
@ -1700,6 +1750,11 @@
"path": "modules/classes/Entity.yaml",
"category": "class"
},
{
"name": "EntityReconstruction",
"path": "modules/classes/EntityReconstruction.yaml",
"category": "class"
},
{
"name": "EnvironmentalZone",
"path": "modules/classes/EnvironmentalZone.yaml",
@ -2250,6 +2305,11 @@
"path": "modules/classes/InvestmentArea.yaml",
"category": "class"
},
{
"name": "IoTDevice",
"path": "modules/classes/IoTDevice.yaml",
"category": "class"
},
{
"name": "IsilCodeEntry",
"path": "modules/classes/IsilCodeEntry.yaml",
@ -2295,6 +2355,16 @@
"path": "modules/classes/Label.yaml",
"category": "class"
},
{
"name": "LabelType",
"path": "modules/classes/LabelType.yaml",
"category": "class"
},
{
"name": "LabelTypes",
"path": "modules/classes/LabelTypes.yaml",
"category": "class"
},
{
"name": "Landsarkiv",
"path": "modules/classes/Landsarkiv.yaml",
@ -2520,6 +2590,16 @@
"path": "modules/classes/MainPart.yaml",
"category": "class"
},
{
"name": "Manager",
"path": "modules/classes/Manager.yaml",
"category": "class"
},
{
"name": "Manufacturer",
"path": "modules/classes/Manufacturer.yaml",
"category": "class"
},
{
"name": "MappingType",
"path": "modules/classes/MappingType.yaml",
@ -2660,6 +2740,11 @@
"path": "modules/classes/MixedCustodianType.yaml",
"category": "class"
},
{
"name": "Model",
"path": "modules/classes/Model.yaml",
"category": "class"
},
{
"name": "MonasteryArchive",
"path": "modules/classes/MonasteryArchive.yaml",
@ -2895,6 +2980,11 @@
"path": "modules/classes/OAIPMHEndpoint.yaml",
"category": "class"
},
{
"name": "Observation",
"path": "modules/classes/Observation.yaml",
"category": "class"
},
{
"name": "OfficialInstitutionType",
"path": "modules/classes/OfficialInstitutionType.yaml",
@ -3280,6 +3370,16 @@
"path": "modules/classes/PressArchiveRecordSetTypes.yaml",
"category": "class"
},
{
"name": "Price",
"path": "modules/classes/Price.yaml",
"category": "class"
},
{
"name": "PriceRange",
"path": "modules/classes/PriceRange.yaml",
"category": "class"
},
{
"name": "PrimaryDigitalPresenceAssertion",
"path": "modules/classes/PrimaryDigitalPresenceAssertion.yaml",
@ -3640,6 +3740,11 @@
"path": "modules/classes/ResearchSourceData.yaml",
"category": "class"
},
{
"name": "Resolution",
"path": "modules/classes/Resolution.yaml",
"category": "class"
},
{
"name": "ResourceType",
"path": "modules/classes/ResourceType.yaml",
@ -4075,6 +4180,11 @@
"path": "modules/classes/StateRegionalArchiveCzechiaRecordSetTypes.yaml",
"category": "class"
},
{
"name": "Status",
"path": "modules/classes/Status.yaml",
"category": "class"
},
{
"name": "Storage",
"path": "modules/classes/Storage.yaml",
@ -5902,26 +6012,11 @@
"path": "modules/slots/begin_of_the_end.yaml",
"category": "slot"
},
{
"name": "catering_price_range",
"path": "modules/slots/catering_price_range.yaml",
"category": "slot"
},
{
"name": "catering_type",
"path": "modules/slots/catering_type.yaml",
"category": "slot"
},
{
"name": "cessation_observed_in",
"path": "modules/slots/cessation_observed_in.yaml",
"category": "slot"
},
{
"name": "change_in_net_asset",
"path": "modules/slots/change_in_net_asset.yaml",
"category": "slot"
},
{
"name": "change_rationale",
"path": "modules/slots/change_rationale.yaml",
@ -6582,106 +6677,11 @@
"path": "modules/slots/date.yaml",
"category": "slot"
},
{
"name": "deduction_percentage",
"path": "modules/slots/deduction_percentage.yaml",
"category": "slot"
},
{
"name": "default_access_policy",
"path": "modules/slots/default_access_policy.yaml",
"category": "slot"
},
{
"name": "default_audio_language",
"path": "modules/slots/default_audio_language.yaml",
"category": "slot"
},
{
"name": "default_language",
"path": "modules/slots/default_language.yaml",
"category": "slot"
},
{
"name": "default_position",
"path": "modules/slots/default_position.yaml",
"category": "slot"
},
{
"name": "defined_by_standard",
"path": "modules/slots/defined_by_standard.yaml",
"category": "slot"
},
{
"name": "definition",
"path": "modules/slots/definition.yaml",
"category": "slot"
},
{
"name": "degree_name",
"path": "modules/slots/degree_name.yaml",
"category": "slot"
},
{
"name": "degree_of_certainty",
"path": "modules/slots/degree_of_certainty.yaml",
"category": "slot"
},
{
"name": "deliverable",
"path": "modules/slots/deliverable.yaml",
"category": "slot"
},
{
"name": "departement_code",
"path": "modules/slots/departement_code.yaml",
"category": "slot"
},
{
"name": "departement_name",
"path": "modules/slots/departement_name.yaml",
"category": "slot"
},
{
"name": "department_code",
"path": "modules/slots/department_code.yaml",
"category": "slot"
},
{
"name": "department_description",
"path": "modules/slots/department_description.yaml",
"category": "slot"
},
{
"name": "department_head",
"path": "modules/slots/department_head.yaml",
"category": "slot"
},
{
"name": "department_id",
"path": "modules/slots/department_id.yaml",
"category": "slot"
},
{
"name": "department_name",
"path": "modules/slots/department_name.yaml",
"category": "slot"
},
{
"name": "deployment_date",
"path": "modules/slots/deployment_date.yaml",
"category": "slot"
},
{
"name": "derived_from_entity",
"path": "modules/slots/derived_from_entity.yaml",
"category": "slot"
},
{
"name": "derived_from_observation",
"path": "modules/slots/derived_from_observation.yaml",
"category": "slot"
},
{
"name": "derives_or_derived_from",
"path": "modules/slots/derives_or_derived_from.yaml",
@ -6692,66 +6692,16 @@
"path": "modules/slots/describes_or_described.yaml",
"category": "slot"
},
{
"name": "description",
"path": "modules/slots/description.yaml",
"category": "slot"
},
{
"name": "description_text",
"path": "modules/slots/description_text.yaml",
"category": "slot"
},
{
"name": "description_type",
"path": "modules/slots/description_type.yaml",
"category": "slot"
},
{
"name": "detection_count",
"path": "modules/slots/detection_count.yaml",
"category": "slot"
},
{
"name": "detection_level",
"path": "modules/slots/detection_level.yaml",
"category": "slot"
},
{
"name": "detection_threshold",
"path": "modules/slots/detection_threshold.yaml",
"category": "slot"
},
{
"name": "device_count",
"path": "modules/slots/device_count.yaml",
"category": "slot"
},
{
"name": "device_id",
"path": "modules/slots/device_id.yaml",
"category": "slot"
},
{
"name": "device_manufacturer",
"path": "modules/slots/device_manufacturer.yaml",
"category": "slot"
},
{
"name": "device_model",
"path": "modules/slots/device_model.yaml",
"category": "slot"
},
{
"name": "device_name",
"path": "modules/slots/device_name.yaml",
"category": "slot"
},
{
"name": "device_type",
"path": "modules/slots/device_type.yaml",
"category": "slot"
},
{
"name": "diarization_confidence",
"path": "modules/slots/diarization_confidence.yaml",
@ -7712,6 +7662,11 @@
"path": "modules/slots/filing_type.yaml",
"category": "slot"
},
{
"name": "filters_or_filtered",
"path": "modules/slots/filters_or_filtered.yaml",
"category": "slot"
},
{
"name": "final_of_the_final",
"path": "modules/slots/final_of_the_final.yaml",
@ -8862,6 +8817,11 @@
"path": "modules/slots/has_or_had_agent.yaml",
"category": "slot"
},
{
"name": "has_or_had_alignment",
"path": "modules/slots/has_or_had_alignment.yaml",
"category": "slot"
},
{
"name": "has_or_had_alternative_name",
"path": "modules/slots/has_or_had_alternative_name.yaml",
@ -9692,6 +9652,11 @@
"path": "modules/slots/has_or_had_previous_owner.yaml",
"category": "slot"
},
{
"name": "has_or_had_price",
"path": "modules/slots/has_or_had_price.yaml",
"category": "slot"
},
{
"name": "has_or_had_primary_presence_assertion",
"path": "modules/slots/has_or_had_primary_presence_assertion.yaml",
@ -9822,6 +9787,11 @@
"path": "modules/slots/has_or_had_research_attempt.yaml",
"category": "slot"
},
{
"name": "has_or_had_resolution",
"path": "modules/slots/has_or_had_resolution.yaml",
"category": "slot"
},
{
"name": "has_or_had_responsibility",
"path": "modules/slots/has_or_had_responsibility.yaml",
@ -10102,6 +10072,11 @@
"path": "modules/slots/has_or_had_treatment.yaml",
"category": "slot"
},
{
"name": "has_or_had_treshold",
"path": "modules/slots/has_or_had_treshold.yaml",
"category": "slot"
},
{
"name": "has_or_had_type",
"path": "modules/slots/has_or_had_type.yaml",
@ -10967,6 +10942,11 @@
"path": "modules/slots/is_or_was_collection_of.yaml",
"category": "slot"
},
{
"name": "is_or_was_created_by",
"path": "modules/slots/is_or_was_created_by.yaml",
"category": "slot"
},
{
"name": "is_or_was_created_through",
"path": "modules/slots/is_or_was_created_through.yaml",
@ -10977,6 +10957,11 @@
"path": "modules/slots/is_or_was_decommissioned_at.yaml",
"category": "slot"
},
{
"name": "is_or_was_deployed_at",
"path": "modules/slots/is_or_was_deployed_at.yaml",
"category": "slot"
},
{
"name": "is_or_was_derived_from",
"path": "modules/slots/is_or_was_derived_from.yaml",
@ -11027,6 +11012,11 @@
"path": "modules/slots/is_or_was_instance_of.yaml",
"category": "slot"
},
{
"name": "is_or_was_instantiated_by",
"path": "modules/slots/is_or_was_instantiated_by.yaml",
"category": "slot"
},
{
"name": "is_or_was_involved_in",
"path": "modules/slots/is_or_was_involved_in.yaml",
@ -12517,6 +12507,11 @@
"path": "modules/slots/offers_donation_scheme.yaml",
"category": "slot"
},
{
"name": "offers_or_offered",
"path": "modules/slots/offers_or_offered.yaml",
"category": "slot"
},
{
"name": "offers_or_offered_access",
"path": "modules/slots/offers_or_offered_access.yaml",
@ -13787,6 +13782,11 @@
"path": "modules/slots/recurrence_pattern.yaml",
"category": "slot"
},
{
"name": "refers_or_referred_to",
"path": "modules/slots/refers_or_referred_to.yaml",
"category": "slot"
},
{
"name": "refers_to_access_policy",
"path": "modules/slots/refers_to_access_policy.yaml",
@ -14932,6 +14932,11 @@
"path": "modules/slots/specificity_timestamp.yaml",
"category": "slot"
},
{
"name": "specifies_or_specified",
"path": "modules/slots/specifies_or_specified.yaml",
"category": "slot"
},
{
"name": "specimen_count",
"path": "modules/slots/specimen_count.yaml",

View file

@ -0,0 +1,93 @@
id: https://nde.nl/ontology/hc/class/Alignment
name: alignment_class
title: Alignment Class
description: |
Represents positioning or alignment information for content elements.
**USE CASES**:
- Caption/subtitle positioning (top, bottom, left, right)
- Text alignment within containers
- Visual element placement in layouts
**PROPERTIES**:
- horizontal_alignment: left, center, right, justify
- vertical_alignment: top, middle, bottom
- position_value: Numeric or named position value
**RELATIONSHIP TO Caption**:
Alignment can be used with Caption to specify where subtitles appear
on screen (e.g., bottom-center is typical default).
imports:
- linkml:types
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
default_prefix: hc
classes:
Alignment:
class_uri: hc:Alignment
description: |
Positioning or alignment information for content elements.
Captures horizontal alignment, vertical alignment, and position values.
slots:
- horizontal_alignment
- vertical_alignment
- position_value
- position_unit
slot_usage:
horizontal_alignment:
range: string
required: false
examples:
- value: "left"
description: Left-aligned content
- value: "center"
description: Center-aligned content
- value: "right"
description: Right-aligned content
vertical_alignment:
range: string
required: false
examples:
- value: "top"
description: Top-aligned (e.g., top subtitles)
- value: "bottom"
description: Bottom-aligned (default for subtitles)
- value: "middle"
description: Vertically centered
position_value:
range: string
required: false
description: Numeric or named position value
examples:
- value: "10"
description: Position 10 units from reference
- value: "default"
description: Default positioning
position_unit:
range: string
required: false
description: Unit of measurement for position (px, %, em, etc.)
examples:
- value: "px"
description: Pixels
- value: "%"
description: Percentage of container
slots:
horizontal_alignment:
slot_uri: hc:horizontalAlignment
range: string
description: Horizontal alignment (left, center, right, justify)
vertical_alignment:
slot_uri: hc:verticalAlignment
range: string
description: Vertical alignment (top, middle, bottom)
position_value:
slot_uri: hc:positionValue
range: string
description: Numeric or named position value
position_unit:
slot_uri: hc:positionUnit
range: string
description: Unit of measurement for position

View file

@ -15,7 +15,9 @@ imports:
- ./Label
- ./Description
# Domain-specific slots (kept)
- ../slots/catering_type
# - ../slots/catering_type # ARCHIVED 2026-01-24: migrated to has_or_had_type + CateringType per Rule 53/56
- ./CateringType
- ./CateringTypes
- ../slots/heritage_type_classification
- ../slots/cuisine_type
- ../slots/seating_capacity
@ -27,7 +29,10 @@ imports:
- ../slots/reservation_required
- ../slots/has_michelin_star
- ../slots/michelin_star
- ../slots/catering_price_range
# - ../slots/catering_price_range # ARCHIVED 2026-01-24: migrated to has_or_had_price + Price per Rule 53/56
- ../slots/has_or_had_price
- ./Price
- ./PriceRange
- ../slots/has_or_had_accessibility_feature
- ../slots/operator
# MIGRATED 2026-01-22: founded_year → is_or_was_founded_through + FoundingEvent (Rule 53)
@ -91,8 +96,8 @@ classes:
- has_or_had_description # was: has_or_had_description - migrated per Rule 55 (2026-01-16) # 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
- catering_type
- has_or_had_price # was: catering_price_range - migrated per Rule 53/56 (2026-01-24)
- has_or_had_type # was: catering_type - migrated per Rule 53/56 (2026-01-24)
- cuisine_type
- is_or_was_founded_through # was: founded_year - migrated per Rule 53 (2026-01-22)
- has_michelin_star
@ -142,13 +147,19 @@ classes:
- value:
description_text: Michelin-starred restaurant serving modern Dutch cuisine using seasonal ingredients. Located in the museum's atrium with views of the garden.
description: Fine dining restaurant
catering_type:
range: CateringTypeEnum
has_or_had_type: # was: catering_type - migrated per Rule 53/56 (2026-01-24)
description: |
MIGRATED from catering_type per Rule 53/56 (2026-01-24).
Type classification of catering facility.
range: CateringType
required: true
inlined: true
examples:
- value: RESTAURANT
- value:
has_or_had_name: Restaurant
description: Full-service restaurant
- value: CAFE
- value:
has_or_had_name: Café
description: Café
heritage_type_classification:
range: TasteScentHeritageTypeEnum
@ -216,15 +227,29 @@ classes:
examples:
- value: 1
description: One Michelin star
catering_price_range:
range: string
has_or_had_price: # was: catering_price_range - migrated per Rule 53/56 (2026-01-24)
description: |
MIGRATED from catering_price_range per Rule 53/56 (2026-01-24).
Price range or pricing information for the catering place.
range: Price
inlined: true
examples:
- value: €€€€
description: Fine dining price
- value: €€
description: Moderate
- value:
description: Budget-friendly
- value:
has_or_had_value: "€€€€"
has_or_had_type:
has_or_had_name: Luxury
has_or_had_description: Over €60 per person
description: Fine dining price range
- value:
has_or_had_value: "€€"
has_or_had_type:
has_or_had_name: Moderate
description: Moderate price range
- value:
has_or_had_value: "€"
has_or_had_type:
has_or_had_name: Budget
description: Budget-friendly price range
has_or_had_accessibility_feature:
range: string
multivalued: true
@ -278,7 +303,8 @@ classes:
label_text: RIJKS Restaurant
has_or_had_description:
description_text: Michelin-starred restaurant serving modern Dutch cuisine. Located in museum atrium with garden views.
catering_type: RESTAURANT
has_or_had_type: # was: catering_type
has_or_had_name: Restaurant
cuisine_type: Modern Dutch fine dining
seating_capacity: 80
has_outdoor_seating: true
@ -288,7 +314,10 @@ classes:
reservation_required: true
has_michelin_star: true
michelin_star: 1
catering_price_range: €€€€
has_or_had_price: # was: catering_price_range
has_or_had_value: "€€€€"
has_or_had_type:
has_or_had_name: Luxury
operator: Vermaat Groep
description: Michelin-starred museum restaurant
- value:
@ -297,13 +326,17 @@ classes:
label_text: Nationaal Archief Café
has_or_had_description:
description_text: Casual café for archive visitors. Light lunches, coffee, and pastries.
catering_type: CAFE
has_or_had_type: # was: catering_type
has_or_had_name: Café
cuisine_type: Café fare, sandwiches, soups
seating_capacity: 40
opening_hour: Tu-Fr 09:30-16:30
serves_visitors_only: true
reservation_required: false
catering_price_range:
has_or_had_price: # was: catering_price_range
has_or_had_value: "€"
has_or_had_type:
has_or_had_name: Budget
has_or_had_accessibility_feature:
- Wheelchair accessible
description: Archive visitor café
@ -313,7 +346,8 @@ classes:
label_text: Café Americain
has_or_had_description:
description_text: Historic art deco café dating from 1902. Literary landmark and protected monument.
catering_type: HISTORIC_CAFE
has_or_had_type: # was: catering_type
has_or_had_name: Historic Café
heritage_type_classification: HISTORIC_RESTAURANT
cuisine_type: International brasserie
seating_capacity: 150
@ -325,5 +359,8 @@ classes:
begin_of_the_begin: "1902-01-01"
end_of_the_begin: "1902-12-31"
founding_description: "Historic art deco café established in 1902"
catering_price_range: €€€
has_or_had_price: # was: catering_price_range
has_or_had_value: "€€€"
has_or_had_type:
has_or_had_name: Upscale
description: Historic heritage café

View file

@ -0,0 +1,50 @@
id: https://nde.nl/ontology/hc/class/CateringType
name: CateringType
title: Catering Type (Abstract Base)
description: |
Abstract base class for types of catering facilities at heritage venues.
This class defines the taxonomy of catering establishment types found at
museums, archives, libraries, and other heritage institutions.
Concrete subclasses are defined in CateringTypes.yaml following the
Type/Types naming convention (Rule 0b).
Created per slot_fixes.yaml revision for catering_type migration (Rule 53/56).
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
skos: http://www.w3.org/2004/02/skos/core#
schema: http://schema.org/
imports:
- linkml:types
- ../slots/has_or_had_name
- ../slots/has_or_had_description
default_prefix: hc
classes:
CateringType:
class_uri: skos:Concept
abstract: true
description: |
Abstract base class for types of catering facilities.
Catering type categories:
- Café/Coffee Shop
- Restaurant
- Tea Room
- Canteen/Cafeteria
- Terrace/Garden Café
- Historic Café
- Event Catering
slots:
- has_or_had_name
- has_or_had_description
slot_usage:
has_or_had_name:
description: The name of this catering type category.
required: true
has_or_had_description:
description: Description of this catering type and typical characteristics.
exact_mappings:
- skos:Concept
close_mappings:
- schema:FoodEstablishment

View file

@ -0,0 +1,123 @@
id: https://nde.nl/ontology/hc/class/CateringTypes
name: CateringTypes
title: Catering Types (Concrete Subclasses)
description: |
Concrete subclasses of CateringType representing specific categories of
catering facilities at heritage venues.
Follows the Type/Types naming convention (Rule 0b):
- CateringType.yaml: Abstract base class
- CateringTypes.yaml: This file with concrete subclasses
Created per slot_fixes.yaml revision for catering_type migration (Rule 53/56).
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
skos: http://www.w3.org/2004/02/skos/core#
schema: http://schema.org/
imports:
- linkml:types
- ./CateringType
default_prefix: hc
classes:
CafeCateringType:
is_a: CateringType
class_uri: hc:CafeCateringType
description: |
Casual café or coffee shop offering beverages, light snacks, and pastries.
Typically self-service or counter-service with informal seating.
slot_usage:
has_or_had_name:
equals_string: Café
exact_mappings:
- schema:CafeOrCoffeeShop
aliases:
- Coffee Shop
- Koffiehuis
- Coffeebar
RestaurantCateringType:
is_a: CateringType
class_uri: hc:RestaurantCateringType
description: |
Full-service restaurant with table service, complete meals, and formal dining.
May range from casual dining to fine dining establishments.
slot_usage:
has_or_had_name:
equals_string: Restaurant
exact_mappings:
- schema:Restaurant
aliases:
- Dining Room
- Eatery
TeaRoomCateringType:
is_a: CateringType
class_uri: hc:TeaRoomCateringType
description: |
Tea room or tea salon specializing in tea service, often with afternoon tea,
scones, sandwiches, and pastries.
slot_usage:
has_or_had_name:
equals_string: Tea Room
aliases:
- Tea Salon
- Theehuis
- Salon de Thé
CanteenCateringType:
is_a: CateringType
class_uri: hc:CanteenCateringType
description: |
Staff cafeteria or canteen primarily serving employees and staff.
May be open to visitors or restricted to staff only.
slot_usage:
has_or_had_name:
equals_string: Canteen
aliases:
- Cafeteria
- Staff Restaurant
- Kantine
TerraceCateringType:
is_a: CateringType
class_uri: hc:TerraceCateringType
description: |
Outdoor or garden café, typically seasonal, offering refreshments
in a garden, courtyard, or terrace setting.
slot_usage:
has_or_had_name:
equals_string: Terrace
aliases:
- Garden Café
- Outdoor Café
- Terras
HistoricCafeCateringType:
is_a: CateringType
class_uri: hc:HistoricCafeCateringType
description: |
Heritage café with cultural or historical significance.
Often a protected monument or literary landmark in its own right.
Examples: Café Americain, Café de Flore, Café Central.
slot_usage:
has_or_had_name:
equals_string: Historic Café
aliases:
- Heritage Café
- Literary Café
- Grand Café
EventCateringType:
is_a: CateringType
class_uri: hc:EventCateringType
description: |
Function and event catering space for private events, receptions,
corporate functions, and special occasions.
slot_usage:
has_or_had_name:
equals_string: Event Catering
aliases:
- Function Catering
- Banquet Hall
- Reception Venue

View file

@ -24,7 +24,9 @@ imports:
- ../slots/has_or_had_version # was: cms_product_version - migrated per Rule 53 (2026-01-19)
- ./Version
- ../slots/has_or_had_custodian_type
- ../slots/deployment_date
# MIGRATED 2026-01-25: deployment_date → is_or_was_deployed_at + DeploymentEvent (Rule 53)
- ../slots/is_or_was_deployed_at
- ./DeploymentEvent
- ../slots/iiif_compatible
- ../slots/license
- ../slots/linked_data_export
@ -126,7 +128,8 @@ classes:
# REMOVED 2026-01-19: cms_product_version - migrated to has_or_had_version + Version (Rule 53)
- has_or_had_version # was: cms_product_version - migrated per Rule 53 (2026-01-19)
- has_or_had_custodian_type
- deployment_date
# MIGRATED 2026-01-25: deployment_date → is_or_was_deployed_at (Rule 53)
- is_or_was_deployed_at
- documentation_url
- iiif_compatible
- license
@ -396,11 +399,35 @@ classes:
examples:
- value: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804
description: Rijksmuseum uses this CMS
# MIGRATED 2026-01-25: deployment_date → is_or_was_deployed_at + DeploymentEvent (Rule 53)
deployment_date:
range: date
description: |
DEPRECATED 2026-01-25: Migrated to is_or_was_deployed_at slot with DeploymentEvent class.
See is_or_was_deployed_at slot_usage for current pattern.
deprecated: "Use is_or_was_deployed_at with DeploymentEvent class"
is_or_was_deployed_at:
description: |
MIGRATED from deployment_date per slot_fixes.yaml (Rule 53, 2026-01-25).
Deployment events for this CMS. Uses DeploymentEvent class which includes:
- temporal_extent: TimeSpan with fuzzy boundaries for deployment date
- refers_to_custodian: Institution where deployment occurred
- description: Deployment notes and context
Enables tracking multiple deployments (initial, upgrades, re-deployments).
range: DeploymentEvent
multivalued: true
inlined_as_list: true
required: false
examples:
- value: '2015-06-01'
description: CMS deployed June 2015
- value:
temporal_extent:
begin_of_the_begin: "2015-06-01"
end_of_the_end: "2015-06-01"
refers_to_custodian: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804
has_or_had_description:
has_or_had_text: "Initial deployment of Adlib CMS"
description: Rijksmuseum Adlib deployment (migrated from deployment_date)
temporal_extent:
range: TimeSpan
examples:
@ -477,6 +504,13 @@ classes:
- https://nde.nl/ontology/hc/collection/rm-paintings
- https://nde.nl/ontology/hc/collection/rm-prints
refers_to_custodian: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804
# MIGRATED 2026-01-25: deployment_date → is_or_was_deployed_at + DeploymentEvent (Rule 53)
is_or_was_deployed_at:
- temporal_extent:
begin_of_the_begin: "2015-06-01"
end_of_the_end: "2015-06-01"
has_or_had_description:
has_or_had_text: "Initial deployment of Adlib CMS at Rijksmuseum"
description: Rijksmuseum Adlib CMS deployment
- value:
# cms_id migrated to has_or_had_identifier with Identifier class (2026-01-18)

View file

@ -42,7 +42,9 @@ imports:
# REMOVED 2026-01-15: ../slots/budget - migrated to is_or_was_allocated_budget
- ../slots/is_or_was_allocated_budget
- ../slots/curated_holding
- ../slots/deliverable
# MIGRATED 2026-01-24: deliverable → has_or_had_objective + Deliverable (Rule 53)
- ../slots/has_or_had_objective
- ./Deliverable
- ../slots/documentation_produced
- ../slots/funding_source
- ../slots/is_recurring
@ -174,7 +176,8 @@ classes:
- is_or_was_allocated_budget
- curated_holding
- has_or_had_custodian_type
- deliverable
# MIGRATED 2026-01-24: deliverable → has_or_had_objective + Deliverable (Rule 53)
- has_or_had_objective
- documentation_produced
- funding_source
- is_recurring
@ -305,15 +308,31 @@ classes:
- Condition notation updates (42 records)
description: Inventory deliverables
deliverable:
range: uri
# MIGRATED 2026-01-24: deliverable → has_or_had_objective + Deliverable (Rule 53)
has_or_had_objective:
range: Deliverable
multivalued: true
description: URIs to deliverable resources produced by this activity.
inlined: true
inlined_as_list: true
description: |
Deliverable resources produced by this curation activity.
MIGRATED from 'deliverable' slot per slot_fixes.yaml (Rule 53).
Uses Deliverable class for structured representation.
examples:
- value:
- https://example.org/reports/inventory-2025.pdf
- https://example.org/finding-aids/voc-series-1.ead
description: Deliverable URLs
has_or_had_label:
has_or_had_text: "Inventory reconciliation report"
deliverable_type: "report"
deliverable_url: "https://example.org/reports/inventory-2025.pdf"
is_completed: true
description: Inventory report deliverable
- value:
has_or_had_label:
has_or_had_text: "VOC Series Finding Aid"
deliverable_type: "finding_aid"
deliverable_url: "https://example.org/finding-aids/voc-series-1.ead"
is_completed: true
description: EAD finding aid deliverable
funding_source:
range: string
@ -444,8 +463,13 @@ classes:
- Digital asset management records
- OCR quality assessment report
- IIIF manifest files
deliverable:
- https://www.nationaalarchief.nl/onderzoeken/archief/1.04.02/digital
# MIGRATED 2026-01-24: deliverable → has_or_had_objective (Rule 53)
has_or_had_objective:
- has_or_had_label:
has_or_had_text: "VOC Digital Archive"
deliverable_type: "digital_collection"
deliverable_url: "https://www.nationaalarchief.nl/onderzoeken/archief/1.04.02/digital"
is_completed: true
funding_source: Metamorfoze National Digitization Programme
is_or_was_allocated_budget: EUR 850,000 # MIGRATED 2026-01-15: was budget
status: IN_PROGRESS

View file

@ -30,7 +30,9 @@ imports:
- ../slots/observation_source
- ../slots/source
- ../slots/observation_context
- ../slots/derived_from_entity
# MIGRATED 2026-01-25: derived_from_entity → refers_or_referred_to + EntityReconstruction (Rule 53)
- ../slots/refers_or_referred_to
- ./EntityReconstruction
- ../slots/has_or_had_confidence_measure
- ../slots/has_or_had_custodian_type
- ../slots/specificity_annotation
@ -59,7 +61,8 @@ classes:
- has_or_had_alternative_observed_name
- has_or_had_confidence_measure
- has_or_had_custodian_type
- derived_from_entity
# MIGRATED 2026-01-25: derived_from_entity → refers_or_referred_to (Rule 53)
- refers_or_referred_to
- observation_context
- observation_date
- observation_source
@ -88,8 +91,23 @@ classes:
required: true
observation_context:
range: string
# MIGRATED 2026-01-25: derived_from_entity → refers_or_referred_to (Rule 53)
derived_from_entity:
range: CustodianLegalStatus
description: |
DEPRECATED 2026-01-25: Migrated to refers_or_referred_to slot with EntityReconstruction class.
See refers_or_referred_to slot_usage for current pattern.
deprecated: "Use refers_or_referred_to with EntityReconstruction class"
refers_or_referred_to:
description: |
MIGRATED from derived_from_entity per slot_fixes.yaml (Rule 53, 2026-01-25).
Links observation to the formal entity it references (reconstructed entity).
Uses EntityReconstruction class hierarchy (CustodianLegalStatus, CustodianName, CustodianPlace).
range: CustodianLegalStatus # Keep backward compatible range for now
required: false
examples:
- value: https://nde.nl/ontology/hc/legal/stichting-rijksmuseum
description: Observation refers to Rijksmuseum legal entity
has_or_had_confidence_measure:
range: ConfidenceMeasure
has_or_had_custodian_type:

View file

@ -39,7 +39,9 @@ imports:
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ../slots/derived_from_observation
# MIGRATED 2026-01-25: derived_from_observation → is_or_was_based_on + Observation (Rule 53)
- ../slots/is_or_was_based_on
- ./Observation
- ../slots/place_custodian_ref
classes:
CustodianPlace:
@ -196,10 +198,24 @@ classes:
- place_name: Rijksmuseum Schiphol
auxiliary_place_type: BRANCH_OFFICE
description: Rijksmuseum subordinate locations
# MIGRATED 2026-01-25: derived_from_observation → is_or_was_based_on (Rule 53)
derived_from_observation:
description: |
DEPRECATED 2026-01-25: Migrated to is_or_was_based_on slot with Observation class.
See is_or_was_based_on slot_usage for current pattern.
deprecated: "Use is_or_was_based_on with Observation class"
is_or_was_based_on:
description: |
MIGRATED from derived_from_observation per slot_fixes.yaml (Rule 53, 2026-01-25).
Links to observations from which this place designation was derived.
Uses Observation class hierarchy (CustodianObservation, etc.).
range: uriorcurie
multivalued: true
required: true
examples:
- value: https://w3id.org/heritage/observation/notarial-deed-1850
description: Observation from historical document
is_or_was_generated_by: # was: was_generated_by - migrated per Rule 53
range: ReconstructionActivity
required: false

View file

@ -0,0 +1,122 @@
id: https://nde.nl/ontology/hc/class/Deliverable
name: deliverable_class
title: Deliverable Class
description: |
Represents a tangible output or result from a project or activity.
**USE CASES**:
- Project outputs (reports, software, datasets)
- Curation activity results (digitized collections, finding aids)
- Research outputs (papers, methodologies, tools)
**PROPERTIES**:
- deliverable_type: Type of deliverable (report, software, dataset, etc.)
- deliverable_title: Name/title of the deliverable
- deliverable_url: URL where deliverable can be accessed
- completion_status: Status (planned, in_progress, completed, delayed)
**RELATIONSHIP TO Project and CurationActivity**:
Used to track concrete outputs from heritage projects and
curation activities. Each deliverable represents an expected
or completed work product.
imports:
- linkml:types
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
prov: http://www.w3.org/ns/prov#
default_prefix: hc
classes:
Deliverable:
class_uri: hc:Deliverable
description: |
A tangible output or result from a project or activity.
Captures type, title, URL, and completion status.
exact_mappings:
- prov:Entity
close_mappings:
- schema:CreativeWork
slots:
- deliverable_type
- deliverable_title
- deliverable_description
- deliverable_url
- completion_status
- due_date
slot_usage:
deliverable_type:
range: string
required: false
examples:
- value: "report"
description: Written report deliverable
- value: "software"
description: Software/application deliverable
- value: "dataset"
description: Dataset deliverable
- value: "finding_aid"
description: Archival finding aid
- value: "digitized_collection"
description: Digitized heritage materials
deliverable_title:
range: string
required: true
examples:
- value: "Project Final Report"
description: Final project report
- value: "Heritage Data Model v2.0"
description: Data model deliverable
deliverable_description:
range: string
required: false
description: Description of the deliverable
deliverable_url:
range: uri
required: false
examples:
- value: "https://github.org/project/repo"
description: GitHub repository with deliverables
- value: "https://doi.org/10.1234/deliverable"
description: DOI for project deliverables
completion_status:
range: string
required: false
examples:
- value: "planned"
description: Deliverable is planned but not started
- value: "in_progress"
description: Work is ongoing
- value: "completed"
description: Deliverable has been completed
- value: "delayed"
description: Deliverable is behind schedule
due_date:
range: date
required: false
description: Expected completion date
slots:
deliverable_type:
slot_uri: hc:deliverableType
range: string
description: Type of deliverable (report, software, dataset, etc.)
deliverable_title:
slot_uri: hc:deliverableTitle
range: string
description: Name/title of the deliverable
deliverable_description:
slot_uri: hc:deliverableDescription
range: string
description: Description of the deliverable
deliverable_url:
slot_uri: hc:deliverableUrl
range: uri
description: URL where deliverable can be accessed
completion_status:
slot_uri: hc:completionStatus
range: string
description: Status of deliverable (planned, in_progress, completed, delayed)
due_date:
slot_uri: hc:dueDate
range: date
description: Expected completion date

View file

@ -22,11 +22,23 @@ imports:
- ../slots/contact_point
- ../slots/located_at
- ../slots/refers_to_custodian
- ../slots/department_code
- ../slots/department_description
- ../slots/department_head
- ../slots/department_id
- ../slots/department_name
# MIGRATED 2026-01-25: department_code → has_or_had_label + Label + has_or_had_type + LabelType (Rule 53)
- ../slots/has_or_had_label
- ./Label
- ../slots/has_or_had_type
- ./LabelType
- ./LabelTypes
# MIGRATED 2026-01-25: department_description → has_or_had_description + Description (Rule 53)
- ../slots/has_or_had_description
- ./Description
# MIGRATED 2026-01-25: department_head → is_or_was_managed_by + Manager (Rule 53)
- ../slots/is_or_was_managed_by
- ./Manager
# MIGRATED 2026-01-25: department_id → has_or_had_identifier + Identifier (Rule 53)
- ../slots/has_or_had_identifier
- ./Identifier
# MIGRATED 2026-01-25: department_name → has_or_had_label + Label + has_or_had_type + LabelType (Rule 53)
# Already importing has_or_had_label, Label, has_or_had_type, LabelType above
- ../slots/dissolved_date
- ../slots/established_date
- ../slots/has_or_had_manages_collection
@ -42,40 +54,6 @@ imports:
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ../slots/contact_point
- ../slots/department_code
- ../slots/department_description
- ../slots/department_head
- ../slots/department_id
- ../slots/department_name
- ../slots/dissolved_date
- ../slots/established_date
- ../slots/has_or_had_manages_collection
- ../slots/has_or_had_staff_member
- ../slots/has_or_had_sub_department
- ../slots/located_at
- ../slots/mandate
- ../slots/parent_department
- ../slots/refers_to_custodian
- ../slots/specificity_annotation
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
- ../slots/contact_point
- ../slots/department_code
- ../slots/department_description
- ../slots/department_head
- ../slots/department_id
- ../slots/department_name
- ../slots/dissolved_date
- ../slots/established_date
- ../slots/has_or_had_manages_collection
- ../slots/has_or_had_staff_member
- ../slots/has_or_had_sub_department
- ../slots/located_at
- ../slots/mandate
- ../slots/parent_department
- ../slots/refers_to_custodian
- ../slots/specificity_annotation
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
classes:
Department:
class_uri: org:OrganizationalUnit
@ -116,11 +94,17 @@ classes:
- wikidata:Q107679962
slots:
- contact_point
- department_code
- department_description
- department_head
- department_id
- department_name
# MIGRATED 2026-01-25: department_code → has_or_had_label + has_or_had_type (Rule 53)
- has_or_had_label
- has_or_had_type
# MIGRATED 2026-01-25: department_description → has_or_had_description (Rule 53)
- has_or_had_description
# MIGRATED 2026-01-25: department_head → is_or_was_managed_by (Rule 53)
- is_or_was_managed_by
# MIGRATED 2026-01-25: department_id → has_or_had_identifier (Rule 53)
- has_or_had_identifier
# MIGRATED 2026-01-25: department_name → has_or_had_label with LabelType: DepartmentNameType (Rule 53)
# has_or_had_label already in slots list above
- dissolved_date
- established_date
- located_at
@ -133,35 +117,75 @@ classes:
- has_or_had_sub_department
- has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
slot_usage:
department_id:
# MIGRATED 2026-01-25: department_id → has_or_had_identifier (Rule 53)
has_or_had_identifier:
description: |
MIGRATED from department_id per slot_fixes.yaml (Rule 53, 2026-01-25).
Unique identifier for this department.
Format: URI following NDE Heritage Custodian ontology conventions.
range: uriorcurie
required: true
identifier: true
examples:
- value: https://nde.nl/ontology/hc/dept/nationaal-archief-colonial-records
description: Colonial Records Department at National Archives
# MIGRATED 2026-01-25: department_name → has_or_had_label with LabelType (Rule 53)
department_name:
range: string
required: true
description: |
DEPRECATED 2026-01-25: Migrated to has_or_had_label slot with Label class
using has_or_had_type: "DepartmentNameType" for type discrimination.
See has_or_had_label slot_usage for current pattern.
deprecated: "Use has_or_had_label with Label(has_or_had_type='DepartmentNameType')"
# MIGRATED 2026-01-25: department_code + department_name → has_or_had_label + has_or_had_type (Rule 53)
has_or_had_label:
description: |
MIGRATED from department_code AND department_name per slot_fixes.yaml (Rule 53, 2026-01-25).
This slot now covers BOTH department codes AND department names.
Uses Label class with has_or_had_type for discrimination:
- has_or_had_type: "DepartmentCodeType" - Short code for department
- has_or_had_type: "DepartmentNameType" - Official name of department
range: Label
inlined: true
multivalued: true
required: true # At least one label (name) required
examples:
- value: Colonial Records Department
- value: Paintings Department
- value: Special Collections Department
- value: Preservation and Conservation Department
department_code:
range: string
- value:
has_or_had_text: "Colonial Records Department"
has_or_had_type: DepartmentNameType
description: Department name (migrated from department_name)
- value:
has_or_had_text: "CRD"
has_or_had_type: DepartmentCodeType
description: Department code (migrated from department_code)
- value:
has_or_had_text: "Paintings Department"
has_or_had_type: DepartmentNameType
description: Department name
- value:
has_or_had_text: "PNTG"
has_or_had_type: DepartmentCodeType
description: Department code
has_or_had_type:
description: |
Type classification for labels (used with has_or_had_label).
MIGRATED from department_code per slot_fixes.yaml (Rule 53, 2026-01-25).
range: LabelType
inlined: true
required: false
# MIGRATED 2026-01-25: department_description → has_or_had_description (Rule 53)
has_or_had_description:
description: |
MIGRATED from department_description per slot_fixes.yaml (Rule 53, 2026-01-25).
Detailed description of the department's purpose and holdings.
Uses Description class for structured representation.
range: Description
inlined: true
required: false
examples:
- value: CRD
description: Colonial Records Department
- value: PNTG
description: Paintings Department
- value: SPECCOLL
description: Special Collections
department_description:
range: string
examples:
- value: The Colonial Records Department preserves and provides access to government records from the Dutch colonial
period (1602-1949). Holdings include VOC archives, colonial administration files, and diplomatic correspondence.
- value:
has_or_had_text: "The Colonial Records Department preserves and provides access to government records from the Dutch colonial period (1602-1949). Holdings include VOC archives, colonial administration files, and diplomatic correspondence."
description: Department description (migrated from department_description)
mandate:
range: string
examples:
@ -181,14 +205,20 @@ classes:
- https://nde.nl/ontology/hc/dept/na-colonial-voc
- https://nde.nl/ontology/hc/dept/na-colonial-wic
description: VOC and WIC sub-departments
department_head:
range: PersonObservation
# MIGRATED 2026-01-25: department_head → is_or_was_managed_by + Manager (Rule 53)
is_or_was_managed_by:
description: |
MIGRATED from department_head per slot_fixes.yaml (Rule 53, 2026-01-25).
Person responsible for managing this department.
Uses Manager class for structured representation.
range: Manager
inlined: true
required: false
examples:
- value:
person_name: Dr. Maria van der Berg
staff_role: ARCHIVIST
role_title: Head of Colonial Records Department
description: Department head
- value:
has_or_had_name: "Dr. Maria van der Berg"
has_or_had_title: "Head of Colonial Records Department"
description: Department head (migrated from department_head)
has_or_had_staff_member:
range: PersonObservation
multivalued: true
@ -237,22 +267,20 @@ classes:
- https://www.w3.org/ns/org#OrganizationalUnit
- https://www.ica.org/standards/RiC/ontology#Agent
examples:
# MIGRATED 2026-01-25: All department_* slots migrated to generic slots (Rule 53)
- value:
department_id: https://nde.nl/ontology/hc/dept/nationaal-archief-colonial-records
department_name: Colonial Records Department
department_code: CRD
department_description: 'Preserves and provides access to government records from the
Dutch colonial period (1602-1949). Holdings include VOC archives,
colonial administration files, and diplomatic correspondence.
'
mandate: 'Established by Royal Decree of 1891 to manage and preserve
records of the Dutch East Indies administration.
'
# MIGRATED: department_id → has_or_had_identifier
has_or_had_identifier: https://nde.nl/ontology/hc/dept/nationaal-archief-colonial-records
# MIGRATED: department_name + department_code → has_or_had_label (multivalued)
has_or_had_label:
- has_or_had_text: "Colonial Records Department"
has_or_had_type: DepartmentNameType
- has_or_had_text: "CRD"
has_or_had_type: DepartmentCodeType
# MIGRATED: department_description → has_or_had_description
has_or_had_description:
has_or_had_text: "Preserves and provides access to government records from the Dutch colonial period (1602-1949). Holdings include VOC archives, colonial administration files, and diplomatic correspondence."
mandate: 'Established by Royal Decree of 1891 to manage and preserve records of the Dutch East Indies administration.'
established_date: '1891-06-15'
has_or_had_manages_collection:
- https://nde.nl/ontology/hc/collection/na-voc-archives
@ -261,20 +289,21 @@ classes:
refers_to_custodian: https://nde.nl/ontology/hc/nl-zh-hag-a-na
description: National Archives Colonial Records Department
- value:
department_id: https://nde.nl/ontology/hc/dept/rijksmuseum-paintings
department_name: Paintings Department
department_code: PNTG
department_description: 'Responsible for the museum''s collection of paintings from the
Middle Ages to the 20th century. Includes Dutch Golden Age
masterpieces, Flemish Baroque, and European paintings.
'
department_head:
person_name: Dr. Pieter Roelofs
staff_role: CURATOR
role_title: Head of Paintings Department
# MIGRATED: department_id → has_or_had_identifier
has_or_had_identifier: https://nde.nl/ontology/hc/dept/rijksmuseum-paintings
# MIGRATED: department_name + department_code → has_or_had_label (multivalued)
has_or_had_label:
- has_or_had_text: "Paintings Department"
has_or_had_type: DepartmentNameType
- has_or_had_text: "PNTG"
has_or_had_type: DepartmentCodeType
# MIGRATED: department_description → has_or_had_description
has_or_had_description:
has_or_had_text: "Responsible for the museum's collection of paintings from the Middle Ages to the 20th century. Includes Dutch Golden Age masterpieces, Flemish Baroque, and European paintings."
# MIGRATED: department_head → is_or_was_managed_by
is_or_was_managed_by:
has_or_had_name: "Dr. Pieter Roelofs"
has_or_had_title: "Head of Paintings Department"
has_or_had_manages_collection:
- https://nde.nl/ontology/hc/collection/rm-dutch-paintings
- https://nde.nl/ontology/hc/collection/rm-flemish-paintings

View file

@ -17,8 +17,9 @@ imports:
- ../slots/hold_or_held_record_set_type
- ../slots/archive_series
- ../slots/has_or_had_custodian_type
- ../slots/departement_code
- ../slots/departement_name
# MIGRATED 2026-01-24: departement_code, departement_name → has_or_had_service_area + ServiceArea (Rule 53)
- ../slots/has_or_had_service_area
- ./ServiceArea
- ../slots/specificity_annotation
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
- ../slots/is_or_was_related_to # was: wikidata_alignment - migrated per Rule 53 (2026-01-15)
@ -42,8 +43,8 @@ classes:
slots:
- archive_series
- has_or_had_custodian_type
- departement_code
- departement_name
# MIGRATED 2026-01-24: departement_code, departement_name → has_or_had_service_area + ServiceArea (Rule 53)
- has_or_had_service_area
- hold_or_held_record_set_type
- specificity_annotation
- has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
@ -66,22 +67,39 @@ classes:
slot_usage:
has_or_had_identifier: # was: wikidata_entity - migrated per Rule 53 (2026-01-15)
# equals_string removed: Q2860456 (incompatible with uriorcurie range)
departement_code:
range: string
pattern: ^[0-9]{2,3}$
# MIGRATED 2026-01-24: departement_code, departement_name → has_or_had_service_area + ServiceArea (Rule 53)
has_or_had_service_area:
range: ServiceArea
inlined: true
required: false
description: |
French département served by this archive.
MIGRATED from 'departement_code' and 'departement_name' slots per slot_fixes.yaml (Rule 53).
Uses ServiceArea class with:
- service_area_name: Département name (e.g., "Bouches-du-Rhône")
- has_or_had_identifier: Département code as structured identifier (e.g., "13")
examples:
- value: '75'
description: Paris
- value: '13'
description: Bouches-du-Rhône
- value: '974'
description: La Réunion (overseas)
departement_name:
range: string
examples:
- value: Bouches-du-Rhône
- value: Nord
- value: Seine-Maritime
- value:
service_area_name: "Paris"
has_or_had_identifier:
identifier_scheme: "FR_DEPARTEMENT"
identifier_value: "75"
description: Paris département (code 75)
- value:
service_area_name: "Bouches-du-Rhône"
has_or_had_identifier:
identifier_scheme: "FR_DEPARTEMENT"
identifier_value: "13"
description: Bouches-du-Rhône département (code 13)
- value:
service_area_name: "La Réunion"
has_or_had_identifier:
identifier_scheme: "FR_DEPARTEMENT"
identifier_value: "974"
covers_country:
alpha_2: "FR"
description: La Réunion overseas département (code 974)
is_or_was_part_of_archive_series:
range: string
multivalued: true
@ -138,8 +156,14 @@ classes:
- archivos departamentales@es
- archives départementales@fr
has_or_had_description: Departmental archives in France # was: type_description - migrated per Rule 53/56 (2026-01-16)
departement_code: '13'
departement_name: Bouches-du-Rhône
# MIGRATED 2026-01-24: departement_code, departement_name → has_or_had_service_area (Rule 53)
has_or_had_service_area:
service_area_name: "Bouches-du-Rhône"
has_or_had_identifier:
identifier_scheme: "FR_DEPARTEMENT"
identifier_value: "13"
covers_country:
alpha_2: "FR"
is_or_was_part_of_archive_series:
- A-L (ancien régime)
- E (état civil)

View file

@ -0,0 +1,155 @@
# DeploymentEvent class
# Represents software/system deployment events with temporal and contextual information
#
# Generation date: 2026-01-25
# Rule compliance: 0 (LinkML single source of truth), 53 (migration from deployment_date)
id: https://nde.nl/ontology/hc/class/DeploymentEvent
name: deployment_event_class
title: DeploymentEvent Class
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
prov: http://www.w3.org/ns/prov#
schema: http://schema.org/
crm: http://www.cidoc-crm.org/cidoc-crm/
default_prefix: hc
imports:
- linkml:types
- ./TimeSpan
- ./Custodian
- ../slots/temporal_extent
- ../slots/has_or_had_description
- ./Description
- ../slots/refers_to_custodian
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ./SpecificityAnnotation
- ./TemplateSpecificityScore
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
classes:
DeploymentEvent:
class_uri: prov:Activity
description: |
Event representing the deployment of a software system (CMS, platform) at an institution.
**Purpose**:
DeploymentEvent captures the full context of a software deployment:
- WHEN: Via temporal_extent (TimeSpan with fuzzy boundaries)
- WHERE: Via refers_to_custodian (target institution)
- WHAT: Linked from CollectionManagementSystem.is_or_was_deployed_at
- WHY: Via description (deployment rationale, notes)
**MIGRATED FROM**: `deployment_date` slot
Replaces simple date with structured event that:
- Supports fuzzy temporal bounds (TimeSpan)
- Tracks deployment at specific custodians
- Enables multiple deployment events per system
- Captures deployment context and rationale
**Ontological Alignment**:
- **Primary**: `prov:Activity` - PROV-O activity
- **Close**: `crm:E5_Event` - CIDOC-CRM event
- **Related**: `schema:Action` - Schema.org action
**Relationship to CollectionManagementSystem**:
```
CollectionManagementSystem
└── is_or_was_deployed_at → DeploymentEvent[]
├── temporal_extent → TimeSpan
├── refers_to_custodian → Custodian
└── description → Description
```
exact_mappings:
- prov:Activity
close_mappings:
- crm:E5_Event
- schema:Action
related_mappings:
- schema:InstallAction
slots:
- temporal_extent
- refers_to_custodian
- has_or_had_description
- specificity_annotation
- has_or_had_score
slot_usage:
temporal_extent:
description: |
When this deployment occurred.
Uses TimeSpan for fuzzy temporal bounds:
- Precise: Set all four bounds to same date
- Approximate: Use begin_of_the_begin/end_of_the_end range
range: TimeSpan
inlined: true
required: true
examples:
- value:
begin_of_the_begin: "2015-06-01"
end_of_the_end: "2015-06-01"
description: Precise deployment date (June 1, 2015)
- value:
begin_of_the_begin: "2015-01-01"
end_of_the_end: "2015-06-30"
description: Approximate deployment (first half of 2015)
refers_to_custodian:
description: |
The institution where this deployment occurred.
range: Custodian
required: false
examples:
- value: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804
description: Deployment at Rijksmuseum
has_or_had_description:
description: |
Notes about this deployment event (rationale, context, issues).
range: Description
inlined: true
required: false
examples:
- value:
has_or_had_text: "Migrated from legacy system to Adlib v7.4. Data migration completed in phases over Q2 2015."
description: Deployment notes
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Deployment events applicable to all custodian types.
custodian_types_primary: null
specificity_score: 0.7
specificity_rationale: Specific to software deployment tracking.
comments:
- "MIGRATED from deployment_date per slot_fixes.yaml (Rule 53)"
- "PROV-O Activity for deployment tracking"
- "Enables multiple deployments per CMS (upgrades, re-deployments)"
- "TimeSpan allows fuzzy temporal bounds for uncertain deployment dates"
examples:
- value:
temporal_extent:
begin_of_the_begin: "2015-06-01"
end_of_the_end: "2015-06-01"
refers_to_custodian: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804
has_or_had_description:
has_or_had_text: "Initial deployment of Adlib CMS at Rijksmuseum"
description: Rijksmuseum Adlib deployment event
- value:
temporal_extent:
begin_of_the_begin: "2020-01-01"
end_of_the_end: "2020-03-31"
refers_to_custodian: https://nde.nl/ontology/hc/nl-zh-hag-a-na
has_or_had_description:
has_or_had_text: "Upgrade to MAIS-Flexis v3.0. Migration included archival descriptions from 2010-2019."
description: National Archives MAIS upgrade event

View file

@ -35,7 +35,9 @@ default_prefix: hc
imports:
- linkml:types
- ../metadata
- ../slots/description_text
# MIGRATED 2026-01-25: description_text → has_or_had_content + Content (Rule 53)
- ../slots/has_or_had_content
- ./Content
- ../slots/description_type
- ../slots/language
- ../slots/specificity_annotation
@ -91,18 +93,32 @@ classes:
- schema:description
slots:
- description_text
# MIGRATED 2026-01-25: description_text → has_or_had_content (Rule 53)
- has_or_had_content
- description_type
- language
- specificity_annotation
- has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
slot_usage:
description_text:
# DEPRECATED 2026-01-25: description_text migrated to has_or_had_content + Content (Rule 53)
# Old slot archived: modules/slots/archive/description_text_archived_20260125.yaml
has_or_had_content:
description: |
The textual content of the description.
range: string
The content of the description, modeled as Content class.
MIGRATED from description_text (string) per Rule 53.
**Migration Pattern**:
- Old: description_text: "Climate-controlled storage zone..."
- New: has_or_had_content with has_or_had_label and has_or_had_description
range: Content
required: true
inlined: true
examples:
- value:
has_or_had_label: "Zone Description"
has_or_had_description: "Climate-controlled storage zone with dedicated HVAC for archival materials."
description: Content for zone description
description_type:
description: |
The type of description (binding, branch, budget, zone, warehouse, unit, type, general).
@ -135,18 +151,25 @@ classes:
specificity_rationale: Very broadly applicable generic class for textual descriptions.
examples:
- value: |
description_text: "Climate-controlled storage zone with dedicated HVAC for archival materials. Maintains 65°F and 35% RH."
# MIGRATED 2026-01-25: examples updated to use has_or_had_content + Content (Rule 53)
- value:
has_or_had_content:
has_or_had_label: "Storage Zone Climate Control"
has_or_had_description: "Climate-controlled storage zone with dedicated HVAC for archival materials. Maintains 65°F and 35% RH."
description_type: zone
language: en
description: "Zone description for archival storage facility"
- value: |
description_text: "Quarter leather binding with marbled boards, spine with five raised bands and gilt titling."
- value:
has_or_had_content:
has_or_had_label: "Quarter Leather Binding"
has_or_had_description: "Quarter leather binding with marbled boards, spine with five raised bands and gilt titling."
description_type: binding
language: en
description: "Binding description for a rare book"
- value: |
description_text: "Regional branch serving Noord-Holland province with specialized genealogy and notarial collections."
- value:
has_or_had_content:
has_or_had_label: "Noord-Holland Regional Branch"
has_or_had_description: "Regional branch serving Noord-Holland province with specialized genealogy and notarial collections."
description_type: branch
language: en
description: "Branch description for organizational unit"

View file

@ -0,0 +1,107 @@
# DetectionLevelType class (Abstract Base)
# Type taxonomy for detection confidence levels
#
# Following Type/Types naming convention (Rule 0b):
# - DetectionLevelType: Abstract base class
# - DetectionLevelTypes: Concrete subclasses (HIGH, MEDIUM, LOW, etc.)
#
# Created: 2026-01-25
# Rule compliance: 0b (Type/Types pattern), 38 (slot centralization), 39 (RiC-O naming), 53 (slot_fixes.yaml)
# Migration: detection_level → filters_or_filtered + has_or_had_type + DetectionLevelType
id: https://nde.nl/ontology/hc/class/DetectionLevelType
name: DetectionLevelType
title: Detection Level Type Class
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
skos: http://www.w3.org/2004/02/skos/core#
dqv: http://www.w3.org/ns/dqv#
default_prefix: hc
imports:
- linkml:types
- ../metadata
- ../slots/has_or_had_code
- ../slots/has_or_had_label
- ../slots/has_or_had_description
classes:
DetectionLevelType:
class_uri: skos:Concept
abstract: true
description: |
Abstract base class for detection confidence level types.
**Type/Types Pattern (Rule 0b)**:
- `DetectionLevelType` (this file): Abstract base class
- `DetectionLevelTypes.yaml`: Concrete subclasses (HIGH, MEDIUM, LOW, etc.)
**DEFINITION**:
Detection levels categorize the confidence/quality of automated detection
results. Rather than raw numeric thresholds, these provide semantic
categories for filtering and display decisions.
**Level Hierarchy**:
| Level | Confidence Range | Use Case |
|-------|------------------|----------|
| HIGH | 0.9+ | Production, public display |
| MEDIUM | 0.7-0.9 | Review queue, moderate confidence |
| LOW | 0.5-0.7 | Research, exhaustive analysis |
| UNCERTAIN | < 0.5 | Flagged for manual review |
**Ontological Alignment**:
- **SKOS**: `skos:Concept` - controlled vocabulary term
- **DQV**: Related to data quality metrics
**Migrated From** (per slot_fixes.yaml):
- `detection_level` now uses:
- `filters_or_filtered` → DetectedEntity
- `has_or_had_type` → DetectionLevelType (this class)
- `includes_or_included` → DetectionLevelTypes (subclasses)
exact_mappings:
- skos:Concept
close_mappings:
- dqv:QualityAnnotation
slots:
- has_or_had_code
- has_or_had_label
- has_or_had_description
slot_usage:
has_or_had_code:
description: Short code for the detection level (HIGH, MEDIUM, LOW, etc.)
pattern: "^[A-Z_]+$"
examples:
- value: HIGH
- value: MEDIUM
- value: LOW
has_or_had_label:
description: Human-readable label for the detection level
examples:
- value: "High Confidence"
- value: "Medium Confidence"
has_or_had_description:
description: Description of when/how this level is used
examples:
- value: "High confidence detections suitable for production display"
annotations:
custodian_types: '["D"]'
custodian_types_rationale: Detection levels apply to digital platforms with automated analysis
specificity_score: 0.75
specificity_rationale: Specific to media analysis and detection contexts
type_types_pattern: "Base class - concrete subclasses in DetectionLevelTypes.yaml"
comments:
- "Abstract base class for detection level taxonomy"
- "Concrete subclasses defined in DetectionLevelTypes.yaml"
- "Follows Type/Types naming convention (Rule 0b)"
- "Migrated from detection_level slot per slot_fixes.yaml"

View file

@ -0,0 +1,151 @@
# DetectionLevelTypes - Concrete subclasses for detection confidence levels
#
# Following Type/Types naming convention (Rule 0b):
# - DetectionLevelType.yaml: Abstract base class
# - DetectionLevelTypes.yaml (this file): Concrete subclasses
#
# Created: 2026-01-25
# Rule compliance: 0b (Type/Types pattern), 38 (slot centralization), 39 (RiC-O naming), 53 (slot_fixes.yaml)
# Migration: detection_level → filters_or_filtered + has_or_had_type + DetectionLevelType/DetectionLevelTypes
id: https://nde.nl/ontology/hc/class/DetectionLevelTypes
name: DetectionLevelTypes
title: Detection Level Types
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
default_prefix: hc
imports:
- linkml:types
- ./DetectionLevelType
classes:
# HIGH confidence level - production quality
HighDetectionLevel:
is_a: DetectionLevelType
class_uri: hc:HighDetectionLevel
description: |
High confidence detection level (0.9+ confidence).
**Use Case**: Production display, public-facing content.
High confidence detections have been verified to high accuracy standards
and are suitable for automated display without human review.
slot_usage:
has_or_had_code:
equals_string: HIGH
has_or_had_label:
equals_string: "High Confidence"
annotations:
confidence_range: "0.9-1.0"
review_required: "false"
examples:
- value:
has_or_had_code: HIGH
has_or_had_label: "High Confidence"
has_or_had_description: "Suitable for production display"
# MEDIUM confidence level - review recommended
MediumDetectionLevel:
is_a: DetectionLevelType
class_uri: hc:MediumDetectionLevel
description: |
Medium confidence detection level (0.7-0.9 confidence).
**Use Case**: General use, review queue.
Medium confidence detections may need spot-checking but are generally
reliable for most applications.
slot_usage:
has_or_had_code:
equals_string: MEDIUM
has_or_had_label:
equals_string: "Medium Confidence"
annotations:
confidence_range: "0.7-0.9"
review_required: "recommended"
examples:
- value:
has_or_had_code: MEDIUM
has_or_had_label: "Medium Confidence"
has_or_had_description: "Review recommended before production use"
# LOW confidence level - research/exhaustive
LowDetectionLevel:
is_a: DetectionLevelType
class_uri: hc:LowDetectionLevel
description: |
Low confidence detection level (0.5-0.7 confidence).
**Use Case**: Research, exhaustive analysis, recall-focused.
Low confidence detections prioritize recall over precision.
Suitable for research workflows where missing items is more costly
than including false positives.
slot_usage:
has_or_had_code:
equals_string: LOW
has_or_had_label:
equals_string: "Low Confidence"
annotations:
confidence_range: "0.5-0.7"
review_required: "required"
examples:
- value:
has_or_had_code: LOW
has_or_had_label: "Low Confidence"
has_or_had_description: "Requires human review before use"
# UNCERTAIN level - manual review required
UncertainDetectionLevel:
is_a: DetectionLevelType
class_uri: hc:UncertainDetectionLevel
description: |
Uncertain detection level (< 0.5 confidence).
**Use Case**: Flagged items, manual review queue.
Uncertain detections should not be used without human verification.
These are typically included in raw output for completeness but
require manual curation before any production use.
slot_usage:
has_or_had_code:
equals_string: UNCERTAIN
has_or_had_label:
equals_string: "Uncertain"
annotations:
confidence_range: "0.0-0.5"
review_required: "mandatory"
examples:
- value:
has_or_had_code: UNCERTAIN
has_or_had_label: "Uncertain"
has_or_had_description: "Manual verification required"
# VERIFIED level - human confirmed
VerifiedDetectionLevel:
is_a: DetectionLevelType
class_uri: hc:VerifiedDetectionLevel
description: |
Verified detection level (human confirmed).
**Use Case**: Human-verified detections, ground truth.
Verified detections have been manually confirmed by a human reviewer.
These override automated confidence scores and serve as ground truth.
slot_usage:
has_or_had_code:
equals_string: VERIFIED
has_or_had_label:
equals_string: "Human Verified"
annotations:
confidence_range: "1.0"
review_required: "completed"
examples:
- value:
has_or_had_code: VERIFIED
has_or_had_label: "Human Verified"
has_or_had_description: "Manually confirmed by curator"

View file

@ -0,0 +1,149 @@
# DetectionThreshold class
# Represents threshold configuration for detection/filtering in analysis pipelines
#
# Created: 2026-01-25
# Rule compliance: 0b (Type/Types pattern), 38 (slot centralization), 39 (RiC-O naming), 53 (slot_fixes.yaml)
# Migration: detection_threshold → filters_or_filtered + has_or_had_treshold + DetectionThreshold
id: https://nde.nl/ontology/hc/class/DetectionThreshold
name: DetectionThreshold
title: Detection Threshold Class
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
dqv: http://www.w3.org/ns/dqv#
schema: http://schema.org/
prov: http://www.w3.org/ns/prov#
default_prefix: hc
imports:
- linkml:types
- ../metadata
- ../slots/has_or_had_label
- ../slots/has_or_had_description
- ../slots/has_or_had_type
classes:
DetectionThreshold:
class_uri: dqv:QualityMeasurement
description: |
Configuration for detection thresholds in analysis pipelines.
**DEFINITION**:
DetectionThreshold represents the confidence threshold settings used to filter
detection results. CV models output confidence scores; thresholds determine
which detections are included in results.
**Threshold Levels**:
| Threshold | Range | Use Case |
|-----------|-------|----------|
| HIGH_PRECISION | 0.9+ | Production display, high confidence |
| BALANCED | 0.7-0.9 | General use, balance precision/recall |
| HIGH_RECALL | 0.5-0.7 | Research, review, catch more |
| RAW | < 0.5 | Unfiltered, needs post-processing |
**Ontological Alignment**:
- **DQV**: `dqv:QualityMeasurement` - quality metric for data assessment
- **PROV-O**: Threshold as parameter of detection activity
**Migrated From** (per slot_fixes.yaml):
- `detection_threshold` (float) now uses:
- `filters_or_filtered` → DetectedEntity
- `has_or_had_treshold` → DetectionThreshold (this class)
**Usage Pattern**:
```
VideoAnnotation
└── filters_or_filtered → DetectedEntity
└── has_or_had_treshold → DetectionThreshold
├── threshold_value: 0.5
└── threshold_type: MINIMUM
```
exact_mappings:
- dqv:QualityMeasurement
close_mappings:
- schema:QuantitativeValue
related_mappings:
- prov:SoftwareAgent
slots:
- has_or_had_label
- has_or_had_description
- has_or_had_type
attributes:
threshold_value:
range: float
required: true
minimum_value: 0.0
maximum_value: 1.0
description: |
The numeric threshold value (0.0-1.0).
Detections with confidence >= threshold_value are included.
examples:
- value: 0.5
description: Standard threshold
- value: 0.9
description: High precision threshold
threshold_type:
range: string
required: false
description: |
Type of threshold application.
- MINIMUM: Lower bound for inclusion
- MAXIMUM: Upper bound (rare)
- BAND: Range between two values
examples:
- value: MINIMUM
description: Minimum confidence for inclusion
slot_usage:
has_or_had_label:
description: Human-readable label for this threshold configuration
examples:
- value: "High Precision Threshold"
- value: "Research Mode Threshold"
has_or_had_type:
description: Type category for the threshold (HIGH_PRECISION, BALANCED, etc.)
examples:
- value: HIGH_PRECISION
- value: BALANCED
annotations:
custodian_types: '["D"]'
custodian_types_rationale: Detection thresholds apply to digital platforms with automated analysis
specificity_score: 0.75
specificity_rationale: Fairly specific to video/media analysis contexts
comments:
- "Represents detection threshold configuration"
- "Migrated from detection_threshold slot per slot_fixes.yaml"
- "threshold_value is the numeric confidence cutoff"
- "threshold_type indicates how threshold is applied"
examples:
- value:
threshold_value: 0.5
threshold_type: MINIMUM
has_or_had_label: "Standard Detection"
description: "Standard detection threshold at 0.5 confidence"
- value:
threshold_value: 0.9
threshold_type: MINIMUM
has_or_had_label: "High Precision"
has_or_had_description: "For production display requiring high confidence"
description: "High precision threshold for production use"
- value:
threshold_value: 0.3
threshold_type: MINIMUM
has_or_had_label: "Research Mode"
has_or_had_description: "Low threshold to maximize recall for research"
description: "Low threshold for research/review workflows"

View file

@ -0,0 +1,91 @@
# DeviceType class (abstract base)
# Abstract type taxonomy for IoT devices
#
# Following Type/Types naming convention (Rule 0b):
# - DeviceType.yaml (singular): Abstract base class
# - DeviceTypes.yaml (plural): Concrete subclasses
#
# Generation date: 2026-01-25
# Rule compliance: 0 (LinkML single source of truth), 0b (Type/Types pattern), 53 (migration)
# Migration source: device_type slot + DigitalPresenceTypeEnum per slot_fixes.yaml
id: https://nde.nl/ontology/hc/class/DeviceType
name: device_type_class
title: DeviceType Class (Abstract Base)
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
sosa: http://www.w3.org/ns/sosa/
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_label
- ../slots/has_or_had_identifier
classes:
DeviceType:
class_uri: schema:Product
abstract: true
description: |
Abstract base class for IoT device type taxonomy.
**MIGRATION SOURCE**: Created from device_type slot migration (Rule 53, 2026-01-25).
Replaces DigitalPresenceTypeEnum values (IOT_BEACON, IOT_SENSOR, IOT_KIOSK, etc.)
with a class hierarchy following Type/Types pattern (Rule 0b).
**Pattern**: Type/Types (Rule 0b)
- DeviceType (this file): Abstract base defining common slots
- DeviceTypes (separate file): Concrete subclasses (IoTBeacon, IoTSensor, IoTKiosk, etc.)
**Ontological Alignment**:
- **Primary**: `schema:Product` - Schema.org product (devices are products)
- **Related**: `sosa:Platform` - SOSA platform hosting sensors
**Inheritance**:
```
DeviceType (abstract)
├── IoTBeacon
├── IoTSensor
├── IoTKiosk
├── IoTDisplay
└── IoTActuator
```
exact_mappings:
- schema:Product
related_mappings:
- sosa:Platform
slots:
- has_or_had_identifier
- has_or_had_label
slot_usage:
has_or_had_identifier:
description: Unique identifier for this device type.
range: uriorcurie
required: false
has_or_had_label:
description: Human-readable name of this device type.
range: string
required: true
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Device types applicable to all custodian types using IoT.
custodian_types_primary: null
specificity_score: 0.7
specificity_rationale: Specific to IoT device classification.
type_types_pattern: base
type_types_related: DeviceTypes
comments:
- "CREATED from device_type migration per slot_fixes.yaml (Rule 53)"
- "Abstract base class - use concrete subclasses from DeviceTypes.yaml"
- "Replaces DigitalPresenceTypeEnum values with class hierarchy"
- "Type/Types pattern: DeviceType (base) + DeviceTypes (subclasses)"

View file

@ -0,0 +1,149 @@
# DeviceTypes class (concrete subclasses)
# Concrete subclasses of DeviceType taxonomy
#
# Following Type/Types naming convention (Rule 0b):
# - DeviceType.yaml (singular): Abstract base class
# - DeviceTypes.yaml (plural): Concrete subclasses
#
# Generation date: 2026-01-25
# Rule compliance: 0 (LinkML single source of truth), 0b (Type/Types pattern), 53 (migration)
# Migration source: device_type slot + DigitalPresenceTypeEnum per slot_fixes.yaml
id: https://nde.nl/ontology/hc/class/DeviceTypes
name: device_types_class
title: DeviceTypes Class (Concrete Subclasses)
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
sosa: http://www.w3.org/ns/sosa/
default_prefix: hc
imports:
- linkml:types
- ./DeviceType
classes:
# Concrete subclasses of DeviceType
IoTBeacon:
is_a: DeviceType
class_uri: hc:IoTBeacon
description: |
Bluetooth beacon or proximity device for location-based triggers.
**Use Cases**:
- Proximity triggers for mobile app content near artworks
- Indoor navigation and wayfinding
- Visitor tracking and analytics
**Replaces**: IOT_BEACON value from DigitalPresenceTypeEnum
exact_mappings:
- sosa:Platform
annotations:
enum_equivalent: IOT_BEACON
examples:
- value:
has_or_had_label: Bluetooth Beacon
description: Generic bluetooth beacon
- value:
has_or_had_label: iBeacon
description: Apple iBeacon protocol device
IoTSensor:
is_a: DeviceType
class_uri: hc:IoTSensor
description: |
Environmental or measurement sensor device.
**Use Cases**:
- Climate monitoring (temperature, humidity) for conservation
- Light level sensors for protection of sensitive materials
- Air quality monitoring in storage areas
- Visitor counting
**Replaces**: IOT_SENSOR value from DigitalPresenceTypeEnum
exact_mappings:
- sosa:Sensor
annotations:
enum_equivalent: IOT_SENSOR
examples:
- value:
has_or_had_label: Climate Sensor
description: Temperature and humidity sensor
- value:
has_or_had_label: Light Level Sensor
description: Lux measurement sensor
IoTKiosk:
is_a: DeviceType
class_uri: hc:IoTKiosk
description: |
Interactive information terminal or kiosk device.
**Use Cases**:
- Self-service collection search for visitors
- Wayfinding and orientation
- Ticketing and information display
**Replaces**: IOT_KIOSK value from DigitalPresenceTypeEnum
exact_mappings:
- schema:Kiosk
annotations:
enum_equivalent: IOT_KIOSK
examples:
- value:
has_or_had_label: Information Kiosk
description: Interactive information terminal
- value:
has_or_had_label: Ticketing Kiosk
description: Self-service ticketing terminal
IoTDisplay:
is_a: DeviceType
class_uri: hc:IoTDisplay
description: |
Digital signage or display device.
**Use Cases**:
- Rotating information displays
- Exhibition schedules
- Digital labels for artworks
**Replaces**: IOT_DISPLAY value from DigitalPresenceTypeEnum (if existed)
exact_mappings:
- schema:VisualArtwork
annotations:
enum_equivalent: IOT_DISPLAY
examples:
- value:
has_or_had_label: Digital Signage
description: Digital information display
- value:
has_or_had_label: Interactive Screen
description: Touch-enabled display
IoTActuator:
is_a: DeviceType
class_uri: hc:IoTActuator
description: |
Device that performs actions (e.g., HVAC controls, lighting).
**Use Cases**:
- Climate control (HVAC) for conservation
- Automated lighting systems
- Security systems
exact_mappings:
- sosa:Actuator
annotations:
enum_equivalent: IOT_ACTUATOR
examples:
- value:
has_or_had_label: HVAC Controller
description: Climate control actuator
- value:
has_or_had_label: Lighting Controller
description: Automated lighting system

View file

@ -22,7 +22,8 @@ imports:
- ./Scope # for has_or_had_scope range (2026-01-15)
- ../slots/has_access_application_url
- ../slots/has_or_had_custodian_type
- ../slots/default_access_policy
- ../slots/condition_of_access # was: default_access_policy - migrated per Rule 53 (2026-01-23)
- ./Condition # Range for condition_of_access (note: revision typo said "type: slot")
- ../slots/restriction_category
- ../slots/specificity_annotation
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
@ -44,7 +45,7 @@ classes:
slots:
- has_access_application_url
- has_or_had_custodian_type
- default_access_policy
- condition_of_access # was: default_access_policy - migrated per Rule 53 (2026-01-23)
- hold_or_held_record_set_type
- restriction_category
- specificity_annotation
@ -74,16 +75,26 @@ classes:
slot_usage:
has_or_had_identifier: # was: wikidata_entity - migrated per Rule 53 (2026-01-15)
# equals_string removed: Q112796779 (incompatible with uriorcurie range)
default_access_policy:
range: AccessPolicy
condition_of_access: # was: default_access_policy - migrated per Rule 53 (2026-01-23)
range: Condition
inlined: true
multivalued: true
required: true
description: |
Access conditions that make this a "dim" archive.
MIGRATED from default_access_policy per slot_fixes.yaml (Rule 53).
Uses Condition class for structured representation.
examples:
- value:
policy_id: https://nde.nl/ontology/hc/policy/researcher-only
access_level: RESTRICTED
restriction_reason: Privacy-sensitive personal data
eligible_users: Credentialed academic researchers
access_process: Application and approval required
has_or_had_type: RESEARCHER_ONLY
has_or_had_description:
description_text: "Access restricted to credentialed academic researchers"
description: User-based restriction condition
- value:
has_or_had_type: APPROVAL_REQUIRED
has_or_had_description:
description_text: "Application and approval process required"
description: Process-based restriction condition
restriction_category:
range: string
multivalued: true
@ -137,12 +148,16 @@ classes:
- Dim Archive@en
- Dim Archive@de
has_or_had_description: Archive with limited access # was: type_description - migrated per Rule 53/56 (2026-01-16)
default_access_policy:
policy_id: https://nde.nl/ontology/hc/policy/researcher-access
access_level: RESTRICTED
restriction_reason: Privacy-sensitive personal data (GDPR)
eligible_users: Academic researchers with institutional has_or_had_affiliation
access_process: Submit research proposal and sign access agreement
condition_of_access:
- has_or_had_type: RESEARCHER_ONLY
has_or_had_description:
description_text: "Academic researchers with institutional affiliation"
- has_or_had_type: APPROVAL_REQUIRED
has_or_had_description:
description_text: "Submit research proposal and sign access agreement"
- has_or_had_type: PRIVACY_SENSITIVE
has_or_had_description:
description_text: "Privacy-sensitive personal data (GDPR)"
restriction_category:
- user_based
- process_based

View file

@ -255,36 +255,47 @@ classes:
description: |
Tax scheme(s) applicable to donations to this institution.
Multiple schemes may apply (e.g., ANBI + Cultural ANBI in NL).
# MIGRATED 2026-01-24: deduction_percentage → offers_or_offered.has_or_had_percentage (Rule 53)
examples:
- value:
has_or_had_type: ANBI
has_or_had_label: ANBI
jurisdiction: NL
deduction_percentage: 100
offers_or_offered:
- has_or_had_percentage:
percentage_value: 100
description: Dutch general public benefit institution
- value:
has_or_had_type: CulturalANBI
has_or_had_label: Cultural ANBI (125%)
jurisdiction: NL
deduction_percentage: 125
offers_or_offered:
- has_or_had_percentage:
percentage_value: 125
description: Dutch cultural institution with extra deduction
- value:
has_or_had_type: GiftAid
has_or_had_label: Gift Aid
jurisdiction: UK
deduction_percentage: 100
offers_or_offered:
- has_or_had_percentage:
percentage_value: 100
description: UK Gift Aid scheme
- value:
has_or_had_type: Section501c3
has_or_had_label: 501(c)(3)
jurisdiction: US
deduction_percentage: 100
offers_or_offered:
- has_or_had_percentage:
percentage_value: 100
description: US tax-exempt charitable organization
- value:
has_or_had_type: Gemeinnuetzigkeit
has_or_had_label: Gemeinnützigkeit
jurisdiction: DE
deduction_percentage: 100
offers_or_offered:
- has_or_had_percentage:
percentage_value: 100
description: German charitable status
contact_email:
range: string
@ -347,7 +358,10 @@ classes:
- has_or_had_type: CulturalANBI
has_or_had_label: Cultural ANBI (125%)
jurisdiction: NL
deduction_percentage: 125
# MIGRATED 2026-01-24: deduction_percentage → offers_or_offered (Rule 53)
offers_or_offered:
- has_or_had_percentage:
percentage_value: 125
regulatory_body: Belastingdienst
observed_in: https://nde.nl/ontology/hc/observation/web/2026-01-01/rijksmuseum-support
extraction_confidence: 0.95
@ -377,7 +391,10 @@ classes:
- has_or_had_type: GiftAid
has_or_had_label: Gift Aid
jurisdiction: UK
deduction_percentage: 100
# MIGRATED 2026-01-24: deduction_percentage → offers_or_offered (Rule 53)
offers_or_offered:
- has_or_had_percentage:
percentage_value: 100
regulatory_body: HMRC
observed_in: https://nde.nl/ontology/hc/observation/web/2026-01-01/bl-support
extraction_confidence: 0.98
@ -409,7 +426,10 @@ classes:
- has_or_had_type: GiftAid
has_or_had_label: Gift Aid
jurisdiction: UK
deduction_percentage: 100
# MIGRATED 2026-01-24: deduction_percentage → offers_or_offered (Rule 53)
offers_or_offered:
- has_or_had_percentage:
percentage_value: 100
regulatory_body: HMRC
observed_in: https://nde.nl/ontology/hc/observation/web/2026-01-01/nhm-patrons
extraction_confidence: 0.92
@ -439,7 +459,10 @@ classes:
- has_or_had_type: ANBI
has_or_had_label: ANBI
jurisdiction: NL
deduction_percentage: 100
# MIGRATED 2026-01-24: deduction_percentage → offers_or_offered (Rule 53)
offers_or_offered:
- has_or_had_percentage:
percentage_value: 100
regulatory_body: Belastingdienst
observed_in: https://nde.nl/ontology/hc/observation/web/2026-01-01/iish-support
extraction_confidence: 0.9
@ -469,7 +492,10 @@ classes:
has_or_had_label: ANBI (erfbelasting vrijstelling)
has_or_had_description: ANBI status with inheritance tax exemption
jurisdiction: NL
deduction_percentage: 100
# MIGRATED 2026-01-24: deduction_percentage → offers_or_offered (Rule 53)
offers_or_offered:
- has_or_had_percentage:
percentage_value: 100
regulatory_body: Belastingdienst
contact_email: ontwikkeling@kb.nl
observed_in: https://nde.nl/ontology/hc/observation/web/2026-01-01/kb-support

View file

@ -13,7 +13,9 @@ imports:
- linkml:types
- ../metadata
# activities_societies REMOVED - migrated to has_or_had_membership + has_or_had_activity_type (Rule 53)
- ../slots/degree_name
# MIGRATED 2026-01-24: degree_name → has_or_had_label + Label (Rule 53)
- ../slots/has_or_had_label
- ./Label
- ../slots/education_description
- ../slots/education_end_year
- ../slots/education_start_year
@ -79,7 +81,8 @@ classes:
- schema:Degree
slots:
# activities_societies REMOVED - migrated to has_or_had_membership + has_or_had_activity_type
- degree_name
# MIGRATED 2026-01-24: degree_name → has_or_had_label + Label (Rule 53)
- has_or_had_label
- education_description
- education_end_year
- education_start_year
@ -108,14 +111,25 @@ classes:
pattern: ^https://www\.linkedin\.com/school/[a-z0-9-]+/?$
examples:
- value: https://www.linkedin.com/school/university-of-amsterdam
degree_name:
range: string
# MIGRATED 2026-01-24: degree_name → has_or_had_label + Label (Rule 53)
has_or_had_label:
range: Label
inlined: true
required: false
description: |
Full degree name as displayed on LinkedIn.
MIGRATED from 'degree_name' slot per slot_fixes.yaml (Rule 53).
Uses Label class with has_or_had_text for the degree name.
May include degree type, field, and specialization combined.
examples:
- value: Bachelor of Education - BEd, Elementary Education and Teaching
- value:
has_or_had_text: "Bachelor of Education - BEd, Elementary Education and Teaching"
description: Combined degree type and field
- value: Master of Arts - MA
- value:
has_or_had_text: "Master of Arts - MA"
description: Degree type only
- value: PhD in Museology
- value:
has_or_had_text: "PhD in Museology"
description: Doctoral degree with specialization
field_of_study:
range: string

View file

@ -0,0 +1,82 @@
# EntityReconstruction class
# Represents a reconstructed formal entity derived from observations
#
# Generation date: 2026-01-25
# Rule compliance: 0 (LinkML single source of truth), 53 (migration from derived_from_entity)
id: https://nde.nl/ontology/hc/class/EntityReconstruction
name: entity_reconstruction_class
title: EntityReconstruction Class
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
prov: http://www.w3.org/ns/prov#
crm: http://www.cidoc-crm.org/cidoc-crm/
default_prefix: hc
imports:
- linkml:types
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ./SpecificityAnnotation
- ./TemplateSpecificityScore
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
classes:
EntityReconstruction:
class_uri: prov:Entity
description: |
Abstract base class for reconstructed formal entities derived from observations.
**Purpose**:
EntityReconstruction represents the result of analyzing multiple observations
to reconstruct a formal entity (legal status, name, place).
**Relationship to Observations**:
```
CustodianObservation[]
└── refers_or_referred_to → EntityReconstruction
└── (subtypes: CustodianLegalStatus,
CustodianName,
CustodianPlace)
```
**PROV-O Semantics**:
- `prov:Entity`: Base class for things with provenance
- Links TO observations via inverse (has_derived_observation)
- Links FROM observations via refers_or_referred_to
**Subtypes**:
- CustodianLegalStatus - Reconstructed legal entity
- CustodianName - Reconstructed emic/etic name
- CustodianPlace - Reconstructed place designation
exact_mappings:
- prov:Entity
close_mappings:
- crm:E73_Information_Object
abstract: true
slots:
- specificity_annotation
- has_or_had_score
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Abstract base class for all reconstructed entities.
custodian_types_primary: null
specificity_score: 0.5
specificity_rationale: Mid-level abstraction for entity reconstruction pattern.
comments:
- "MIGRATED: supports derived_from_entity → refers_or_referred_to (Rule 53)"
- "Abstract base for reconstructed formal entities"
- "PROV-O Entity for provenance tracking"
- "Subtypes: CustodianLegalStatus, CustodianName, CustodianPlace"

View file

@ -22,7 +22,9 @@ imports:
- ../slots/has_audit_opinion
- ../slots/has_or_had_audit_status
- ../slots/has_auditor_name
- ../slots/change_in_net_asset
# - ../slots/change_in_net_asset # ARCHIVED 2026-01-24: migrated to specifies_or_specified + NetAsset per Rule 53/56
- ../slots/specifies_or_specified
- ./NetAsset
- ../slots/documents_budget
- ../slots/filing_id
- ../slots/filing_type
@ -123,7 +125,7 @@ classes:
- audit_opinion
- audit_status
- auditor_name
- change_in_net_asset
- specifies_or_specified # was: change_in_net_asset - migrated per Rule 53/56 (2026-01-24)
- documents_budget
- filing_id
- filing_type
@ -220,9 +222,15 @@ classes:
has_or_had_expense: # was: total_expense - migrated per Rule 53 (2026-01-15)
range: decimal
required: false
change_in_net_asset:
range: decimal
specifies_or_specified: # was: change_in_net_asset - migrated per Rule 53/56 (2026-01-24)
description: |
MIGRATED from change_in_net_asset per Rule 53/56 (2026-01-24).
Net asset change specification (surplus/deficit).
= total_revenue - total_expenses
range: NetAsset
required: false
inlined: true
multivalued: true
has_or_had_asset: # was: total_asset - migrated per Rule 53 (2026-01-15)
range: decimal
required: false
@ -364,7 +372,10 @@ classes:
duration_description: "fiscal year 2023"
revenue_category: TOTAL
total_expenses: 75200000.0
change_in_net_assets: 3300000.0
specifies_or_specified: # was: change_in_net_assets
- has_or_had_net_asset: 3300000.0
currency: EUR
fiscal_year: 2023
total_assets: 125000000.0
total_liabilities: 15000000.0
total_net_assets: 110000000.0
@ -420,7 +431,10 @@ classes:
duration_description: "fiscal year July 2022 - June 2023"
revenue_category: TOTAL
total_expenses: 412000000.0
change_in_net_assets: 27000000.0
specifies_or_specified: # was: change_in_net_assets
- has_or_had_net_asset: 27000000.0
currency: USD
fiscal_year: 2022
total_assets: 5200000000.0
total_liabilities: 520000000.0
total_net_assets: 4680000000.0

View file

@ -17,7 +17,9 @@ imports:
- ../slots/identifier_scheme
- ../slots/identifier_value
- ../slots/identifies_custodian
- ../slots/defined_by_standard
# MIGRATED 2026-01-24: defined_by_standard → has_or_had_standard + Standard (Rule 53)
- ../slots/has_or_had_standard
- ./Standard
- ../slots/is_or_was_allocated_by
- ../slots/identifier_format_used
# MIGRATED 2026-01-22: canonical_value → has_or_had_canonical_form + CanonicalForm per slot_fixes.yaml feedback
@ -185,7 +187,7 @@ classes:
**Extended Provenance (v2)**:
The identifier now tracks its full lineage:
- defined_by_standard: Which Standard defines this identifier type (ISIL → ISO 15511)
- has_or_had_standard: Which Standard defines this identifier type (ISIL → ISO 15511)
- allocated_by: Which AllocationAgency assigned this specific identifier
- identifier_format_used: Which format variant is used in identifier_value
- has_or_had_canonical_form: Normalized form (CanonicalForm) for deduplication and matching
@ -217,7 +219,8 @@ classes:
- has_or_had_secondary_label
# MIGRATED 2026-01-22: canonical_value → has_or_had_canonical_form + CanonicalForm
- has_or_had_canonical_form
- defined_by_standard
# MIGRATED 2026-01-24: defined_by_standard → has_or_had_standard + Standard (Rule 53)
- has_or_had_standard
- identifier_format_used
- identifies_custodian
- specificity_annotation
@ -226,8 +229,36 @@ classes:
identifies_custodian:
range: Custodian
required: false
defined_by_standard:
# MIGRATED 2026-01-24: defined_by_standard → has_or_had_standard + Standard (Rule 53)
has_or_had_standard:
range: Standard
required: false
multivalued: false
inlined: false
description: |
The standard (identifier scheme) that defines this identifier.
Links the identifier to its governing standard, providing access to:
- Format specifications
- Registration authority
- Lookup URL template
- Validation rules
**SKOS Alignment:**
skos:inScheme - "Relates a resource to a concept scheme in which it is included"
Here the identifier is treated as a SKOS notation within the scheme (standard).
**Examples:**
- ISIL "NL-AmRMA" → ISIL standard (ISO 15511)
- ISNI "0000 0001 2146 5765" → ISNI standard (ISO 27729)
- Wikidata "Q190804" → Wikidata standard
MIGRATED 2026-01-24: Replaces defined_by_standard per slot_fixes.yaml (Rule 53).
examples:
- value:
id: isil
name: "International Standard Identifier for Libraries"
has_or_had_abbreviation: "ISIL"
description: ISIL identifier standard
is_or_was_allocated_by:
required: false
identifier_format_used:

View file

@ -8,7 +8,8 @@ imports:
- ./ReconstructionActivity
- ./TimeSpan
- ./CustodianPlace
- ../enums/DigitalPresenceTypeEnum
# MIGRATED 2026-01-25: DigitalPresenceTypeEnum → DeviceType class hierarchy (Rule 53)
# - ../enums/DigitalPresenceTypeEnum # REMOVED - replaced by DeviceType hierarchy
- ../slots/has_or_had_api_endpoint
- ./ReconstructedEntity
- ../slots/connectivity_type
@ -20,11 +21,23 @@ imports:
- ../slots/is_or_was_decommissioned_at # was: decommission_date - migrated per Rule 53 (2026-01-23)
- ./Timestamp # Range for is_or_was_decommissioned_at
- ../slots/device_count
- ../slots/device_id
- ../slots/device_manufacturer
- ../slots/device_model
- ../slots/device_name
- ../slots/device_type
# MIGRATED 2026-01-25: device_id → has_or_had_identifier + Identifier (Rule 53)
- ../slots/has_or_had_identifier
- ./Identifier
# MIGRATED 2026-01-25: device_manufacturer → is_or_was_created_by + Manufacturer (Rule 53)
- ../slots/is_or_was_created_by
- ./Manufacturer
# MIGRATED 2026-01-25: device_model → has_or_had_model + Model (Rule 53)
- ../slots/has_or_had_model
- ./Model
# MIGRATED 2026-01-25: device_name → has_or_had_label + Label (Rule 53)
- ../slots/has_or_had_label
- ./Label
# MIGRATED 2026-01-25: device_type → is_or_was_instantiated_by + IoTDevice + DeviceType hierarchy (Rule 53)
- ../slots/is_or_was_instantiated_by
- ./IoTDevice
- ./DeviceType
- ./DeviceTypes
- ../slots/installation_date
- ../slots/installed_at_place
- ../slots/maintenance_schedule
@ -107,11 +120,16 @@ classes:
- has_or_had_output # was: data_format - migrated per Rule 53 (2026-01-22)
- is_or_was_decommissioned_at # was: decommission_date - migrated per Rule 53 (2026-01-23)
- device_count
- device_id
- device_manufacturer
- device_model
- device_name
- device_type
# MIGRATED 2026-01-25: device_id → has_or_had_identifier (Rule 53)
- has_or_had_identifier
# MIGRATED 2026-01-25: device_manufacturer → is_or_was_created_by (Rule 53)
- is_or_was_created_by
# MIGRATED 2026-01-25: device_model → has_or_had_model (Rule 53)
- has_or_had_model
# MIGRATED 2026-01-25: device_name → has_or_had_label (Rule 53)
- has_or_had_label
# MIGRATED 2026-01-25: device_type → is_or_was_instantiated_by (Rule 53)
- is_or_was_instantiated_by
- installation_date
- installed_at_place
- maintenance_schedule
@ -128,42 +146,84 @@ classes:
- is_or_was_derived_from # was: was_derived_from - migrated per Rule 53
- is_or_was_generated_by # was: was_generated_by - migrated per Rule 53
slot_usage:
device_id:
# MIGRATED 2026-01-25: device_id → has_or_had_identifier (Rule 53)
has_or_had_identifier:
description: |
MIGRATED from device_id per slot_fixes.yaml (Rule 53, 2026-01-25).
Unique identifier for this IoT device or device network.
Format: URI following NDE Heritage Custodian ontology conventions.
range: uriorcurie
required: true
identifier: true
examples:
- value: https://nde.nl/ontology/hc/iot/rijksmuseum-beacon-gallery-1
description: Beacon network in Gallery of Honour
device_name:
range: string
# MIGRATED 2026-01-25: device_name → has_or_had_label (Rule 53)
has_or_had_label:
description: |
MIGRATED from device_name per slot_fixes.yaml (Rule 53, 2026-01-25).
Human-readable name of the IoT device or device network.
range: Label
inlined: true
required: true
examples:
- value: Gallery of Honour Beacon Network
- value:
label_value: Gallery of Honour Beacon Network
description: Beacon network name
- value: Depot Climate Monitoring System
- value:
label_value: Depot Climate Monitoring System
description: Sensor network name
device_type:
range: DigitalPresenceTypeEnum
# MIGRATED 2026-01-25: device_type → is_or_was_instantiated_by (Rule 53)
is_or_was_instantiated_by:
description: |
MIGRATED from device_type per slot_fixes.yaml (Rule 53, 2026-01-25).
Type classification of this IoT device using DeviceType hierarchy.
Replaces DigitalPresenceTypeEnum values with class-based types.
range: IoTDevice
inlined: true
required: true
examples:
- value: IOT_BEACON
description: Bluetooth beacon
- value: IOT_SENSOR
description: Environmental sensor
- value: IOT_KIOSK
description: Interactive kiosk
device_model:
range: string
- value:
has_or_had_type:
has_or_had_label: Bluetooth Beacon
description: Beacon device (was IOT_BEACON)
- value:
has_or_had_type:
has_or_had_label: Climate Sensor
description: Sensor device (was IOT_SENSOR)
- value:
has_or_had_type:
has_or_had_label: Information Kiosk
description: Kiosk device (was IOT_KIOSK)
# MIGRATED 2026-01-25: device_model → has_or_had_model (Rule 53)
has_or_had_model:
description: |
MIGRATED from device_model per slot_fixes.yaml (Rule 53, 2026-01-25).
Model designation of the IoT device.
range: Model
inlined: true
required: false
examples:
- value: Estimote Proximity Beacon
- value:
has_or_had_label: Estimote Proximity Beacon
description: Beacon model
device_manufacturer:
range: string
- value:
has_or_had_label: Sensirion SHT45
description: Sensor model
# MIGRATED 2026-01-25: device_manufacturer → is_or_was_created_by (Rule 53)
is_or_was_created_by:
description: |
MIGRATED from device_manufacturer per slot_fixes.yaml (Rule 53, 2026-01-25).
Manufacturer of the IoT device.
range: Manufacturer
inlined: true
required: false
examples:
- value: Estimote
- value:
has_or_had_label: Estimote
description: Beacon manufacturer
- value: Samsung
- value:
has_or_had_label: Samsung
description: Kiosk manufacturer
device_count:
range: integer
@ -329,12 +389,22 @@ classes:
- https://www.w3.org/TR/vocab-sosa/
- https://schema.org/Thing
examples:
# MIGRATED 2026-01-25: device_id → has_or_had_identifier (Rule 53)
# MIGRATED 2026-01-25: device_manufacturer → is_or_was_created_by (Rule 53)
# MIGRATED 2026-01-25: device_model → has_or_had_model (Rule 53)
# MIGRATED 2026-01-25: device_name → has_or_had_label (Rule 53)
# MIGRATED 2026-01-25: device_type → is_or_was_instantiated_by (Rule 53)
- value:
device_id: https://nde.nl/ontology/hc/iot/rijksmuseum-beacon-gallery-honour
device_name: Gallery of Honour Beacon Network
device_type: IOT_BEACON
device_model: Estimote Proximity Beacon
device_manufacturer: Estimote
has_or_had_identifier: https://nde.nl/ontology/hc/iot/rijksmuseum-beacon-gallery-honour
has_or_had_label:
has_or_had_label: Gallery of Honour Beacon Network
is_or_was_instantiated_by:
has_or_had_type:
has_or_had_label: Bluetooth Beacon
has_or_had_model:
has_or_had_label: Estimote Proximity Beacon
is_or_was_created_by:
has_or_had_label: Estimote
device_count: 24
coverage_area: Gallery of Honour (main wing)
purpose: Proximity triggers for mobile app content near masterpieces
@ -348,11 +418,16 @@ classes:
refers_to_custodian: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804
description: Beacon network in Rijksmuseum Gallery of Honour
- value:
device_id: https://nde.nl/ontology/hc/iot/rijksmuseum-climate-monitoring
device_name: Conservation Climate Monitoring System
device_type: IOT_SENSOR
device_model: Sensirion SHT45
device_manufacturer: Sensirion
has_or_had_identifier: https://nde.nl/ontology/hc/iot/rijksmuseum-climate-monitoring
has_or_had_label:
has_or_had_label: Conservation Climate Monitoring System
is_or_was_instantiated_by:
has_or_had_type:
has_or_had_label: Climate Sensor
has_or_had_model:
has_or_had_label: Sensirion SHT45
is_or_was_created_by:
has_or_had_label: Sensirion
device_count: 150
coverage_area: All galleries and storage areas
purpose: Temperature and humidity monitoring for preservation
@ -380,11 +455,16 @@ classes:
refers_to_custodian: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804
description: Climate monitoring sensor network at Rijksmuseum
- value:
device_id: https://nde.nl/ontology/hc/iot/rijksmuseum-entrance-kiosk
device_name: Main Entrance Information Kiosks
device_type: IOT_KIOSK
device_model: Samsung Kiosk 24 Touch
device_manufacturer: Samsung
has_or_had_identifier: https://nde.nl/ontology/hc/iot/rijksmuseum-entrance-kiosk
has_or_had_label:
has_or_had_label: Main Entrance Information Kiosks
is_or_was_instantiated_by:
has_or_had_type:
has_or_had_label: Information Kiosk
has_or_had_model:
has_or_had_label: Samsung Kiosk 24 Touch
is_or_was_created_by:
has_or_had_label: Samsung
device_count: 4
coverage_area: Main entrance lobby
purpose: Self-service collection search and wayfinding for visitors

View file

@ -0,0 +1,94 @@
# IoTDevice class
# Wrapper class linking InternetOfThings to DeviceType hierarchy
#
# Generation date: 2026-01-25
# Rule compliance: 0 (LinkML single source of truth), 53 (migration from device_type)
# Migration source: device_type slot per slot_fixes.yaml
id: https://nde.nl/ontology/hc/class/IoTDevice
name: iot_device_class
title: IoTDevice Class
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
sosa: http://www.w3.org/ns/sosa/
schema: http://schema.org/
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_type
- ../slots/has_or_had_identifier
- ./DeviceType
- ./DeviceTypes
classes:
IoTDevice:
class_uri: sosa:Platform
description: |
Represents an IoT device instance with its type classification.
**MIGRATION SOURCE**: Created from device_type slot migration (Rule 53, 2026-01-25).
**Pattern**: Wraps DeviceType hierarchy for InternetOfThings class.
- IoTDevice contains has_or_had_type → DeviceType (or subclass)
- InternetOfThings uses is_or_was_instantiated_by → IoTDevice
**Structure**:
```
InternetOfThings
└── is_or_was_instantiated_by → IoTDevice
└── has_or_had_type → DeviceType subclass
(IoTBeacon, IoTSensor, etc.)
```
**Ontological Alignment**:
- **Primary**: `sosa:Platform` - SOSA platform hosting sensors
- **Close**: `schema:Product` - Schema.org product
exact_mappings:
- sosa:Platform
close_mappings:
- schema:Product
slots:
- has_or_had_identifier
- has_or_had_type
slot_usage:
has_or_had_identifier:
description: Unique identifier for this IoT device instance.
range: uriorcurie
required: false
has_or_had_type:
description: |
The type classification of this IoT device.
Uses DeviceType hierarchy (IoTBeacon, IoTSensor, IoTKiosk, etc.)
range: DeviceType
required: true
inlined: true
annotations:
custodian_types: '["*"]'
custodian_types_rationale: IoT devices applicable to all custodian types.
custodian_types_primary: null
specificity_score: 0.7
specificity_rationale: Specific to IoT device tracking.
comments:
- "CREATED from device_type migration per slot_fixes.yaml (Rule 53)"
- "Wrapper class linking InternetOfThings to DeviceType hierarchy"
- "Uses has_or_had_type to reference DeviceType subclasses"
examples:
- value:
has_or_had_type:
has_or_had_label: Bluetooth Beacon
description: IoT beacon device
- value:
has_or_had_type:
has_or_had_label: Climate Sensor
description: IoT sensor device

View file

@ -0,0 +1,65 @@
id: https://nde.nl/ontology/hc/class/LabelType
name: label_type_class
title: Label Type Class
description: |
Abstract base class for label type taxonomy.
Follows Rule 0b Type/Types naming pattern.
**USE CASES**:
- Categorizing different kinds of labels (department codes, identifiers, names)
- Distinguishing label purposes (official name, abbreviation, code)
**SUBCLASSES** (in LabelTypes.yaml):
- DepartmentCode: Department identifier codes
- DepartmentName: Department display names
- OfficialName: Legal/official names
- Abbreviation: Short form names
imports:
- linkml:types
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
skos: http://www.w3.org/2004/02/skos/core#
default_prefix: hc
classes:
LabelType:
class_uri: hc:LabelType
abstract: true
description: |
Abstract base class for label type classifications.
Concrete subclasses defined in LabelTypes.yaml.
exact_mappings:
- skos:Concept
slots:
- type_code
- type_name
- type_description
slot_usage:
type_code:
range: string
required: true
description: Short code for the label type
examples:
- value: "DEPT_CODE"
description: Department code type
type_name:
range: string
required: false
description: Human-readable name for the label type
type_description:
range: string
required: false
description: Description of when to use this label type
slots:
type_code:
slot_uri: hc:typeCode
range: string
description: Short code for the type
type_name:
slot_uri: hc:typeName
range: string
description: Human-readable name for the type
type_description:
slot_uri: hc:typeDescription
range: string
description: Description of the type

View file

@ -0,0 +1,43 @@
id: https://nde.nl/ontology/hc/class/LabelTypes
name: label_types_classes
title: Label Types Classes
description: |
Concrete subclasses for LabelType taxonomy.
Follows Rule 0b Type/Types naming pattern.
imports:
- linkml:types
- ./LabelType
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
default_prefix: hc
classes:
DepartmentCodeType:
is_a: LabelType
class_uri: hc:DepartmentCodeType
description: Label type for department identifier codes.
DepartmentNameType:
is_a: LabelType
class_uri: hc:DepartmentNameType
description: Label type for department display names.
OfficialNameType:
is_a: LabelType
class_uri: hc:OfficialNameType
description: Label type for legal/official organization names.
AbbreviationType:
is_a: LabelType
class_uri: hc:AbbreviationType
description: Label type for abbreviations and acronyms.
InternalCodeType:
is_a: LabelType
class_uri: hc:InternalCodeType
description: Label type for internal reference codes.
DisplayNameType:
is_a: LabelType
class_uri: hc:DisplayNameType
description: Label type for public-facing display names.

View file

@ -0,0 +1,79 @@
id: https://nde.nl/ontology/hc/class/Manager
name: manager_class
title: Manager Class
description: |
Represents a person or role responsible for managing an organizational unit.
**USE CASES**:
- Department heads and directors
- Team leads and supervisors
- Project managers
**RELATIONSHIP TO PersonObservation**:
Manager captures the management role, which may link to a PersonObservation
for full biographical details about the person filling the role.
imports:
- linkml:types
- ../slots/has_or_had_name
- ../slots/has_or_had_title
- ../slots/has_or_had_email
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
org: http://www.w3.org/ns/org#
default_prefix: hc
classes:
Manager:
class_uri: hc:Manager
description: |
A person or role responsible for managing an organizational unit.
Captures name, title, and contact information for department heads.
exact_mappings:
- org:Head
close_mappings:
- schema:Person
slots:
- has_or_had_name
- has_or_had_title
- has_or_had_email
- manager_since
- person_reference
slot_usage:
has_or_had_name:
range: string
required: true
description: Name of the manager/department head
examples:
- value: "Dr. Jan de Vries"
description: Department head name
has_or_had_title:
range: string
required: false
description: Job title of the manager
examples:
- value: "Head of Collections"
description: Department head title
- value: "Director of Archives"
description: Senior management title
has_or_had_email:
range: string
required: false
description: Contact email for the manager
manager_since:
range: date
required: false
description: Date when person became manager of this unit
person_reference:
range: uriorcurie
required: false
description: Reference to full PersonObservation record if available
slots:
manager_since:
slot_uri: hc:managerSince
range: date
description: Date when person became manager
person_reference:
slot_uri: hc:personReference
range: uriorcurie
description: Reference to PersonObservation record

View file

@ -0,0 +1,124 @@
# Manufacturer class
# Represents a manufacturer or producer of devices/products
#
# Generation date: 2026-01-25
# Rule compliance: 0 (LinkML single source of truth), 53 (migration from device_manufacturer)
# Migration source: device_manufacturer slot per slot_fixes.yaml
id: https://nde.nl/ontology/hc/class/Manufacturer
name: manufacturer_class
title: Manufacturer Class
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
prov: http://www.w3.org/ns/prov#
schema: http://schema.org/
org: http://www.w3.org/ns/org#
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_label
- ../slots/has_or_had_url
- ../slots/has_or_had_identifier
- ./URL
classes:
Manufacturer:
class_uri: schema:Organization
description: |
Represents a manufacturer or producer of devices, equipment, or products.
**MIGRATION SOURCE**: Created from device_manufacturer slot migration (Rule 53, 2026-01-25).
**Pattern**: Simple string manufacturer name replaced with structured class:
- has_or_had_label: Manufacturer name (String or Label)
- has_or_had_url: Manufacturer website (URL)
- has_or_had_identifier: Unique identifier
**Ontological Alignment**:
- **Primary**: `schema:Organization` - Schema.org organization
- **Close**: `org:Organization` - W3C ORG organization
- **Related**: `prov:Agent` - PROV-O agent responsible for production
**Use Cases**:
- IoT device manufacturers (Estimote, Sensirion, Samsung)
- Equipment vendors
- Technology providers
**Relationship to InternetOfThings**:
```
InternetOfThings
└── is_or_was_created_by → Manufacturer
├── has_or_had_label → "Estimote"
└── has_or_had_url → URL
```
exact_mappings:
- schema:Organization
close_mappings:
- org:Organization
- prov:Agent
slots:
- has_or_had_identifier
- has_or_had_label
- has_or_had_url
slot_usage:
has_or_had_identifier:
description: Unique identifier for this manufacturer.
range: uriorcurie
required: false
examples:
- value: https://nde.nl/ontology/hc/manufacturer/estimote
description: Estimote manufacturer identifier
has_or_had_label:
description: Name of the manufacturer.
range: string
required: true
examples:
- value: Estimote
description: Beacon manufacturer
- value: Sensirion
description: Sensor manufacturer
- value: Samsung
description: Kiosk manufacturer
has_or_had_url:
description: Manufacturer website.
range: URL
inlined: true
required: false
examples:
- value:
url_value: https://estimote.com/
description: Estimote website
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Manufacturers applicable to all custodian types using technology.
custodian_types_primary: null
specificity_score: 0.6
specificity_rationale: Specific to equipment and technology tracking.
comments:
- "CREATED from device_manufacturer migration per slot_fixes.yaml (Rule 53)"
- "Schema.org Organization for manufacturer representation"
- "Enables structured manufacturer data with website and identifier"
examples:
- value:
has_or_had_identifier: https://nde.nl/ontology/hc/manufacturer/estimote
has_or_had_label: Estimote
has_or_had_url:
url_value: https://estimote.com/
description: Estimote beacon manufacturer
- value:
has_or_had_identifier: https://nde.nl/ontology/hc/manufacturer/sensirion
has_or_had_label: Sensirion
has_or_had_url:
url_value: https://sensirion.com/
description: Sensirion sensor manufacturer

View file

@ -0,0 +1,101 @@
# Model class
# Represents a product model or design variant
#
# Generation date: 2026-01-25
# Rule compliance: 0 (LinkML single source of truth), 53 (migration from device_model)
# Migration source: device_model slot per slot_fixes.yaml
id: https://nde.nl/ontology/hc/class/Model
name: model_class
title: Model Class
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_label
- ../slots/has_or_had_identifier
classes:
Model:
class_uri: schema:ProductModel
description: |
Represents a product model or design variant.
**MIGRATION SOURCE**: Created from device_model slot migration (Rule 53, 2026-01-25).
**Pattern**: Simple string model name replaced with structured class:
- has_or_had_label: Model name/designation
- has_or_had_identifier: Model number or SKU
**Ontological Alignment**:
- **Primary**: `schema:ProductModel` - Schema.org product model
**Use Cases**:
- IoT device models (Estimote Proximity Beacon, Sensirion SHT45)
- Equipment model variants
- Hardware versions
**Relationship to InternetOfThings**:
```
InternetOfThings
└── has_or_had_model → Model
├── has_or_had_label → "Estimote Proximity Beacon"
└── has_or_had_identifier → "EPB-v3.0"
```
exact_mappings:
- schema:ProductModel
slots:
- has_or_had_identifier
- has_or_had_label
slot_usage:
has_or_had_identifier:
description: Model number, SKU, or unique identifier for this model.
range: string
required: false
examples:
- value: EPB-v3.0
description: Estimote Proximity Beacon version 3.0
- value: SHT45-AD1B-R2
description: Sensirion sensor model number
has_or_had_label:
description: Name or designation of the model.
range: string
required: true
examples:
- value: Estimote Proximity Beacon
description: Beacon model name
- value: Sensirion SHT45
description: Sensor model name
- value: Samsung Kiosk 24 Touch
description: Kiosk model name
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Product models applicable to all custodian types using equipment.
custodian_types_primary: null
specificity_score: 0.6
specificity_rationale: Specific to equipment and technology tracking.
comments:
- "CREATED from device_model migration per slot_fixes.yaml (Rule 53)"
- "Schema.org ProductModel for model representation"
- "Enables structured model data with name and identifier"
examples:
- value:
has_or_had_identifier: EPB-v3.0
has_or_had_label: Estimote Proximity Beacon
description: Estimote beacon model
- value:
has_or_had_identifier: SHT45-AD1B-R2
has_or_had_label: Sensirion SHT45
description: Sensirion sensor model

View file

@ -0,0 +1,83 @@
# Observation class
# Abstract base class for observational evidence
#
# Generation date: 2026-01-25
# Rule compliance: 0 (LinkML single source of truth), 53 (migration from derived_from_observation)
id: https://nde.nl/ontology/hc/class/Observation
name: observation_class
title: Observation Class
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
prov: http://www.w3.org/ns/prov#
pico: https://personsincontext.org/model#
crm: http://www.cidoc-crm.org/cidoc-crm/
default_prefix: hc
imports:
- linkml:types
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ./SpecificityAnnotation
- ./TemplateSpecificityScore
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
classes:
Observation:
class_uri: pico:Observation
description: |
Abstract base class for observational evidence from sources.
**Purpose**:
Observation is the base class for source-based evidence about entities.
Concrete implementations include:
- CustodianObservation - Evidence about heritage custodians
- PersonObservation - Evidence about people (staff, directors)
- WebObservation - Evidence from web scraping
**PiCo Model Alignment**:
Following the Persons in Context (PiCo) model, observations are
discrete pieces of evidence from specific sources that may be
combined to reconstruct formal entities.
**PROV-O Semantics**:
- `prov:Entity`: Observations are things with provenance
- `is_or_was_based_on`: Links derived entities back to observations
**Relationship to EntityReconstruction**:
```
Observation[] (source evidence)
└── is_or_was_based_on ← EntityReconstruction
(reconstructed formal entity)
```
exact_mappings:
- pico:Observation
- prov:Entity
close_mappings:
- crm:E13_Attribute_Assignment
abstract: true
slots:
- specificity_annotation
- has_or_had_score
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Abstract base class for all observations.
custodian_types_primary: null
specificity_score: 0.4
specificity_rationale: Broad base class for observational evidence.
comments:
- "MIGRATED: supports derived_from_observation → is_or_was_based_on (Rule 53)"
- "Abstract base for observational evidence"
- "PiCo model Observation pattern"
- "Subtypes: CustodianObservation, PersonObservation, WebObservation"

View file

@ -0,0 +1,77 @@
id: https://nde.nl/ontology/hc/class/Price
name: Price
title: Price
description: |
Represents price or pricing information with value, currency, and optional range.
This class supports:
- Exact prices (e.g., €15.00 admission)
- Price ranges (e.g., € to €€€€ for restaurants)
- Price categories (budget, moderate, premium)
Created per slot_fixes.yaml revision for catering_price_range migration (Rule 53/56).
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
gr: http://purl.org/goodrelations/v1#
imports:
- linkml:types
- ../slots/has_or_had_value
- ../slots/has_or_had_currency
- ../slots/has_or_had_type
- ./Currency
- ./PriceRange
default_prefix: hc
classes:
Price:
class_uri: schema:PriceSpecification
description: |
Price information including value, currency, and optional range/category.
For catering and services, price ranges use symbolic notation:
- € (budget): Under €15 per person
- €€ (moderate): €15-30 per person
- €€€ (upscale): €30-60 per person
- €€€€ (luxury): Over €60 per person
slots:
- has_or_had_value
- has_or_had_currency
- has_or_had_type
slot_usage:
has_or_had_value:
description: |
The price value. Can be:
- Numeric (e.g., "15.00")
- Symbolic (e.g., "€€€")
- Descriptive (e.g., "free", "donation suggested")
has_or_had_currency:
description: The currency for this price (e.g., EUR, USD, GBP).
range: Currency
inlined: true
has_or_had_type:
description: Price range classification (budget, moderate, premium, luxury).
range: PriceRange
inlined: true
exact_mappings:
- schema:PriceSpecification
- gr:PriceSpecification
examples:
- value:
has_or_had_value: "€€€€"
has_or_had_type:
has_or_had_name: Luxury
has_or_had_description: Over €60 per person
description: Luxury restaurant price range
- value:
has_or_had_value: "€"
has_or_had_type:
has_or_had_name: Budget
has_or_had_description: Under €15 per person
description: Budget cafe price range
- value:
has_or_had_value: "15.00"
has_or_had_currency:
has_or_had_code: EUR
has_or_had_symbol:
description: Exact admission price

View file

@ -0,0 +1,71 @@
id: https://nde.nl/ontology/hc/class/PriceRange
name: PriceRange
title: Price Range
description: |
Represents a price range or price category classification.
This class provides structured metadata for price level indicators
commonly used for restaurants, cafes, and other hospitality services.
Created per slot_fixes.yaml revision for catering_price_range migration (Rule 53/56).
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
skos: http://www.w3.org/2004/02/skos/core#
imports:
- linkml:types
- ../slots/has_or_had_name
- ../slots/has_or_had_description
- ../slots/has_or_had_symbol
default_prefix: hc
classes:
PriceRange:
class_uri: skos:Concept
description: |
A price range or category classification.
Standard price range categories:
- Budget (€): Under €15 per person
- Moderate (€€): €15-30 per person
- Upscale (€€€): €30-60 per person
- Luxury (€€€€): Over €60 per person
- Free: No charge
- Donation: Suggested donation
slots:
- has_or_had_name
- has_or_had_description
- has_or_had_symbol
slot_usage:
has_or_had_name:
description: Name of this price range (e.g., "Budget", "Luxury").
required: true
has_or_had_symbol:
description: Symbolic representation (e.g., "€", "€€€€").
has_or_had_description:
description: Description of what this price range means.
exact_mappings:
- skos:Concept
close_mappings:
- schema:priceRange
examples:
- value:
has_or_had_name: Budget
has_or_had_symbol:
has_or_had_description: Under €15 per person
description: Budget price range
- value:
has_or_had_name: Moderate
has_or_had_symbol: €€
has_or_had_description: €15-30 per person
description: Moderate price range
- value:
has_or_had_name: Upscale
has_or_had_symbol: €€€
has_or_had_description: €30-60 per person
description: Upscale price range
- value:
has_or_had_name: Luxury
has_or_had_symbol: €€€€
has_or_had_description: Over €60 per person
description: Luxury price range

View file

@ -22,7 +22,9 @@ imports:
- ./TemplateSpecificityTypes
# Slot imports - migrated to RiC-O style (2026-01-16 per Rule 53)
- ../slots/contact_email
- ../slots/deliverable
# MIGRATED 2026-01-24: deliverable → has_or_had_objective + Deliverable (Rule 53)
- ../slots/has_or_had_objective
- ./Deliverable
- ../slots/documentation_url
- ../slots/end_date
- ../slots/funding_amount
@ -92,7 +94,8 @@ classes:
- schema:Grant
slots:
- contact_email
- deliverable
# MIGRATED 2026-01-24: deliverable → has_or_had_objective + Deliverable (Rule 53)
- has_or_had_objective
- documentation_url
- end_date
- funding_amount
@ -209,15 +212,35 @@ classes:
- value: Onboard 50 heritage institutions to NDE infrastructure
- value: Create standardized metadata mappings for 10M records
- value: Develop open source tools for digital preservation
deliverable:
range: string
# MIGRATED 2026-01-24: deliverable → has_or_had_objective + Deliverable (Rule 53)
has_or_had_objective:
description: |
MIGRATED from deliverable per slot_fixes.yaml (Rule 53, 2026-01-24).
Project deliverables as structured Deliverable objects.
Each deliverable captures type, title, URL, and completion status.
range: Deliverable
multivalued: true
inlined: true
inlined_as_list: true
required: false
examples:
- value: Technical implementation guide (published)
- value: Training curriculum for digital preservation
- value: Aggregated dataset of 5M heritage objects
- value: Open source metadata normalization tool
- value:
deliverable_type: "report"
deliverable_title: "Technical implementation guide"
completion_status: "completed"
description: Published technical guide (migrated from deliverable)
- value:
deliverable_type: "dataset"
deliverable_title: "Aggregated dataset of 5M heritage objects"
deliverable_url: "https://doi.org/10.1234/dataset"
completion_status: "completed"
description: Dataset deliverable with DOI
- value:
deliverable_type: "software"
deliverable_title: "Open source metadata normalization tool"
deliverable_url: "https://github.com/nde-project/tool"
completion_status: "completed"
description: Software tool deliverable
organizing_body:
required: true
range: uriorcurie
@ -308,11 +331,20 @@ classes:
- Achieve IIIF compliance for 15 participating organizations
- Publish 2M heritage objects as Linked Open Data
- Train 200 heritage professionals in digital preservation
deliverable:
- Individual implementation roadmaps for each participant
- Technical documentation and best practices guide
- Training curriculum and workshop materials
- Case study reports from participating institutions
# MIGRATED 2026-01-24: deliverable → has_or_had_objective + Deliverable (Rule 53)
has_or_had_objective:
- deliverable_title: "Individual implementation roadmaps for each participant"
deliverable_type: "report"
completion_status: "completed"
- deliverable_title: "Technical documentation and best practices guide"
deliverable_type: "report"
completion_status: "completed"
- deliverable_title: "Training curriculum and workshop materials"
deliverable_type: "training_materials"
completion_status: "completed"
- deliverable_title: "Case study reports from participating institutions"
deliverable_type: "report"
completion_status: "completed"
organizing_body: https://nde.nl/ontology/hc/encompassing-body/network/nde
participating_custodian:
- https://nde.nl/ontology/hc/nl-nh-ams-m-am

View file

@ -0,0 +1,117 @@
id: https://nde.nl/ontology/hc/class/Resolution
name: resolution_class
title: Resolution Class
description: |
Represents resolution or quality specifications for media content.
**USE CASES**:
- Video quality levels (SD, HD, 720p, 1080p, 4K, 8K)
- Image resolution (width x height in pixels)
- Display resolution specifications
**PROPERTIES**:
- resolution_type: Type of resolution (video, image, display)
- resolution_label: Standard label (HD, 4K, etc.)
- width_pixels: Horizontal resolution
- height_pixels: Vertical resolution
- has_or_had_quantity: Structured numeric values
- has_or_had_unit: Unit of measurement (pixels, DPI)
**STANDARD VIDEO RESOLUTIONS**:
| Label | Resolution | Aspect Ratio |
|-------|------------|--------------|
| SD | 640x480 | 4:3 |
| HD (720p) | 1280x720 | 16:9 |
| Full HD (1080p) | 1920x1080 | 16:9 |
| 4K (UHD) | 3840x2160 | 16:9 |
| 8K | 7680x4320 | 16:9 |
imports:
- linkml:types
- ../slots/has_or_had_quantity
- ../slots/has_or_had_unit
- ./Quantity
- ./Unit
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
default_prefix: hc
classes:
Resolution:
class_uri: hc:Resolution
description: |
Resolution or quality specifications for media content.
Captures both quality labels (HD, 4K) and pixel dimensions.
exact_mappings:
- schema:videoQuality
slots:
- resolution_type
- resolution_label
- width_pixels
- height_pixels
- has_or_had_quantity
- has_or_had_unit
slot_usage:
resolution_type:
range: string
required: false
examples:
- value: "video"
description: Video resolution
- value: "image"
description: Image resolution
resolution_label:
range: string
required: false
description: Standard quality label
examples:
- value: "hd"
description: High definition (720p/1080p)
- value: "sd"
description: Standard definition
- value: "4k"
description: 4K Ultra HD
- value: "8k"
description: 8K resolution
width_pixels:
range: integer
required: false
description: Horizontal resolution in pixels
examples:
- value: 1920
description: Full HD width
height_pixels:
range: integer
required: false
description: Vertical resolution in pixels
examples:
- value: 1080
description: Full HD height
has_or_had_quantity:
range: Quantity
inlined: true
multivalued: true
required: false
description: Structured numeric values for resolution
has_or_had_unit:
range: Unit
inlined: true
required: false
description: Unit of measurement (pixels, DPI)
slots:
resolution_type:
slot_uri: hc:resolutionType
range: string
description: Type of resolution (video, image, display)
resolution_label:
slot_uri: hc:resolutionLabel
range: string
description: Standard quality label (SD, HD, 4K, etc.)
width_pixels:
slot_uri: hc:widthPixels
range: integer
description: Horizontal resolution in pixels
height_pixels:
slot_uri: hc:heightPixels
range: integer
description: Vertical resolution in pixels

View file

@ -0,0 +1,87 @@
# Status class
# Generic status representation for various entities
#
# Generation date: 2026-01-23
# Rule compliance: 53 (slot_fixes.yaml)
#
# Created for migrations: default_audio_language, default_language
id: https://nde.nl/ontology/hc/class/Status
name: status_class
title: Status Class
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
prov: http://www.w3.org/ns/prov#
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_type
- ../slots/has_or_had_label
- ../slots/has_or_had_description
- ../slots/is_default
classes:
Status:
class_uri: schema:PropertyValue
description: |
Generic status or state representation for various entities.
**Purpose**:
Provides structured representation of status information,
particularly for indicating default/primary states.
**Use Cases**:
- Default language status (is_default: true)
- Processing status
- Availability status
- Publication status
**Migration Note**:
Created per slot_fixes.yaml revision for default_audio_language
and default_language migrations.
exact_mappings:
- schema:PropertyValue
close_mappings:
- prov:Entity
slots:
- has_or_had_type
- has_or_had_label
- has_or_had_description
- is_default
slot_usage:
has_or_had_type:
description: Type of status (e.g., DEFAULT, PRIMARY, SECONDARY)
range: string
has_or_had_label:
description: Human-readable label for the status
range: string
is_default:
description: Whether this represents a default/primary status
range: boolean
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Generic status applicable to all entity types.
specificity_score: 0.20
specificity_rationale: Very broadly applicable generic class.
examples:
- value:
has_or_had_type: DEFAULT
has_or_had_label: "Default Language"
is_default: true
description: Default language status
- value:
has_or_had_type: SECONDARY
has_or_had_label: "Alternative Audio"
is_default: false
description: Non-default status

View file

@ -15,7 +15,8 @@ imports:
- ../slots/has_or_had_description
- ../slots/has_or_had_identifier
- ../slots/jurisdiction
- ../slots/deduction_percentage
- ../slots/offers_or_offered # was: deduction_percentage - migrated per Rule 53 (2026-01-23)
- ./TaxDeductibility # Range for offers_or_offered
- ../slots/regulatory_body
- ../slots/legal_basis
- ../slots/effective_date
@ -71,7 +72,7 @@ classes:
├── jurisdiction ──→ "NL"
├── deduction_percentage ──→ 125
├── offers_or_offered ──→ TaxDeductibility (with percentage)
├── regulatory_body ──→ "Belastingdienst"
@ -98,7 +99,7 @@ classes:
- has_or_had_description
- has_or_had_identifier
- jurisdiction
- deduction_percentage
- offers_or_offered # was: deduction_percentage - migrated per Rule 53 (2026-01-23)
- regulatory_body
- legal_basis
- effective_date
@ -152,18 +153,30 @@ classes:
description: United States
- value: DE
description: Germany
deduction_percentage:
range: integer
offers_or_offered: # was: deduction_percentage - migrated per Rule 53 (2026-01-23)
range: TaxDeductibility
inlined: true
multivalued: true
description: |
Percentage of donation that is tax-deductible (100 = full deduction).
Tax deductibility offering provided by this scheme.
MIGRATED from deduction_percentage per slot_fixes.yaml (Rule 53).
Uses TaxDeductibility class with has_or_had_percentage for percentage.
Values over 100 indicate enhanced cultural multipliers.
examples:
- value: 100
- value:
has_or_had_type:
has_or_had_label: "Fully Deductible"
has_or_had_percentage:
percentage_value: 100
percentage_display: "100%"
description: Standard 100% deduction
- value: 125
- value:
has_or_had_type:
has_or_had_label: "Enhanced Cultural"
has_or_had_percentage:
percentage_value: 125
percentage_display: "125%"
description: Cultural ANBI 125% enhanced deduction
- value: 66
description: French individual 66% reduction
regulatory_body:
range: string
description: |
@ -213,7 +226,12 @@ classes:
with 125% tax deduction (100% standard + 25% cultural bonus).
has_or_had_identifier: "RSIN 002006066"
jurisdiction: NL
deduction_percentage: 125
offers_or_offered:
- has_or_had_type:
has_or_had_label: "Enhanced Cultural Deductibility"
has_or_had_percentage:
percentage_value: 125
percentage_display: "125%"
regulatory_body: Belastingdienst
legal_basis: Wet inkomstenbelasting 2001, Art. 6.39a
effective_date: "2008-01-01"
@ -226,7 +244,12 @@ classes:
to reclaim 25p for every £1 donated by UK taxpayers.
has_or_had_identifier: "Charity No. 1034686"
jurisdiction: UK
deduction_percentage: 100
offers_or_offered:
- has_or_had_type:
has_or_had_label: "Fully Deductible"
has_or_had_percentage:
percentage_value: 100
percentage_display: "100%"
regulatory_body: HMRC
legal_basis: Finance Act 1990
effective_date: "1990-10-01"
@ -239,7 +262,12 @@ classes:
allowing donors to deduct contributions on federal income taxes.
has_or_had_identifier: "EIN 53-0206027"
jurisdiction: US
deduction_percentage: 100
offers_or_offered:
- has_or_had_type:
has_or_had_label: "Fully Deductible"
has_or_had_percentage:
percentage_value: 100
percentage_display: "100%"
regulatory_body: IRS
legal_basis: Internal Revenue Code Section 501(c)(3)
description: Smithsonian Institution 501(c)(3) status

View file

@ -1,4 +1,13 @@
id: https://nde.nl/ontology/hc/class/TaxSchemeTypes
# TaxSchemeTypes.yaml - Concrete subclasses of TaxSchemeType (Rule 0b)
#
# NOTE (2026-01-24): Class annotations like `deduction_percentage: 125` are METADATA
# about the tax scheme type class, describing its characteristics. For INSTANCE data
# on TaxScheme objects, use `offers_or_offered` slot with TaxDeductibility class
# per slot_fixes.yaml migration (Rule 53).
#
# See: TaxScheme.yaml for slot-level usage with offers_or_offered
name: TaxSchemeTypes
title: Tax Scheme Type Taxonomy
prefixes:

View file

@ -10,8 +10,11 @@ imports:
- ../slots/has_annotation_motivation
- ../slots/has_annotation_segment
- ../slots/has_annotation_type
- ../slots/detection_count
- ../slots/detection_threshold
# MIGRATED 2026-01-25: detection_count, detection_threshold → filters_or_filtered + DetectedEntity + Quantity/DetectionThreshold (Rule 53)
- ../slots/filters_or_filtered
- ./DetectedEntity
- ./DetectionThreshold
- ../slots/has_or_had_treshold
# MIGRATED 2026-01-22: frame_sample_rate → analyzes_or_analyzed + VideoFrame + has_or_had_quantity + Quantity (Rule 53)
- ./VideoFrame
- ../slots/has_or_had_quantity
@ -79,8 +82,8 @@ classes:
- has_annotation_motivation
- has_annotation_segment
- has_annotation_type
- detection_count
- detection_threshold
# MIGRATED 2026-01-25: detection_count, detection_threshold → filters_or_filtered (Rule 53)
- filters_or_filtered
# REMOVED 2026-01-22: frame_sample_rate - migrated to analyzes_or_analyzed + VideoFrame + has_or_had_quantity (Rule 53)
- includes_bounding_box
- includes_segmentation_mask
@ -105,21 +108,43 @@ classes:
examples:
- value: '[{start_seconds: 30.0, end_seconds: 35.0, segment_text: ''Night Watch painting visible''}]'
description: Object detection segment
detection_threshold:
range: float
# DEPRECATED 2026-01-25: detection_threshold, detection_count → filters_or_filtered + DetectedEntity (Rule 53)
# Old: detection_threshold: 0.5, detection_count: 342
# New: filters_or_filtered with DetectedEntity containing Quantity and DetectionThreshold
filters_or_filtered:
description: |
MIGRATED 2026-01-25: Replaces detection_count and detection_threshold slots.
Links to DetectedEntity which contains:
- has_or_had_quantity → Quantity (for detection_count)
- has_or_had_treshold → DetectionThreshold (for detection_threshold)
**Migration Pattern**:
- Old: detection_count: 342, detection_threshold: 0.5
- New: filters_or_filtered → DetectedEntity with structured data
range: DetectedEntity
inlined: true
required: false
minimum_value: 0.0
maximum_value: 1.0
examples:
- value: 0.5
description: Standard detection threshold
detection_count:
range: integer
required: false
minimum_value: 0
examples:
- value: 342
description: 342 total detections found
- value:
has_or_had_quantity:
quantity_value: 342
has_or_had_unit:
unit_value: "detections"
has_or_had_treshold:
threshold_value: 0.5
threshold_type: MINIMUM
description: "342 detections at 0.5 confidence threshold"
- value:
has_or_had_quantity:
quantity_value: 89
has_or_had_unit:
unit_value: "detections"
has_or_had_treshold:
threshold_value: 0.9
threshold_type: MINIMUM
has_or_had_label: "High Precision"
description: "89 high-confidence detections"
# MIGRATED 2026-01-22: frame_sample_rate → analyzes_or_analyzed + VideoFrame + has_or_had_quantity (Rule 53)
# frame_sample_rate:
# range: float

View file

@ -15,7 +15,13 @@ imports:
- ../slots/has_or_had_detected_logo
- ../slots/has_or_had_detected_object
- ../slots/has_or_had_quantity
- ../slots/detection_level
# MIGRATED 2026-01-25: detection_level → filters_or_filtered + has_or_had_type + DetectionLevelType (Rule 53)
- ../slots/filters_or_filtered
- ./DetectedEntity
- ../slots/has_or_had_type
- ./DetectionLevelType
- ./DetectionLevelTypes
- ../slots/includes_or_included
- ../slots/dissolve_count
- ../slots/face_bbox
- ../slots/face_confidence
@ -197,7 +203,8 @@ classes:
slots:
- has_average_scene_duration_seconds
- has_or_had_quantity # was: cut_count - migrated per Rule 53 (2026-01-22)
- detection_level
# MIGRATED 2026-01-25: detection_level → filters_or_filtered + DetectionLevelType (Rule 53)
- filters_or_filtered
- dissolve_count
- fade_count
- scene_count
@ -229,12 +236,33 @@ classes:
examples:
- value: 8.5
description: Average scene is 8.5 seconds
detection_level:
range: DetectionLevelEnum
# DEPRECATED 2026-01-25: detection_level → filters_or_filtered + DetectedEntity + DetectionLevelType (Rule 53)
# Old: detection_level: SCENE
# New: filters_or_filtered with has_or_had_type → DetectionLevelType
filters_or_filtered:
description: |
MIGRATED 2026-01-25: Replaces detection_level slot.
Links to DetectedEntity which contains:
- has_or_had_type → DetectionLevelType (SCENE, SHOT, etc.)
**Migration Pattern**:
- Old: detection_level: SCENE
- New: filters_or_filtered → DetectedEntity with has_or_had_type
range: DetectedEntity
inlined: true
required: true
examples:
- value: SCENE
- value:
has_or_had_type:
has_or_had_code: SCENE
has_or_had_label: "Scene Level Detection"
description: Semantic scene detection
- value:
has_or_had_type:
has_or_had_code: SHOT
has_or_had_label: "Shot Level Detection"
description: Technical shot boundary detection
scene_types_detected:
range: SceneTypeEnum
multivalued: true

View file

@ -38,8 +38,11 @@ imports:
- ../slots/was_fetched_at
- ../slots/is_or_was_part_of_total
- ./SourceCommentCount
- ../slots/default_audio_language
- ../slots/default_language
# MIGRATED 2026-01-23: default_audio_language, default_language → has_or_had_language + Language + has_or_had_status + Status
- ../slots/has_or_had_language
- ./Language
- ../slots/has_or_had_status
- ./Status
- ../slots/dislike_count
- ../slots/duration
- ../slots/favorite_count
@ -70,7 +73,9 @@ imports:
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ../slots/definition
# MIGRATED 2026-01-24: definition → has_or_had_resolution + Resolution (Rule 53)
- ../slots/has_or_had_resolution
- ./Resolution
- ../slots/has_available_caption_language
- ../enums/VideoDefinitionEnum
- ../enums/LiveBroadcastStatusEnum
@ -231,9 +236,11 @@ classes:
# REMOVED 2026-01-22: comments_fetched - migrated to was_fetched_at + is_or_was_part_of_total + SourceCommentCount (Rule 53)
- was_fetched_at
- is_or_was_part_of_total
- default_audio_language
- default_language
- definition
# MIGRATED 2026-01-23: default_audio_language, default_language → has_or_had_language + has_or_had_status (Rule 53)
- has_or_had_language
- has_or_had_status
# MIGRATED 2026-01-24: definition → has_or_had_resolution + Resolution (Rule 53)
- has_or_had_resolution
- dislike_count
- duration
- favorite_count
@ -261,12 +268,30 @@ classes:
description: 10 minutes and 59 seconds
- value: PT1H30M
description: 1 hour 30 minutes
definition:
range: VideoDefinitionEnum
# MIGRATED 2026-01-24: definition → has_or_had_resolution + Resolution (Rule 53)
has_or_had_resolution:
range: Resolution
required: false
inlined: true
description: |
Video resolution/quality information.
MIGRATED from 'definition' slot per slot_fixes.yaml (Rule 53).
Uses Resolution class with resolution_class, width, height.
examples:
- value: hd
description: High definition (720p/1080p)
- value:
resolution_class: hd
width: 1920
height: 1080
aspect_ratio: "16:9"
description: Full HD 1080p video
- value:
resolution_class: "4k"
width: 3840
height: 2160
description: 4K UHD video
- value:
resolution_class: sd
description: Standard definition (simple enum for backward compatibility)
has_aspect_ratio:
range: string
required: false
@ -308,18 +333,54 @@ classes:
is_available: false
language: null
description: No captions available (migrated from caption_available false)
default_language:
range: string
# MIGRATED 2026-01-23: default_language, default_audio_language → has_or_had_language + Language + has_or_had_status + Status (Rule 53)
has_or_had_language:
description: |
MIGRATED from default_language and default_audio_language per slot_fixes.yaml (Rule 53, 2026-01-23).
Language information for video content using structured Language class.
Use has_or_had_status to distinguish default/primary languages.
**MODELING PATTERN**:
- For content language: Language with is_primary: true or has_or_had_status: "content_language"
- For audio language: Language with has_or_had_status: "audio_language"
- Multiple languages supported via multivalued slot
range: Language
inlined: true
multivalued: true
required: false
examples:
- value: nl
description: Dutch language content
default_audio_language:
range: string
- value:
language_code: "nl"
language_name: "Dutch"
is_primary: true
description: Dutch as primary content language (migrated from default_language)
- value:
language_code: "nl"
language_name: "Dutch"
description: Dutch audio track (migrated from default_audio_language)
- value:
language_code: "en"
language_name: "English"
is_primary: false
description: English as secondary/subtitle language
has_or_had_status:
description: |
MIGRATED 2026-01-23 to support default_language, default_audio_language distinction.
Status tracking for language designations (primary, default, audio, content).
Uses Status class for structured status representation.
range: Status
inlined: true
multivalued: true
required: false
examples:
- value: nl
description: Dutch audio track
- value:
status_type: "default_content_language"
status_value: "nl"
description: Default content language is Dutch
- value:
status_type: "default_audio_language"
status_value: "nl"
description: Default audio language is Dutch
has_available_caption_language:
range: string
multivalued: true

View file

@ -6,7 +6,11 @@ imports:
- ./VideoTranscript
- ./VideoTimeSegment
- ../slots/has_average_entry_duration_seconds
- ../slots/default_position
# MIGRATED 2026-01-24: default_position → has_or_had_caption + Caption + has_or_had_alignment + Alignment (Rule 53)
- ../slots/has_or_had_caption
- ./Caption
- ../slots/has_or_had_alignment
- ./Alignment
- ../slots/entry_count
- ../slots/includes_music_description
- ../slots/includes_sound_description
@ -235,7 +239,9 @@ classes:
- schema:transcript
slots:
- has_average_entry_duration_seconds
- default_position
# MIGRATED 2026-01-24: default_position → has_or_had_caption + has_or_had_alignment (Rule 53)
- has_or_had_caption
- has_or_had_alignment
- entry_count
- includes_music_description
- includes_sound_description
@ -343,13 +349,41 @@ classes:
examples:
- value: '{"platform": "YouTube", "has_or_had_code": "en.3OWxR1w4QfE"}'
description: YouTube caption track identifier
default_position:
range: SubtitlePositionEnum
# MIGRATED 2026-01-24: default_position → has_or_had_caption + Caption + has_or_had_alignment + Alignment (Rule 53)
has_or_had_caption:
description: |
MIGRATED from default_position per slot_fixes.yaml (Rule 53, 2026-01-24).
Caption configuration for this subtitle track.
Uses Caption class with has_or_had_alignment for positioning.
range: Caption
inlined: true
required: false
ifabsent: string(BOTTOM)
examples:
- value: BOTTOM
description: Standard bottom caption position
- value:
is_available: true
caption_format: VTT
description: VTT caption available
has_or_had_alignment:
description: |
MIGRATED from default_position per slot_fixes.yaml (Rule 53, 2026-01-24).
Default positioning for subtitle display on screen.
Uses Alignment class for structured representation.
range: Alignment
inlined: true
required: false
examples:
- value:
vertical_alignment: "bottom"
horizontal_alignment: "center"
description: Standard bottom-center caption position (default)
- value:
vertical_alignment: "top"
horizontal_alignment: "center"
description: Top-center position for dual subtitle scenarios
- value:
vertical_alignment: "bottom"
horizontal_alignment: "left"
description: Bottom-left positioning
entry_count:
range: integer
required: false

View file

@ -16,7 +16,9 @@ prefixes:
imports:
- linkml:types
# ADDED 2026-01-24: for default_language migration (Rule 53)
- ../slots/has_or_had_language
- ./Language
default_range: string
@ -59,8 +61,11 @@ classes:
has_iso_3166_1_alpha_2_code:
range: string
description: ISO 3166-1 alpha-2 country code (2-letter, e.g., NL, US, JP)
default_language:
range: string
# MIGRATED 2026-01-24: default_language → has_or_had_language + Language (Rule 53)
has_or_had_language:
range: Language
inlined: true
description: Default language for the channel content.
thumbnail_url:
range: uri
banner_url:

View file

@ -21,6 +21,9 @@ imports:
- ./Timestamp # for comments_fetched migration per Rule 53 (2026-01-22)
- ./YoutubeComment
- ./YoutubeTranscript
# ADDED 2026-01-24: for default_audio_language, default_language migration (Rule 53)
- ../slots/has_or_had_language
- ./Language
default_range: string
classes:
@ -75,9 +78,13 @@ classes:
description: ISO 8601 duration format
thumbnail_url:
range: uri
definition:
range: string
description: Video quality (hd, sd)
# MIGRATED 2026-01-24: definition → has_or_had_resolution + Resolution (Rule 53)
has_or_had_resolution:
range: Resolution
inlined: true
description: |
Video resolution/quality. MIGRATED from 'definition' slot per Rule 53.
Uses Resolution class with resolution_class (hd, sd, 4k, 8k), width, height.
caption_available:
range: boolean
description: Whether captions are available
@ -89,12 +96,16 @@ classes:
description: |
Video tags - migrated from string tag attribute to structured Tag class.
Enables rich tag metadata including platform, hashtag flags, multilingual labels.
default_language:
range: string
description: Default language code
default_audio_language:
range: string
description: Default audio language code
# MIGRATED 2026-01-24: default_language, default_audio_language → has_or_had_language (Rule 53)
# Use Language class with language_code and is_primary/language_purpose to distinguish
has_or_had_language:
range: Language
inlined: true
multivalued: true
description: |
Language information for video content.
MIGRATED from default_language and default_audio_language per Rule 53.
Use language_purpose to distinguish content vs audio language.
category_id:
range: string
description: YouTube category ID

View file

@ -0,0 +1,99 @@
# filters_or_filtered slot
# Generic slot for linking analysis contexts to entities filtered by detection thresholds
#
# Following RiC-O naming convention (Rule 39): "filtersOrFiltered" pattern
# for active/passive temporal relationships.
#
# Created: 2026-01-25
# Rule compliance: 38 (slot centralization + semantic URI), 39 (RiC-O naming), 42 (no prefix), 53 (slot_fixes.yaml)
# Migration: detection_count, detection_level, detection_threshold → filters_or_filtered
id: https://nde.nl/ontology/hc/slot/filters_or_filtered
name: filters_or_filtered_slot
title: Filters Or Filtered Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
prov: http://www.w3.org/ns/prov#
schema: http://schema.org/
dqv: http://www.w3.org/ns/dqv#
default_prefix: hc
imports:
- linkml:types
slots:
filters_or_filtered:
slot_uri: dqv:computedOn
description: |
Links detection/analysis contexts to entities that were filtered by thresholds.
**Temporal Semantics** (RiC-O Pattern):
The "filtersOrFiltered" naming follows RiC-O convention indicating this relationship
may be historical - filter settings may change over time affecting detected entities.
**Ontological Alignment**:
- **Primary** (`slot_uri`): `dqv:computedOn` - DQV predicate for quality metrics
computed on a specific dataset
- **Related**: `prov:wasGeneratedBy` - provenance of filtered results
**Usage**:
For annotation classes with detection thresholds and counts, this links the
analysis context to DetectedEntity instances that passed filtering criteria.
**Pattern**:
```
VideoAnnotation
└── filters_or_filtered → DetectedEntity
├── has_or_had_quantity → Quantity (detection_count)
└── has_or_had_type → DetectionLevelType
```
**Migrated Slots** (per slot_fixes.yaml):
- `detection_count` → filters_or_filtered + DetectedEntity + Quantity
- `detection_level` → filters_or_filtered + DetectedEntity + DetectionLevelType
- `detection_threshold` → filters_or_filtered + DetectedEntity + DetectionThreshold
**Cardinality**:
Single-valued - links to a detection context (DetectedEntity) with aggregated info.
range: string
required: false
multivalued: false
inlined: true
exact_mappings:
- dqv:computedOn
related_mappings:
- prov:wasGeneratedBy
- schema:object
annotations:
rico_naming_convention: |
Follows RiC-O "filtersOrFiltered" pattern for active/passive predicates.
See Rule 39: Slot Naming Convention (RiC-O Style)
replaces_slots: "detection_count, detection_level, detection_threshold"
migration_date: "2026-01-25"
comments:
- "Generic filtering slot for detection/analysis thresholds"
- "Links analysis to DetectedEntity with aggregated detection info"
- "DetectedEntity contains quantity, type, and threshold data"
- "Replaces multiple detection_* slots per Rule 53"
- "RiC-O naming: filtersOrFiltered indicates filtering relationship"
examples:
- value:
has_or_had_quantity:
quantity_value: 342
has_or_had_unit:
unit_value: "detections"
description: "Detection context with 342 detected entities"
- value:
has_or_had_type: "DetectionLevelType:HIGH"
has_or_had_quantity:
quantity_value: 0.85
description: "High confidence detection level"

View file

@ -0,0 +1,26 @@
id: https://nde.nl/ontology/hc/slot/has_or_had_alignment
name: has_or_had_alignment
title: Has or Had Alignment
description: |
Alignment or positioning information for content elements.
Follows RiC-O temporal naming convention (Rule 39).
**USE CASES**:
- Caption/subtitle positioning (top, bottom, center)
- Text alignment (left, right, center, justify)
- Visual element positioning in layouts
**MODELING**:
Uses Alignment class for structured representation including:
- Horizontal alignment (left, center, right)
- Vertical alignment (top, middle, bottom)
- Custom positioning coordinates
slot_uri: hc:hasOrHadAlignment
range: Alignment
multivalued: false
inlined: true
annotations:
specificity_score: 0.55
specificity_rationale: "Applies to various content types requiring positioning information"
custodian_types: ["*"]
custodian_types_rationale: "Content alignment applies across all heritage institution types"

View file

@ -3,7 +3,8 @@
#
# Created per slot_fixes.yaml revision for: commercial_operation
# Migration date: 2026-01-22
# Rule reference: Rule 53, Rule 39
# Updated: 2026-01-24 - Broadened range for deliverable migration (Rule 55)
# Rule reference: Rule 53, Rule 39, Rule 55
id: https://nde.nl/ontology/hc/slot/has_or_had_objective
name: has_or_had_objective
@ -14,6 +15,7 @@ prefixes:
schema: http://schema.org/
org: http://www.w3.org/ns/org#
skos: http://www.w3.org/2004/02/skos/core#
prov: http://www.w3.org/ns/prov#
imports:
- linkml:types
@ -24,17 +26,25 @@ slots:
has_or_had_objective:
slot_uri: org:purpose
description: |
The objective or purpose of an organization's operations.
The objective, purpose, or deliverable of an organization or activity.
**PURPOSE**:
Links an organization to its operational objectives (profit-making,
nonprofit, educational, cultural preservation, etc.).
Links an entity to its operational objectives or deliverable outputs:
- Organizational purpose (profit-making, nonprofit, educational)
- Project deliverables (reports, datasets, websites)
- Activity outcomes
**RiC-O NAMING** (Rule 39):
Uses "has_or_had_" prefix indicating temporal relationship -
the objective may change over time.
objectives and deliverables may change over time.
**RANGE BROADENING (Rule 55)**:
Base range is uriorcurie to allow class-specific narrowing:
- Use Profit range for organizational purpose (commercial_operation migration)
- Use Deliverable range for project outputs (deliverable migration)
**ONTOLOGY ALIGNMENT**:
@ -42,38 +52,42 @@ slots:
|----------|----------|-------|
| **W3C Org** | `org:purpose` | Organizational purpose |
| **Schema.org** | `schema:businessFunction` | Business function |
| **SKOS** | `skos:scopeNote` | Scope description |
| **PROV-O** | `prov:generated` | Activity outputs |
**MIGRATION NOTE**:
**MIGRATION NOTES**:
Created from migration of `commercial_operation` slot per slot_fixes.yaml.
Replaces boolean with structured Profit class for richer modeling.
- 2026-01-22: Created from commercial_operation → Profit migration
- 2026-01-24: Broadened for deliverable → Deliverable migration (Rule 55)
range: Profit
range: uriorcurie
inlined: true
multivalued: true
exact_mappings:
- org:purpose
close_mappings:
- schema:businessFunction
- prov:generated
examples:
- value:
objective_type: "for-profit"
is_commercial: true
description: Commercial gallery selling artworks
description: Commercial gallery selling artworks (Profit range)
- value:
objective_type: "nonprofit"
is_commercial: false
description: Kunsthalle or non-profit exhibition space
has_or_had_label:
has_or_had_text: "Digitized Collection"
deliverable_type: "dataset"
description: Project deliverable output (Deliverable range)
comments:
- Created 2026-01-22 from commercial_operation migration (Rule 53)
- Updated 2026-01-24 for deliverable migration with broadened range (Rule 55)
- Uses RiC-O temporal naming convention (Rule 39)
- Links organization to operational objectives
annotations:
custodian_types: '["*"]'
custodian_types_rationale: >-
Universal - any custodian type may have operational objectives.
Universal - any custodian type may have operational objectives or deliverables.

View file

@ -0,0 +1,36 @@
id: https://nde.nl/ontology/hc/slot/has_or_had_price
name: has_or_had_price_slot
title: Has or Had Price Slot
description: |
Slot file for has_or_had_price following Rule 53 (slot_fixes.yaml).
Links an entity to its price or pricing information.
Created per slot_fixes.yaml revision for catering_price_range migration.
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
imports:
- linkml:types
default_prefix: hc
slots:
has_or_had_price:
slot_uri: schema:priceSpecification
description: |
Price or pricing information associated with an entity.
Follows RiC-O temporal naming convention (Rule 39) to indicate the
relationship may be current or historical.
Can represent:
- Exact prices (admission fees, ticket prices)
- Price ranges (€ to €€€€)
- Price categories (budget, moderate, premium)
range: uriorcurie
multivalued: true
required: false
exact_mappings:
- schema:priceSpecification
close_mappings:
- schema:price
- schema:priceRange

View file

@ -0,0 +1,28 @@
id: https://nde.nl/ontology/hc/slot/has_or_had_resolution
name: has_or_had_resolution
title: Has or Had Resolution
description: |
Resolution or quality level for media content.
Follows RiC-O temporal naming convention (Rule 39).
**USE CASES**:
- Video resolution (SD, HD, 4K, 8K)
- Image resolution (pixels, DPI)
- Display resolution specifications
**MODELING**:
Uses Resolution class for structured representation including:
- Resolution type (video, image, display)
- Width and height in pixels
- Quality level designation (SD, HD, 4K, 8K)
slot_uri: hc:hasOrHadResolution
range: Resolution
multivalued: false
inlined: true
exact_mappings:
- schema:videoQuality
annotations:
specificity_score: 0.60
specificity_rationale: "Applies to video and image content requiring resolution metadata"
custodian_types: ["*"]
custodian_types_rationale: "Digital content with resolution applies across all heritage institution types"

View file

@ -2,6 +2,7 @@
#
# Created per slot_fixes.yaml migration for: typical_metadata_standard
# Creation date: 2026-01-14
# Updated: 2026-01-24 - Broadened range to uriorcurie per Rule 55 for defined_by_standard migration
id: https://nde.nl/ontology/hc/slot/has_or_had_standard
name: has_or_had_standard
@ -16,7 +17,6 @@ default_prefix: hc
imports:
- linkml:types
- ../classes/MetadataStandard
slots:
has_or_had_standard:
@ -26,18 +26,32 @@ slots:
**USAGE**:
Used for:
- Metadata standards (Dublin Core, MARC21, EAD)
- Metadata standards (Dublin Core, MARC21, EAD) - use MetadataStandard range
- Identifier standards (ISIL, ISNI, VIAF) - use Standard range
- Technical standards
- Process standards
range: MetadataStandard
**RANGE BROADENING (Rule 55)**:
Base range is uriorcurie to allow class-specific narrowing in slot_usage.
Classes should narrow to MetadataStandard, Standard, or other subclasses as appropriate.
MIGRATED 2026-01-24: Now also replaces defined_by_standard for Identifier classes.
range: uriorcurie
multivalued: true
exact_mappings:
- dct:conformsTo
broad_mappings:
- skos:inScheme
examples:
- value:
standard_name: "Dublin Core"
standard_uri: "http://purl.org/dc/elements/1.1/"
description: Dublin Core metadata standard
description: Dublin Core metadata standard (MetadataStandard range)
- value:
id: isil
name: "International Standard Identifier for Libraries"
has_or_had_abbreviation: "ISIL"
description: ISIL identifier standard (Standard range)

View file

@ -0,0 +1,99 @@
# has_or_had_treshold slot
# Generic slot for linking entities to threshold values
#
# NOTE: Intentional spelling "treshold" (not "threshold") to match slot_fixes.yaml specification.
# Per Rule 57, revision specifications are immutable.
#
# Following RiC-O naming convention (Rule 39): "hasOrHad..." pattern
# for temporal relationships.
#
# Created: 2026-01-25
# Rule compliance: 38 (slot centralization + semantic URI), 39 (RiC-O naming), 42 (no prefix), 53 (slot_fixes.yaml), 57 (immutable revision)
# Migration: detection_threshold → filters_or_filtered + has_or_had_treshold + DetectionThreshold
id: https://nde.nl/ontology/hc/slot/has_or_had_treshold
name: has_or_had_treshold_slot
title: Has Or Had Treshold Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
dqv: http://www.w3.org/ns/dqv#
schema: http://schema.org/
default_prefix: hc
imports:
- linkml:types
slots:
has_or_had_treshold:
slot_uri: dqv:value
description: |
Links detection contexts to threshold configuration values.
**SPELLING NOTE**: Uses "treshold" (not "threshold") to match slot_fixes.yaml
specification. Per Rule 57, revision specifications are immutable.
**Temporal Semantics** (RiC-O Pattern):
The "hasOrHad" naming follows RiC-O convention indicating this relationship
may be historical - threshold values may change across different analysis runs.
**Ontological Alignment**:
- **Primary** (`slot_uri`): `dqv:value` - DQV predicate for quality metric values
- **Related**: `schema:minValue`/`schema:maxValue` - threshold bounds
**Usage**:
For detection/filtering contexts where a confidence threshold determines
which entities are included in results.
**Pattern**:
```
DetectedEntity
└── has_or_had_treshold → DetectionThreshold
├── threshold_value: 0.5 # minimum confidence
└── threshold_type: MINIMUM
```
**Migrated From** (per slot_fixes.yaml):
- `detection_threshold` (float) → has_or_had_treshold + DetectionThreshold (class)
**Cardinality**:
Single-valued - one threshold configuration per detection context.
range: string
required: false
multivalued: false
inlined: true
exact_mappings:
- dqv:value
related_mappings:
- schema:minValue
- schema:maxValue
annotations:
rico_naming_convention: |
Follows RiC-O "hasOrHad" pattern for temporal predicates.
See Rule 39: Slot Naming Convention (RiC-O Style)
spelling_note: "Intentional 'treshold' spelling to match slot_fixes.yaml (Rule 57 immutability)"
replaces_slots: "detection_threshold"
migration_date: "2026-01-25"
comments:
- "Generic threshold slot for detection/filtering configurations"
- "Links detection contexts to threshold values"
- "Uses DetectionThreshold class for structured threshold data"
- "Spelling 'treshold' matches slot_fixes.yaml per Rule 57"
- "RiC-O naming: hasOrHad indicates potentially historical relationship"
examples:
- value:
threshold_value: 0.5
threshold_type: MINIMUM
description: "Minimum confidence threshold of 0.5"
- value:
threshold_value: 0.9
threshold_type: HIGH_PRECISION
description: "High precision threshold for production display"

View file

@ -0,0 +1,76 @@
# is_or_was_created_by slot
# Links entity to its creator/manufacturer
#
# Following RiC-O naming convention (Rule 39): "isOrWas..." pattern
# for temporal relationships in heritage domain.
#
# Generation date: 2026-01-25
# Rule compliance: 38 (slot centralization + semantic URI), 39 (RiC-O naming), 42 (no prefix)
# Migration source: device_manufacturer slot per slot_fixes.yaml
id: https://nde.nl/ontology/hc/slot/is_or_was_created_by
name: is_or_was_created_by_slot
title: Is Or Was Created By Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
prov: http://www.w3.org/ns/prov#
schema: http://schema.org/
crm: http://www.cidoc-crm.org/cidoc-crm/
default_prefix: hc
imports:
- linkml:types
slots:
is_or_was_created_by:
slot_uri: prov:wasAttributedTo
description: |
Links an entity to its creator, manufacturer, or producer.
**Temporal Semantics** (RiC-O Pattern):
The "isOrWas" naming follows RiC-O convention indicating this relationship
may be historical - manufacturers change names, merge, or go out of business.
**Ontological Alignment**:
- **Primary** (`slot_uri`): `prov:wasAttributedTo` - PROV-O agent attribution
- **Close**: `schema:manufacturer` - Schema.org manufacturer
- **Close**: `crm:P108_was_produced_by` - CIDOC-CRM production relationship
**Usage**:
Use with Manufacturer class for structured manufacturer information.
Range is uriorcurie to allow both class instances and URI references.
**Replaces**: device_manufacturer slot per slot_fixes.yaml migration (2026-01-25)
range: uriorcurie # Range broadened per Rule 55 - allows Manufacturer class instances
required: false
multivalued: false
exact_mappings:
- prov:wasAttributedTo
close_mappings:
- schema:manufacturer
- crm:P108_was_produced_by
annotations:
rico_naming_convention: |
Follows RiC-O "isOrWas" pattern for temporal predicates.
See Rule 39: Slot Naming Convention (RiC-O Style)
replaces_slots: "device_manufacturer"
migration_date: "2026-01-25"
comments:
- "Links products/devices to their manufacturer"
- "Use Manufacturer class for structured manufacturer data"
- "RiC-O naming: isOrWas indicates potentially historical relationship"
- "PROV-O wasAttributedTo for provenance chain tracking"
examples:
- value: https://nde.nl/ontology/hc/manufacturer/estimote
description: "Reference to Estimote as device manufacturer"
- value: https://nde.nl/ontology/hc/manufacturer/sensirion
description: "Reference to Sensirion as sensor manufacturer"

View file

@ -0,0 +1,70 @@
# is_or_was_deployed_at slot
# Links software/system to deployment events
#
# Generation date: 2026-01-25
# Rule compliance: 38 (slot centralization), 39 (RiC-O naming), 53 (migration from deployment_date)
id: https://nde.nl/ontology/hc/slot/is_or_was_deployed_at
name: is_or_was_deployed_at_slot
title: Is Or Was Deployed At Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
prov: http://www.w3.org/ns/prov#
schema: http://schema.org/
default_prefix: hc
imports:
- linkml:types
slots:
is_or_was_deployed_at:
slot_uri: prov:wasGeneratedBy
description: |
Links a system (CMS, software) to its deployment event(s).
**Temporal Semantics** (RiC-O Pattern):
The "isOrWas" naming follows RiC-O convention indicating this relationship
may be historical - a system may have been deployed multiple times at
different institutions or locations.
**Ontological Alignment**:
- **Primary** (`slot_uri`): `prov:wasGeneratedBy` - PROV-O relationship
linking entity to the activity that generated/deployed it
- **Close**: `schema:datePublished` - Schema.org deployment date
**MIGRATED FROM**: `deployment_date` slot
The revision pattern replaces a simple date with structured DeploymentEvent:
- DeploymentEvent.temporal_extent → TimeSpan with fuzzy boundaries
- Enables tracking multiple deployments over time
- Captures deployment context (who, where, why)
range: uriorcurie # Allows reference to DeploymentEvent or inline
multivalued: true
required: false
exact_mappings:
- prov:wasGeneratedBy
close_mappings:
- schema:datePublished
annotations:
rico_naming_convention: |
Follows RiC-O "isOrWas" pattern for temporal predicates.
See Rule 39: Slot Naming Convention (RiC-O Style)
replaces_slots: "deployment_date"
migration_date: "2026-01-25"
comments:
- "MIGRATED from deployment_date per slot_fixes.yaml (Rule 53)"
- "Structured deployment tracking via DeploymentEvent class"
- "RiC-O naming: isOrWas indicates potentially historical relationship"
- "PROV-O wasGeneratedBy for deployment provenance"
examples:
- value: https://nde.nl/ontology/hc/event/rijksmuseum-adlib-deployment-2015
description: "Reference to Adlib CMS deployment event at Rijksmuseum"

View file

@ -0,0 +1,72 @@
# is_or_was_instantiated_by slot
# Links entity to its instantiated type class
#
# Following RiC-O naming convention (Rule 39): "isOrWas..." pattern
# for temporal relationships in heritage domain.
#
# Generation date: 2026-01-25
# Rule compliance: 38 (slot centralization + semantic URI), 39 (RiC-O naming), 42 (no prefix)
# Migration source: device_type slot per slot_fixes.yaml
id: https://nde.nl/ontology/hc/slot/is_or_was_instantiated_by
name: is_or_was_instantiated_by_slot
title: Is Or Was Instantiated By Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#
schema: http://schema.org/
default_prefix: hc
imports:
- linkml:types
slots:
is_or_was_instantiated_by:
slot_uri: rdf:type
description: |
Links an entity to its instantiated type class.
**Temporal Semantics** (RiC-O Pattern):
The "isOrWas" naming follows RiC-O convention indicating this relationship
may be historical - device types may change or be reclassified over time.
**Ontological Alignment**:
- **Primary** (`slot_uri`): `rdf:type` - RDF type relationship
- **Close**: `schema:additionalType` - Schema.org additional type
**Usage**:
Use with typed class hierarchies (e.g., IoTDevice, DeviceType).
Range is uriorcurie to allow both class instances and URI references.
**Replaces**: device_type slot per slot_fixes.yaml migration (2026-01-25)
range: uriorcurie
required: false
multivalued: false
exact_mappings:
- rdf:type
close_mappings:
- schema:additionalType
annotations:
rico_naming_convention: |
Follows RiC-O "isOrWas" pattern for temporal predicates.
See Rule 39: Slot Naming Convention (RiC-O Style)
replaces_slots: "device_type"
migration_date: "2026-01-25"
comments:
- "Links entities to their type classes"
- "RiC-O naming: isOrWas indicates potentially historical relationship"
- "Primary for typed class hierarchies"
examples:
- value: https://nde.nl/ontology/hc/class/IoTBeacon
description: "IoT beacon device type"
- value: https://nde.nl/ontology/hc/class/IoTSensor
description: "IoT sensor device type"

View file

@ -40,7 +40,7 @@ slots:
└── regulated_by_scheme ──→ TaxScheme[]
└── has_or_had_type: CulturalANBI
└── deduction_percentage: 125
└── offers_or_offered: [{ has_or_had_percentage: 125 }]
```
**HERITAGE SECTOR CONTEXT**:

View file

@ -28,10 +28,10 @@
"has_or_had_measurement.yaml",
"has_or_had_measurement_type.yaml",
"catering_price_range.yaml",
"catering_type.yaml",
"has_or_had_price.yaml",
"cessation_observed_in.yaml",
"change_in_net_asset.yaml",
"specifies_or_specified.yaml",
"change_rationale.yaml",
"changes_or_changed_ownership_from.yaml",
"changes_or_changed_ownership_to.yaml",
@ -195,34 +195,36 @@
"__ARCHIVED_20260123__deductibility_conditions.yaml",
"__ARCHIVED_20260123__deductibility_status.yaml",
"__ARCHIVED_20260123__deductible_percentage.yaml",
"deduction_percentage.yaml",
"default_access_policy.yaml",
"default_audio_language.yaml",
"default_language.yaml",
"default_position.yaml",
"defined_by_standard.yaml",
"definition.yaml",
"degree_name.yaml",
"__ARCHIVED_20260123__deduction_percentage.yaml",
"__ARCHIVED_20260123__default_access_policy.yaml",
"__ARCHIVED_20260123__default_audio_language.yaml",
"__ARCHIVED_20260123__default_language.yaml",
"__ARCHIVED_20260124__default_position.yaml",
"__ARCHIVED_20260124__defined_by_standard.yaml",
"__ARCHIVED_20260124__definition.yaml",
"__ARCHIVED_20260124__degree_name.yaml",
"degree_of_certainty.yaml",
"deliverable.yaml",
"departement_code.yaml",
"departement_name.yaml",
"department_code.yaml",
"department_description.yaml",
"department_head.yaml",
"department_id.yaml",
"department_name.yaml",
"deployment_date.yaml",
"derived_from_entity.yaml",
"derived_from_observation.yaml",
"__ARCHIVED_20260124__deliverable.yaml",
"__ARCHIVED_20260124__departement_code.yaml",
"__ARCHIVED_20260124__departement_name.yaml",
"__ARCHIVED_20260125__department_code.yaml",
"__ARCHIVED_20260125__department_description.yaml",
"__ARCHIVED_20260125__department_head.yaml",
"__ARCHIVED_20260125__department_id.yaml",
"__ARCHIVED_20260125__department_name.yaml",
"__ARCHIVED_20260125__deployment_date.yaml",
"is_or_was_deployed_at.yaml",
"refers_or_referred_to.yaml",
"__ARCHIVED_20260125__derived_from_entity.yaml",
"__ARCHIVED_20260125__derived_from_observation.yaml",
"derives_or_derived_from.yaml",
"describes_or_described.yaml",
"description.yaml",
"description_text.yaml",
"__ARCHIVED_20260125__description.yaml",
"__ARCHIVED_20260125__description_text.yaml",
"description_type.yaml",
"detection_count.yaml",
"detection_level.yaml",
"detection_threshold.yaml",
"__ARCHIVED_20260125__detection_count.yaml",
"__ARCHIVED_20260125__detection_level.yaml",
"__ARCHIVED_20260125__detection_threshold.yaml",
"device_count.yaml",
"device_id.yaml",
"device_manufacturer.yaml",
@ -422,6 +424,7 @@
"final_of_the_final.yaml",
"filing_id.yaml",
"filing_type.yaml",
"filters_or_filtered.yaml",
"financial_archival_stage.yaml",
"financial_document_format.yaml",
"financial_document_url.yaml",
@ -651,6 +654,7 @@
"has_or_had_affiliated_university.yaml",
"has_or_had_affiliation.yaml",
"has_or_had_agent.yaml",
"has_or_had_alignment.yaml",
"has_or_had_alternative_name.yaml",
"has_or_had_alternative_observed_name.yaml",
"has_or_had_animal_species_count.yaml",
@ -829,6 +833,7 @@
"has_or_had_related_guide.yaml",
"has_or_had_related_heritage_form.yaml",
"has_or_had_reply.yaml",
"has_or_had_resolution.yaml",
"has_or_had_requirement.yaml",
"has_or_had_requirement_status.yaml",
"has_or_had_research_attempt.yaml",
@ -880,6 +885,7 @@
"has_or_had_text_segment.yaml",
"has_or_had_thematic_route.yaml",
"has_or_had_threshold.yaml",
"has_or_had_treshold.yaml",
"has_or_had_thumbnail.yaml",
"has_or_had_time_interval.yaml",
"has_or_had_timestamp.yaml",
@ -1366,6 +1372,7 @@
"oclc_number.yaml",
"offered_by.yaml",
"offers_donation_scheme.yaml",
"offers_or_offered.yaml",
"offers_or_offered_access.yaml",
"official_institution_subtype.yaml",
"online_shop.yaml",

View file

@ -0,0 +1,74 @@
# offers_or_offered slot
# RiC-O temporal naming convention (Rule 39)
#
# Created per slot_fixes.yaml revision for: deduction_percentage
# Migration date: 2026-01-23
# Rule reference: Rule 53, Rule 39
id: https://nde.nl/ontology/hc/slot/offers_or_offered
name: offers_or_offered
title: Offers Or Offered Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
imports:
- linkml:types
default_prefix: hc
slots:
offers_or_offered:
slot_uri: schema:offers
description: |
Links an entity to something it offers or offered.
**PURPOSE**:
Generic slot for representing what an entity provides, makes available,
or makes accessible. Follows RiC-O temporal naming convention.
**RiC-O NAMING** (Rule 39):
Uses "offers_or_offered" pattern indicating temporal relationship -
what is offered may change over time.
**USE CASES**:
- TaxScheme offers_or_offered TaxDeductibility
- Service offers_or_offered Benefit
- Institution offers_or_offered Program
**MIGRATION NOTE**:
Created from migration of `deduction_percentage` slot per slot_fixes.yaml.
Provides structured link to TaxDeductibility class.
range: Any
multivalued: true
exact_mappings:
- schema:offers
close_mappings:
- schema:hasOfferCatalog
examples:
- value:
has_or_had_type:
has_or_had_label: "Fully Deductible"
has_or_had_percentage:
percentage_value: 100
description: Tax scheme offering full deductibility
comments:
- Created 2026-01-23 from deduction_percentage migration (Rule 53)
- Uses RiC-O temporal naming convention (Rule 39)
- Generic offering relationship slot
annotations:
custodian_types: '["*"]'
custodian_types_rationale: >-
Universal - many entities can offer something.

View file

@ -0,0 +1,68 @@
# refers_or_referred_to slot
# Links observations to entities they reference/describe
#
# Generation date: 2026-01-25
# Rule compliance: 38 (slot centralization), 39 (RiC-O naming), 53 (migration from derived_from_entity)
id: https://nde.nl/ontology/hc/slot/refers_or_referred_to
name: refers_or_referred_to_slot
title: Refers Or Referred To Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
prov: http://www.w3.org/ns/prov#
rico: https://www.ica.org/standards/RiC/ontology#
default_prefix: hc
imports:
- linkml:types
slots:
refers_or_referred_to:
slot_uri: prov:wasDerivedFrom
description: |
Links an observation or document to the entity it refers to or describes.
**Temporal Semantics** (RiC-O Pattern):
The "refersOrReferred" naming follows RiC-O convention indicating this relationship
may be historical - observations may reference entities from the past.
**Ontological Alignment**:
- **Primary** (`slot_uri`): `prov:wasDerivedFrom` - PROV-O derivation
- **Close**: `rico:refersTo` - RiC-O reference relationship
**MIGRATED FROM**: `derived_from_entity` slot
The revision pattern generalizes the derivation relationship:
- Can link to EntityReconstruction (reconstructed formal entities)
- Can link to any entity type (not just CustodianLegalStatus)
- Enables provenance chain traversal
range: uriorcurie # Allows reference to EntityReconstruction or other entities
multivalued: true
required: false
exact_mappings:
- prov:wasDerivedFrom
close_mappings:
- rico:refersTo
annotations:
rico_naming_convention: |
Follows RiC-O "refersOrReferred" pattern for temporal predicates.
See Rule 39: Slot Naming Convention (RiC-O Style)
replaces_slots: "derived_from_entity"
migration_date: "2026-01-25"
comments:
- "MIGRATED from derived_from_entity per slot_fixes.yaml (Rule 53)"
- "Links observation to entity it references"
- "RiC-O naming: refersOrReferred indicates potentially historical relationship"
- "PROV-O wasDerivedFrom for provenance chain"
examples:
- value: https://nde.nl/ontology/hc/legal/stichting-rijksmuseum
description: "Observation refers to Rijksmuseum legal entity"

View file

@ -45,7 +45,10 @@ slots:
regulated_by_scheme:
- scheme_type: CULTURAL_ANBI
jurisdiction: NL
deduction_percentage: 125
# MIGRATED 2026-01-24: deduction_percentage → offers_or_offered (Rule 53)
offers_or_offered:
- has_or_had_percentage:
percentage_value: 125
regulatory_body: Belastingdienst
```

View file

@ -0,0 +1,33 @@
id: https://nde.nl/ontology/hc/slot/specifies_or_specified
name: specifies_or_specified_slot
title: Specifies or Specified Slot
description: |
Slot file for specifies_or_specified following Rule 53 (slot_fixes.yaml).
Links an entity to specifications or quantitative details it provides.
Created per slot_fixes.yaml revision for change_in_net_asset migration.
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
rico: https://www.ica.org/standards/RiC/ontology#
imports:
- linkml:types
default_prefix: hc
slots:
specifies_or_specified:
slot_uri: rico:specifies
description: |
A specification or quantitative detail that this entity provides or provided.
Follows RiC-O temporal naming convention (Rule 39) to indicate the
relationship may be current or historical.
Used for:
- Financial specifications (net assets, revenues, expenses)
- Quantitative measurements
- Formal specifications and criteria
range: uriorcurie
multivalued: true
required: false
exact_mappings:
- rico:specifies

View file

@ -67,7 +67,7 @@ export type DiagramType = 'mermaid-class' | 'mermaid-er' | 'plantuml' | 'graphvi
export interface UMLNode {
id: string;
name: string;
type: 'class' | 'enum' | 'entity';
type: 'class' | 'enum' | 'entity' | 'slot';
attributes?: { name: string; type: string }[];
methods?: { name: string; returnType?: string }[];
x?: number;
@ -1933,7 +1933,7 @@ const UMLVisualizationInner: React.FC<UMLVisualizationProps> = ({
.attr('height', (d) => d.height || nodeHeaderHeight)
.attr('rx', 8)
.attr('fill', 'white')
.attr('stroke', (d) => d.type === 'enum' ? '#ffc107' : '#0a3dfa')
.attr('stroke', (d) => d.type === 'enum' ? '#ffc107' : d.type === 'slot' ? '#10b981' : '#0a3dfa')
.attr('stroke-width', 2);
// Node header background
@ -1942,7 +1942,7 @@ const UMLVisualizationInner: React.FC<UMLVisualizationProps> = ({
.attr('width', (d) => d.width || defaultNodeWidth)
.attr('height', nodeHeaderHeight)
.attr('rx', 8)
.attr('fill', (d) => d.type === 'enum' ? '#fef3c7' : '#e0e7ff') // Light amber for enum, light indigo for class
.attr('fill', (d) => d.type === 'enum' ? '#fef3c7' : d.type === 'slot' ? '#d1fae5' : '#e0e7ff') // Light amber for enum, light emerald for slot, light indigo for class
.attr('opacity', 1);
// Node name
@ -1952,7 +1952,7 @@ const UMLVisualizationInner: React.FC<UMLVisualizationProps> = ({
.attr('y', nodeHeaderHeight / 2)
.attr('text-anchor', 'middle')
.attr('dominant-baseline', 'middle')
.attr('fill', (d) => d.type === 'enum' ? '#92400e' : '#312e81') // Dark amber for enum, dark indigo for class
.attr('fill', (d) => d.type === 'enum' ? '#92400e' : d.type === 'slot' ? '#065f46' : '#312e81') // Dark amber for enum, dark emerald for slot, dark indigo for class
.attr('font-weight', 'bold')
.attr('font-size', '14px')
.text((d) => d.name);
@ -1962,7 +1962,7 @@ const UMLVisualizationInner: React.FC<UMLVisualizationProps> = ({
.attr('class', 'node-type')
.attr('x', 8)
.attr('y', 12)
.attr('fill', (d) => d.type === 'enum' ? '#b45309' : '#4338ca') // Matching darker tones
.attr('fill', (d) => d.type === 'enum' ? '#b45309' : d.type === 'slot' ? '#047857' : '#4338ca') // Matching darker tones
.attr('font-size', '10px')
.attr('font-style', 'italic')
.text((d) => `«${d.type}»`);
@ -2318,7 +2318,7 @@ const UMLVisualizationInner: React.FC<UMLVisualizationProps> = ({
.transition()
.duration(200)
.attr('opacity', 1)
.attr('stroke', nodeType === 'enum' ? '#ffc107' : '#0a3dfa')
.attr('stroke', nodeType === 'enum' ? '#ffc107' : nodeType === 'slot' ? '#10b981' : '#0a3dfa')
.attr('stroke-width', 2)
.style('filter', null);
@ -2418,7 +2418,7 @@ const UMLVisualizationInner: React.FC<UMLVisualizationProps> = ({
.transition()
.duration(200)
.attr('opacity', 1)
.attr('stroke', d.type === 'enum' ? '#ffc107' : '#0a3dfa')
.attr('stroke', d.type === 'enum' ? '#ffc107' : d.type === 'slot' ? '#10b981' : '#0a3dfa')
.attr('stroke-width', 2)
.style('filter', null);
@ -2906,7 +2906,8 @@ const UMLVisualizationInner: React.FC<UMLVisualizationProps> = ({
<svg ref={svgRef} />
</div>
{selectedNode && (
{/* Show semantic details panel for classes and enums, but NOT for slots (predicates) */}
{selectedNode && selectedNode.type !== 'slot' && (
<SemanticDetailsPanel
className={selectedNode.name}
onClose={() => setSelectedNode(null)}

View file

@ -9,7 +9,7 @@
import yaml from 'js-yaml';
// Debug flag - set to true to enable verbose logging
const DEBUG_LINKML = true;
const DEBUG_LINKML = false;
// Helper function for conditional debug logging
function debugLog(...args: unknown[]): void {
@ -1438,9 +1438,7 @@ class LinkMLSchemaService {
* - Classes using slots with this range (computed reverse lookup)
*/
async getClassExportInfo(className: string): Promise<ClassExportInfo> {
console.log(`[getClassExportInfo] Starting for class: ${className}`);
await this.initialize();
console.log(`[getClassExportInfo] Initialized. classSchemas size: ${this.classSchemas.size}, slotSchemas size: ${this.slotSchemas.size}`);
const exportInfo: ClassExportInfo = {
className,
@ -1520,15 +1518,6 @@ class LinkMLSchemaService {
);
exportInfo.linkedCollectionTypes.sort();
console.log(`[getClassExportInfo] Completed for ${className}:`, {
subclasses: exportInfo.subclasses.length,
mixinUsers: exportInfo.mixinUsers.length,
slotsWithThisRange: exportInfo.slotsWithThisRange.length,
classesReferencingInSlotUsage: exportInfo.classesReferencingInSlotUsage.length,
classesUsingSlotWithThisRange: exportInfo.classesUsingSlotWithThisRange.length,
linkedCollectionTypes: exportInfo.linkedCollectionTypes.length,
});
return exportInfo;
}

View file

@ -3591,6 +3591,49 @@
/* Remove fixed height - let container control size via inline styles */
}
/* Resizable UML content */
.linkml-viewer__uml-content--resizable {
position: relative;
min-height: 200px;
}
/* Resize handle at bottom of UML container */
.linkml-viewer__uml-resize-handle {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 8px;
cursor: ns-resize;
background: linear-gradient(to bottom, transparent 0%, var(--border-color, #e0e0e0) 50%, var(--border-color, #e0e0e0) 100%);
border-radius: 0 0 6px 6px;
opacity: 0.5;
transition: opacity 0.2s ease, background 0.2s ease;
z-index: 10;
}
.linkml-viewer__uml-resize-handle:hover {
opacity: 1;
background: linear-gradient(to bottom, transparent 0%, var(--primary, #0a3dfa) 50%, var(--primary, #0a3dfa) 100%);
}
.linkml-viewer__uml-resize-handle::before {
content: '';
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 40px;
height: 4px;
background: currentColor;
border-radius: 2px;
opacity: 0.3;
}
.linkml-viewer__uml-resize-handle:hover::before {
opacity: 0.7;
}
/* UML visualization sizing - use 100% to respect container dimensions */
.linkml-viewer__uml-content .uml-visualization {
width: 100%;

View file

@ -590,11 +590,6 @@ const transformContent = (text: string): string => {
return transformAdmonitions(highlightCuries(transformLifecycleDiagrams(text)));
};
// Debug logging helper
const debugLog = (...args: unknown[]) => {
console.log('[LinkMLViewerPage]', ...args);
};
/**
* Build a filtered UML diagram centered on a specific class.
* Includes both imports (dependencies) and exports (reverse dependencies) based on flags.
@ -843,45 +838,137 @@ const buildFilteredUMLDiagram = (
addRelationshipsFromClass(className);
}
// Debug logging to understand link generation
debugLog(`[buildFilteredUMLDiagram] Building diagram for ${centerClassName}, depth=${depth}`);
debugLog(`[buildFilteredUMLDiagram] showImports=${showImports}, showExports=${showExports}`);
debugLog(`[buildFilteredUMLDiagram] Total nodes: ${nodes.length}`, nodes.map(n => n.name));
debugLog(`[buildFilteredUMLDiagram] Total links: ${links.length}`);
// Log link breakdown by type
const linksByType = {
inheritance: links.filter(l => l.type === 'inheritance'),
aggregation: links.filter(l => l.type === 'aggregation'),
association: links.filter(l => l.type === 'association'),
composition: links.filter(l => l.type === 'composition'),
return {
nodes,
links,
title: `${centerClassName} Relationships (Depth: ${depth})`,
};
debugLog(`[buildFilteredUMLDiagram] Links by type:`, {
inheritance: linksByType.inheritance.length,
aggregation: linksByType.aggregation.length,
association: linksByType.association.length,
composition: linksByType.composition.length,
});
};
// Log the actual import info to understand why slot ranges might be missing
const centerImportInfo = allImportInfo[centerClassName];
if (centerImportInfo) {
debugLog(`[buildFilteredUMLDiagram] Center class import info:`, {
parentClass: centerImportInfo.parentClass,
mixins: centerImportInfo.mixins,
slotRanges: centerImportInfo.slotRanges,
slotUsageRanges: centerImportInfo.slotUsageRanges,
linkedCollectionType: centerImportInfo.linkedCollectionType,
linkedCustodianType: centerImportInfo.linkedCustodianType,
/**
* Build a UML diagram centered on a specific slot, showing RDF triple structure.
*
* The diagram visualizes:
* - SUBJECTS (left): Classes that use this slot as a predicate
* - PREDICATE (center): The slot itself
* - OBJECTS (right): Range types that the slot points to
*
* For slot_usage overrides, the override details are shown as attributes
* on the class node rather than as separate edge labels.
*
* @param slotName - The slot to center the diagram on
* @param slotExportInfo - Export info showing what uses this slot
* @param slotImportInfo - Import info showing what the slot depends on
* @returns UMLDiagram with nodes and links for the slot relationships
*/
const buildSlotUMLDiagram = (
slotName: string,
slotExportInfo: SlotExportInfo,
slotImportInfo: SlotImportInfo
): UMLDiagram => {
const nodes: UMLNode[] = [];
const links: UMLLink[] = [];
const addedNodes = new Set<string>();
// Track slot_usage overrides per class to add as node attributes
const classOverrides = new Map<string, string[]>();
for (const { className, overrides } of slotExportInfo.classesWithSlotUsage) {
classOverrides.set(className, overrides);
}
// Helper to add a node if not already added
const addNode = (
name: string,
type: 'class' | 'enum' | 'slot' = 'class',
attributes: Array<{ name: string; type: string }> = []
) => {
if (!addedNodes.has(name)) {
addedNodes.add(name);
nodes.push({
id: name,
name: name,
type: type,
attributes: attributes,
methods: [],
});
}
};
// Add the central slot node (the predicate)
addNode(slotName, 'slot');
// OBJECTS (right side): Add range types - what the slot points to
if (slotImportInfo.rangeType) {
const rangeType = slotImportInfo.rangeType;
const nodeType = rangeType.isEnum ? 'enum' : 'class';
addNode(rangeType.name, nodeType);
// Link from slot to range type (predicate → object)
links.push({
source: slotName,
target: rangeType.name,
type: 'aggregation',
label: '→ object',
});
}
// Add any_of types (union types) - also objects
for (const anyOfType of slotImportInfo.anyOfTypes) {
const nodeType = anyOfType.isEnum ? 'enum' : 'class';
addNode(anyOfType.name, nodeType);
links.push({
source: slotName,
target: anyOfType.name,
type: 'aggregation',
label: '→ object (any_of)',
});
}
// SUBJECTS (left side): Add classes that declare this slot
// These are the subjects in triples using this predicate
for (const className of slotExportInfo.classesUsingSlot) {
// Check if this class also has slot_usage overrides
const overrides = classOverrides.get(className);
const attributes = overrides && overrides.length > 0
? [{ name: 'slot_usage', type: overrides.join(', ') }]
: [];
addNode(className, 'class', attributes);
// Link from class to slot (subject → predicate)
links.push({
source: className,
target: slotName,
type: 'association',
label: 'subject →',
});
}
// Add classes that ONLY have slot_usage (don't declare directly)
for (const { className, overrides } of slotExportInfo.classesWithSlotUsage) {
// Skip if already added (declared the slot)
if (addedNodes.has(className)) continue;
const attributes = overrides.length > 0
? [{ name: 'slot_usage', type: overrides.join(', ') }]
: [];
addNode(className, 'class', attributes);
// Link from class to slot - these customize but don't declare
links.push({
source: className,
target: slotName,
type: 'association',
label: 'subject (via slot_usage) →',
});
} else {
debugLog(`[buildFilteredUMLDiagram] WARNING: No import info for center class ${centerClassName}`);
}
return {
nodes,
links,
title: `${centerClassName} Relationships (Depth: ${depth})`,
title: `${slotName} - Triple Structure`,
};
};
@ -1160,6 +1247,9 @@ const LinkMLViewerPage: React.FC = () => {
// State for expandable UML diagram section in class details
const [expandedUML, setExpandedUML] = useState<Set<string>>(new Set());
// State for expandable UML diagram section in slot details
const [expandedSlotUML, setExpandedSlotUML] = useState<Set<string>>(new Set());
// State for expandable class slots section in class details
const [expandedClassSlots, setExpandedClassSlots] = useState<Set<string>>(new Set());
@ -1185,6 +1275,10 @@ const LinkMLViewerPage: React.FC = () => {
// State for layout dropdown open per class
const [umlLayoutDropdownOpen, setUmlLayoutDropdownOpen] = useState<Record<string, boolean>>({});
// State for custom UML heights (resizable by user dragging)
// Key is class name or slot name, value is height in pixels
const [umlCustomHeights, setUmlCustomHeights] = useState<Record<string, number>>({});
// State for parent class mapping (className -> parentClassName from is_a inheritance)
// Built incrementally as classes are loaded for UML diagrams
const [parentClassMap, setParentClassMap] = useState<Record<string, string>>({});
@ -1475,72 +1569,103 @@ const LinkMLViewerPage: React.FC = () => {
}
}, [slotImports, loadingSlotImports, isSchemaServiceComplete]);
// Toggle UML diagram section for a slot
// Loads both exports AND imports data since UML diagram shows both directions
const toggleSlotUML = useCallback(async (slotName: string) => {
setExpandedSlotUML(prev => {
const next = new Set(prev);
if (next.has(slotName)) {
next.delete(slotName);
} else {
next.add(slotName);
}
return next;
});
// Load exports data if not already loaded
if (!slotExports[slotName] && !loadingSlotExports.has(slotName) && isSchemaServiceComplete) {
setLoadingSlotExports(prev => new Set(prev).add(slotName));
try {
const exportInfo = await linkmlSchemaService.getSlotExportInfo(slotName);
setSlotExports(prev => ({ ...prev, [slotName]: exportInfo }));
} catch (error) {
console.error(`Error loading export info for slot ${slotName}:`, error);
} finally {
setLoadingSlotExports(prev => {
const next = new Set(prev);
next.delete(slotName);
return next;
});
}
}
// Load imports data if not already loaded
if (!slotImports[slotName] && !loadingSlotImports.has(slotName) && isSchemaServiceComplete) {
setLoadingSlotImports(prev => new Set(prev).add(slotName));
try {
const importInfo = await linkmlSchemaService.getSlotImportInfo(slotName);
setSlotImports(prev => ({ ...prev, [slotName]: importInfo }));
} catch (error) {
console.error(`Error loading import info for slot ${slotName}:`, error);
} finally {
setLoadingSlotImports(prev => {
const next = new Set(prev);
next.delete(slotName);
return next;
});
}
}
}, [slotExports, slotImports, loadingSlotExports, loadingSlotImports, isSchemaServiceComplete]);
// Toggle UML diagram section for a class
// Loads both exports AND imports data since UML diagram can show both directions
const toggleUML = useCallback(async (className: string) => {
console.log(`[toggleUML] Called for class: ${className}`);
console.log(`[toggleUML] State: isSchemaServiceComplete=${isSchemaServiceComplete}, hasExports=${!!classExports[className]}, hasImports=${!!classImports[className]}`);
console.log(`[toggleUML] Loading state: loadingExports=${loadingExports.has(className)}, loadingImports=${loadingImports.has(className)}`);
setExpandedUML(prev => {
const next = new Set(prev);
if (next.has(className)) {
next.delete(className);
console.log(`[toggleUML] Collapsing UML for ${className}`);
} else {
next.add(className);
console.log(`[toggleUML] Expanding UML for ${className}`);
}
return next;
});
// Load exports data if not already loaded (for "Show Exports" checkbox)
if (!classExports[className] && !loadingExports.has(className) && isSchemaServiceComplete) {
console.log(`[toggleUML] Starting to load exports for ${className}`);
setLoadingExports(prev => new Set(prev).add(className));
try {
const exportInfo = await linkmlSchemaService.getClassExportInfo(className);
console.log(`[toggleUML] Loaded exports for ${className}:`, exportInfo);
setClassExports(prev => ({ ...prev, [className]: exportInfo }));
} catch (error) {
console.error(`[toggleUML] Error loading export info for ${className}:`, error);
console.error(`Error loading export info for ${className}:`, error);
} finally {
setLoadingExports(prev => {
const next = new Set(prev);
next.delete(className);
return next;
});
console.log(`[toggleUML] Finished loading exports for ${className}`);
}
} else {
console.log(`[toggleUML] Skipping exports load: hasExports=${!!classExports[className]}, isLoading=${loadingExports.has(className)}, serviceComplete=${isSchemaServiceComplete}`);
}
// Load imports data if not already loaded (for "Show Imports" checkbox)
if (!classImports[className] && !loadingImports.has(className) && isSchemaServiceComplete) {
console.log(`[toggleUML] Starting to load imports for ${className}`);
setLoadingImports(prev => new Set(prev).add(className));
try {
const importInfo = await linkmlSchemaService.getClassImportInfo(className);
console.log(`[toggleUML] Loaded imports for ${className}:`, importInfo);
setClassImports(prev => ({ ...prev, [className]: importInfo }));
// Also load primitive slots for UML attributes
const primitiveSlots = await linkmlSchemaService.getClassPrimitiveSlots(className);
console.log(`[toggleUML] Loaded primitive slots for ${className}:`, primitiveSlots);
setClassPrimitiveSlots(prev => ({ ...prev, [className]: primitiveSlots }));
} catch (error) {
console.error(`[toggleUML] Error loading import info for ${className}:`, error);
console.error(`Error loading import info for ${className}:`, error);
} finally {
setLoadingImports(prev => {
const next = new Set(prev);
next.delete(className);
return next;
});
console.log(`[toggleUML] Finished loading imports for ${className}`);
}
} else {
console.log(`[toggleUML] Skipping imports load: hasImports=${!!classImports[className]}, isLoading=${loadingImports.has(className)}, serviceComplete=${isSchemaServiceComplete}`);
}
}, [classExports, classImports, loadingExports, loadingImports, isSchemaServiceComplete]);
@ -2072,7 +2197,6 @@ const LinkMLViewerPage: React.FC = () => {
// Don't load custodian types until schema service has finished loading all class files
// This prevents the race condition where we try to read annotations before they're loaded
if (!isSchemaServiceComplete) {
console.log('[LinkMLViewerPage] Waiting for schema service to complete before loading custodian types...');
return;
}
@ -2081,12 +2205,6 @@ const LinkMLViewerPage: React.FC = () => {
const slots = extractSlots(schema);
const enums = extractEnums(schema);
console.log('[LinkMLViewerPage] Schema service complete, loading custodian types for', {
classes: classes.length,
slots: slots.length,
enums: enums.length
});
// Load types for all classes in parallel
const classTypesPromises = classes.map(async (cls) => {
const types = await getCustodianTypesForClassAsync(cls.name);
@ -2132,14 +2250,8 @@ const LinkMLViewerPage: React.FC = () => {
setSlotCustodianTypes(slotTypesMap);
setEnumCustodianTypes(enumTypesMap);
setCustodianTypesLoaded(true);
console.log('[LinkMLViewerPage] Loaded custodian types from schema annotations:', {
classes: Object.keys(classTypesMap).length,
slots: Object.keys(slotTypesMap).length,
enums: Object.keys(enumTypesMap).length
});
} catch (error) {
console.error('[LinkMLViewerPage] Error loading custodian types:', error);
console.error('Error loading custodian types:', error);
// Fall back to sync functions (will use defaults)
setCustodianTypesLoaded(true);
}
@ -2157,9 +2269,8 @@ const LinkMLViewerPage: React.FC = () => {
try {
const counts = await linkmlSchemaService.getAllClassDependencyCounts();
setDependencyCounts(counts);
console.log('[LinkMLViewerPage] Pre-loaded dependency counts for', counts.size, 'classes');
} catch (error) {
console.error('[LinkMLViewerPage] Error loading dependency counts:', error);
console.error('Error loading dependency counts:', error);
}
};
@ -2194,11 +2305,8 @@ const LinkMLViewerPage: React.FC = () => {
}
}
setSlotSemanticLabels(labels);
console.log('[LinkMLViewerPage] Pre-loaded slot definitions for', slots.size, 'slots');
console.log('[LinkMLViewerPage] Computed semantic labels for', labels.size, 'slots');
} catch (error) {
console.error('[LinkMLViewerPage] Error loading slot definitions:', error);
console.error('Error loading slot definitions:', error);
}
};
@ -2946,12 +3054,12 @@ const LinkMLViewerPage: React.FC = () => {
<span className="linkml-viewer__uml-empty-icon">🔗</span>
<p>{t('umlNoRelationshipsShown')}</p>
</div>
) : (
) : (
<div
className={`linkml-viewer__uml-container ${umlFullscreen === cls.name ? 'linkml-viewer__uml-container--fullscreen' : ''}`}
className={`linkml-viewer__uml-container linkml-viewer__uml-container--resizable ${umlFullscreen === cls.name ? 'linkml-viewer__uml-container--fullscreen' : ''}`}
style={umlFullscreen !== cls.name ? {
width: '100%',
height: '720px'
height: umlCustomHeights[`class:${cls.name}`] || 720
} : undefined}
>
<UMLVisualization
@ -2962,7 +3070,7 @@ const LinkMLViewerPage: React.FC = () => {
umlShowExports[cls.name] !== false
)}
width={umlFullscreen === cls.name ? window.innerWidth : undefined}
height={umlFullscreen === cls.name ? window.innerHeight : 720}
height={umlFullscreen === cls.name ? window.innerHeight : (umlCustomHeights[`class:${cls.name}`] || 720)}
layoutType={umlLayoutType[cls.name] || 'dagre'}
dagreDirection={umlDagreDirection[cls.name] || 'TB'}
/>
@ -2975,6 +3083,32 @@ const LinkMLViewerPage: React.FC = () => {
</button>
)}
{/* Resize handle - only show when not in fullscreen */}
{umlFullscreen !== cls.name && (
<div
className="linkml-viewer__uml-resize-handle"
onMouseDown={(e) => {
e.preventDefault();
const startY = e.clientY;
const startHeight = umlCustomHeights[`class:${cls.name}`] || 720;
const handleMouseMove = (moveEvent: MouseEvent) => {
const deltaY = moveEvent.clientY - startY;
const newHeight = Math.max(300, startHeight + deltaY);
setUmlCustomHeights(prev => ({ ...prev, [`class:${cls.name}`]: newHeight }));
};
const handleMouseUp = () => {
document.removeEventListener('mousemove', handleMouseMove);
document.removeEventListener('mouseup', handleMouseUp);
};
document.addEventListener('mousemove', handleMouseMove);
document.addEventListener('mouseup', handleMouseUp);
}}
title="Drag to resize"
/>
)}
</div>
)}
</div>
@ -3377,6 +3511,83 @@ const LinkMLViewerPage: React.FC = () => {
</div>
)}
{/* UML Diagram Section - Shows visual representation of slot usage */}
{!className && isSchemaServiceComplete && (
<div className="linkml-viewer__uml-section">
<button
className={`linkml-viewer__uml-toggle ${expandedSlotUML.has(slot.name) ? 'linkml-viewer__uml-toggle--expanded' : ''}`}
onClick={() => toggleSlotUML(slot.name)}
title={language === 'nl' ? 'Toont een visueel diagram van hoe deze slot wordt gebruikt' : 'Shows a visual diagram of how this slot is used'}
>
<span className="linkml-viewer__uml-icon">{expandedSlotUML.has(slot.name) ? '▼' : '▶'}</span>
<span className="linkml-viewer__label">UML Diagram</span>
{(loadingSlotExports.has(slot.name) || loadingSlotImports.has(slot.name)) &&
<span className="linkml-viewer__uml-loading">Loading...</span>
}
</button>
{expandedSlotUML.has(slot.name) && slotExports[slot.name] && slotImports[slot.name] && (
<div
className="linkml-viewer__uml-content linkml-viewer__uml-content--resizable"
style={{
height: umlCustomHeights[`slot:${slot.name}`] || Math.max(450,
(slotExports[slot.name].classesUsingSlot.length +
slotExports[slot.name].classesWithSlotUsage.length +
(slotImports[slot.name].rangeType ? 1 : 0) +
slotImports[slot.name].anyOfTypes.length + 1) * 80
)
}}
>
<UMLVisualization
diagram={buildSlotUMLDiagram(slot.name, slotExports[slot.name], slotImports[slot.name])}
layoutType="dagre"
dagreDirection="LR"
height={umlCustomHeights[`slot:${slot.name}`] || Math.max(450,
(slotExports[slot.name].classesUsingSlot.length +
slotExports[slot.name].classesWithSlotUsage.length +
(slotImports[slot.name].rangeType ? 1 : 0) +
slotImports[slot.name].anyOfTypes.length + 1) * 80
)}
/>
{/* Resize handle */}
<div
className="linkml-viewer__uml-resize-handle"
onMouseDown={(e) => {
e.preventDefault();
const startY = e.clientY;
const startHeight = umlCustomHeights[`slot:${slot.name}`] || Math.max(450,
(slotExports[slot.name].classesUsingSlot.length +
slotExports[slot.name].classesWithSlotUsage.length +
(slotImports[slot.name].rangeType ? 1 : 0) +
slotImports[slot.name].anyOfTypes.length + 1) * 80
);
const handleMouseMove = (moveEvent: MouseEvent) => {
const deltaY = moveEvent.clientY - startY;
const newHeight = Math.max(200, startHeight + deltaY);
setUmlCustomHeights(prev => ({ ...prev, [`slot:${slot.name}`]: newHeight }));
};
const handleMouseUp = () => {
document.removeEventListener('mousemove', handleMouseMove);
document.removeEventListener('mouseup', handleMouseUp);
};
document.addEventListener('mousemove', handleMouseMove);
document.addEventListener('mouseup', handleMouseUp);
}}
title="Drag to resize"
/>
</div>
)}
{expandedSlotUML.has(slot.name) && (!slotExports[slot.name] || !slotImports[slot.name]) &&
!loadingSlotExports.has(slot.name) && !loadingSlotImports.has(slot.name) && (
<div className="linkml-viewer__uml-content linkml-viewer__uml-content--placeholder">
<p>{language === 'nl' ? 'Klik om UML-diagram te laden' : 'Click to load UML diagram'}</p>
</div>
)}
</div>
)}
{/* Side-by-side comparison view - only shown when expanded */}
{showComparison && hasSlotUsageOverrides && genericSlot && (
<div className="linkml-viewer__slot-comparison">

View file

@ -1,12 +1,12 @@
{
"generated": "2026-01-24T16:41:07.363Z",
"generated": "2026-01-25T11:47:39.065Z",
"schemaRoot": "/schemas/20251121/linkml",
"totalFiles": 3044,
"totalFiles": 3045,
"categoryCounts": {
"main": 4,
"class": 1004,
"class": 1026,
"enum": 154,
"slot": 1878,
"slot": 1857,
"module": 4
},
"categories": [
@ -135,6 +135,11 @@
"path": "modules/classes/Agent.yaml",
"category": "class"
},
{
"name": "Alignment",
"path": "modules/classes/Alignment.yaml",
"category": "class"
},
{
"name": "AllocationAgency",
"path": "modules/classes/AllocationAgency.yaml",
@ -670,6 +675,16 @@
"path": "modules/classes/CateringPlace.yaml",
"category": "class"
},
{
"name": "CateringType",
"path": "modules/classes/CateringType.yaml",
"category": "class"
},
{
"name": "CateringTypes",
"path": "modules/classes/CateringTypes.yaml",
"category": "class"
},
{
"name": "CathedralArchive",
"path": "modules/classes/CathedralArchive.yaml",
@ -1395,6 +1410,11 @@
"path": "modules/classes/DeceasedStatus.yaml",
"category": "class"
},
{
"name": "Deliverable",
"path": "modules/classes/Deliverable.yaml",
"category": "class"
},
{
"name": "Department",
"path": "modules/classes/Department.yaml",
@ -1415,6 +1435,11 @@
"path": "modules/classes/DepartmentalArchivesRecordSetTypes.yaml",
"category": "class"
},
{
"name": "DeploymentEvent",
"path": "modules/classes/DeploymentEvent.yaml",
"category": "class"
},
{
"name": "DepositArchive",
"path": "modules/classes/DepositArchive.yaml",
@ -1440,6 +1465,31 @@
"path": "modules/classes/DetectedEntity.yaml",
"category": "class"
},
{
"name": "DetectionLevelType",
"path": "modules/classes/DetectionLevelType.yaml",
"category": "class"
},
{
"name": "DetectionLevelTypes",
"path": "modules/classes/DetectionLevelTypes.yaml",
"category": "class"
},
{
"name": "DetectionThreshold",
"path": "modules/classes/DetectionThreshold.yaml",
"category": "class"
},
{
"name": "DeviceType",
"path": "modules/classes/DeviceType.yaml",
"category": "class"
},
{
"name": "DeviceTypes",
"path": "modules/classes/DeviceTypes.yaml",
"category": "class"
},
{
"name": "DigitalArchive",
"path": "modules/classes/DigitalArchive.yaml",
@ -1700,6 +1750,11 @@
"path": "modules/classes/Entity.yaml",
"category": "class"
},
{
"name": "EntityReconstruction",
"path": "modules/classes/EntityReconstruction.yaml",
"category": "class"
},
{
"name": "EnvironmentalZone",
"path": "modules/classes/EnvironmentalZone.yaml",
@ -2250,6 +2305,11 @@
"path": "modules/classes/InvestmentArea.yaml",
"category": "class"
},
{
"name": "IoTDevice",
"path": "modules/classes/IoTDevice.yaml",
"category": "class"
},
{
"name": "IsilCodeEntry",
"path": "modules/classes/IsilCodeEntry.yaml",
@ -2295,6 +2355,16 @@
"path": "modules/classes/Label.yaml",
"category": "class"
},
{
"name": "LabelType",
"path": "modules/classes/LabelType.yaml",
"category": "class"
},
{
"name": "LabelTypes",
"path": "modules/classes/LabelTypes.yaml",
"category": "class"
},
{
"name": "Landsarkiv",
"path": "modules/classes/Landsarkiv.yaml",
@ -2520,6 +2590,16 @@
"path": "modules/classes/MainPart.yaml",
"category": "class"
},
{
"name": "Manager",
"path": "modules/classes/Manager.yaml",
"category": "class"
},
{
"name": "Manufacturer",
"path": "modules/classes/Manufacturer.yaml",
"category": "class"
},
{
"name": "MappingType",
"path": "modules/classes/MappingType.yaml",
@ -2660,6 +2740,11 @@
"path": "modules/classes/MixedCustodianType.yaml",
"category": "class"
},
{
"name": "Model",
"path": "modules/classes/Model.yaml",
"category": "class"
},
{
"name": "MonasteryArchive",
"path": "modules/classes/MonasteryArchive.yaml",
@ -2895,6 +2980,11 @@
"path": "modules/classes/OAIPMHEndpoint.yaml",
"category": "class"
},
{
"name": "Observation",
"path": "modules/classes/Observation.yaml",
"category": "class"
},
{
"name": "OfficialInstitutionType",
"path": "modules/classes/OfficialInstitutionType.yaml",
@ -3280,6 +3370,16 @@
"path": "modules/classes/PressArchiveRecordSetTypes.yaml",
"category": "class"
},
{
"name": "Price",
"path": "modules/classes/Price.yaml",
"category": "class"
},
{
"name": "PriceRange",
"path": "modules/classes/PriceRange.yaml",
"category": "class"
},
{
"name": "PrimaryDigitalPresenceAssertion",
"path": "modules/classes/PrimaryDigitalPresenceAssertion.yaml",
@ -3640,6 +3740,11 @@
"path": "modules/classes/ResearchSourceData.yaml",
"category": "class"
},
{
"name": "Resolution",
"path": "modules/classes/Resolution.yaml",
"category": "class"
},
{
"name": "ResourceType",
"path": "modules/classes/ResourceType.yaml",
@ -4075,6 +4180,11 @@
"path": "modules/classes/StateRegionalArchiveCzechiaRecordSetTypes.yaml",
"category": "class"
},
{
"name": "Status",
"path": "modules/classes/Status.yaml",
"category": "class"
},
{
"name": "Storage",
"path": "modules/classes/Storage.yaml",
@ -5902,26 +6012,11 @@
"path": "modules/slots/begin_of_the_end.yaml",
"category": "slot"
},
{
"name": "catering_price_range",
"path": "modules/slots/catering_price_range.yaml",
"category": "slot"
},
{
"name": "catering_type",
"path": "modules/slots/catering_type.yaml",
"category": "slot"
},
{
"name": "cessation_observed_in",
"path": "modules/slots/cessation_observed_in.yaml",
"category": "slot"
},
{
"name": "change_in_net_asset",
"path": "modules/slots/change_in_net_asset.yaml",
"category": "slot"
},
{
"name": "change_rationale",
"path": "modules/slots/change_rationale.yaml",
@ -6582,106 +6677,11 @@
"path": "modules/slots/date.yaml",
"category": "slot"
},
{
"name": "deduction_percentage",
"path": "modules/slots/deduction_percentage.yaml",
"category": "slot"
},
{
"name": "default_access_policy",
"path": "modules/slots/default_access_policy.yaml",
"category": "slot"
},
{
"name": "default_audio_language",
"path": "modules/slots/default_audio_language.yaml",
"category": "slot"
},
{
"name": "default_language",
"path": "modules/slots/default_language.yaml",
"category": "slot"
},
{
"name": "default_position",
"path": "modules/slots/default_position.yaml",
"category": "slot"
},
{
"name": "defined_by_standard",
"path": "modules/slots/defined_by_standard.yaml",
"category": "slot"
},
{
"name": "definition",
"path": "modules/slots/definition.yaml",
"category": "slot"
},
{
"name": "degree_name",
"path": "modules/slots/degree_name.yaml",
"category": "slot"
},
{
"name": "degree_of_certainty",
"path": "modules/slots/degree_of_certainty.yaml",
"category": "slot"
},
{
"name": "deliverable",
"path": "modules/slots/deliverable.yaml",
"category": "slot"
},
{
"name": "departement_code",
"path": "modules/slots/departement_code.yaml",
"category": "slot"
},
{
"name": "departement_name",
"path": "modules/slots/departement_name.yaml",
"category": "slot"
},
{
"name": "department_code",
"path": "modules/slots/department_code.yaml",
"category": "slot"
},
{
"name": "department_description",
"path": "modules/slots/department_description.yaml",
"category": "slot"
},
{
"name": "department_head",
"path": "modules/slots/department_head.yaml",
"category": "slot"
},
{
"name": "department_id",
"path": "modules/slots/department_id.yaml",
"category": "slot"
},
{
"name": "department_name",
"path": "modules/slots/department_name.yaml",
"category": "slot"
},
{
"name": "deployment_date",
"path": "modules/slots/deployment_date.yaml",
"category": "slot"
},
{
"name": "derived_from_entity",
"path": "modules/slots/derived_from_entity.yaml",
"category": "slot"
},
{
"name": "derived_from_observation",
"path": "modules/slots/derived_from_observation.yaml",
"category": "slot"
},
{
"name": "derives_or_derived_from",
"path": "modules/slots/derives_or_derived_from.yaml",
@ -6692,66 +6692,16 @@
"path": "modules/slots/describes_or_described.yaml",
"category": "slot"
},
{
"name": "description",
"path": "modules/slots/description.yaml",
"category": "slot"
},
{
"name": "description_text",
"path": "modules/slots/description_text.yaml",
"category": "slot"
},
{
"name": "description_type",
"path": "modules/slots/description_type.yaml",
"category": "slot"
},
{
"name": "detection_count",
"path": "modules/slots/detection_count.yaml",
"category": "slot"
},
{
"name": "detection_level",
"path": "modules/slots/detection_level.yaml",
"category": "slot"
},
{
"name": "detection_threshold",
"path": "modules/slots/detection_threshold.yaml",
"category": "slot"
},
{
"name": "device_count",
"path": "modules/slots/device_count.yaml",
"category": "slot"
},
{
"name": "device_id",
"path": "modules/slots/device_id.yaml",
"category": "slot"
},
{
"name": "device_manufacturer",
"path": "modules/slots/device_manufacturer.yaml",
"category": "slot"
},
{
"name": "device_model",
"path": "modules/slots/device_model.yaml",
"category": "slot"
},
{
"name": "device_name",
"path": "modules/slots/device_name.yaml",
"category": "slot"
},
{
"name": "device_type",
"path": "modules/slots/device_type.yaml",
"category": "slot"
},
{
"name": "diarization_confidence",
"path": "modules/slots/diarization_confidence.yaml",
@ -7712,6 +7662,11 @@
"path": "modules/slots/filing_type.yaml",
"category": "slot"
},
{
"name": "filters_or_filtered",
"path": "modules/slots/filters_or_filtered.yaml",
"category": "slot"
},
{
"name": "final_of_the_final",
"path": "modules/slots/final_of_the_final.yaml",
@ -8862,6 +8817,11 @@
"path": "modules/slots/has_or_had_agent.yaml",
"category": "slot"
},
{
"name": "has_or_had_alignment",
"path": "modules/slots/has_or_had_alignment.yaml",
"category": "slot"
},
{
"name": "has_or_had_alternative_name",
"path": "modules/slots/has_or_had_alternative_name.yaml",
@ -9692,6 +9652,11 @@
"path": "modules/slots/has_or_had_previous_owner.yaml",
"category": "slot"
},
{
"name": "has_or_had_price",
"path": "modules/slots/has_or_had_price.yaml",
"category": "slot"
},
{
"name": "has_or_had_primary_presence_assertion",
"path": "modules/slots/has_or_had_primary_presence_assertion.yaml",
@ -9822,6 +9787,11 @@
"path": "modules/slots/has_or_had_research_attempt.yaml",
"category": "slot"
},
{
"name": "has_or_had_resolution",
"path": "modules/slots/has_or_had_resolution.yaml",
"category": "slot"
},
{
"name": "has_or_had_responsibility",
"path": "modules/slots/has_or_had_responsibility.yaml",
@ -10102,6 +10072,11 @@
"path": "modules/slots/has_or_had_treatment.yaml",
"category": "slot"
},
{
"name": "has_or_had_treshold",
"path": "modules/slots/has_or_had_treshold.yaml",
"category": "slot"
},
{
"name": "has_or_had_type",
"path": "modules/slots/has_or_had_type.yaml",
@ -10967,6 +10942,11 @@
"path": "modules/slots/is_or_was_collection_of.yaml",
"category": "slot"
},
{
"name": "is_or_was_created_by",
"path": "modules/slots/is_or_was_created_by.yaml",
"category": "slot"
},
{
"name": "is_or_was_created_through",
"path": "modules/slots/is_or_was_created_through.yaml",
@ -10977,6 +10957,11 @@
"path": "modules/slots/is_or_was_decommissioned_at.yaml",
"category": "slot"
},
{
"name": "is_or_was_deployed_at",
"path": "modules/slots/is_or_was_deployed_at.yaml",
"category": "slot"
},
{
"name": "is_or_was_derived_from",
"path": "modules/slots/is_or_was_derived_from.yaml",
@ -11027,6 +11012,11 @@
"path": "modules/slots/is_or_was_instance_of.yaml",
"category": "slot"
},
{
"name": "is_or_was_instantiated_by",
"path": "modules/slots/is_or_was_instantiated_by.yaml",
"category": "slot"
},
{
"name": "is_or_was_involved_in",
"path": "modules/slots/is_or_was_involved_in.yaml",
@ -12517,6 +12507,11 @@
"path": "modules/slots/offers_donation_scheme.yaml",
"category": "slot"
},
{
"name": "offers_or_offered",
"path": "modules/slots/offers_or_offered.yaml",
"category": "slot"
},
{
"name": "offers_or_offered_access",
"path": "modules/slots/offers_or_offered_access.yaml",
@ -13787,6 +13782,11 @@
"path": "modules/slots/recurrence_pattern.yaml",
"category": "slot"
},
{
"name": "refers_or_referred_to",
"path": "modules/slots/refers_or_referred_to.yaml",
"category": "slot"
},
{
"name": "refers_to_access_policy",
"path": "modules/slots/refers_to_access_policy.yaml",
@ -14932,6 +14932,11 @@
"path": "modules/slots/specificity_timestamp.yaml",
"category": "slot"
},
{
"name": "specifies_or_specified",
"path": "modules/slots/specifies_or_specified.yaml",
"category": "slot"
},
{
"name": "specimen_count",
"path": "modules/slots/specimen_count.yaml",

Some files were not shown because too many files have changed in this diff Show more