glam/schemas/20251121/linkml/modules/classes/CustodianTimelineEvent.yaml
kempersc b34992b1d3 Migrate all 293 class files to ontology-aligned slots
Extends migration to all class types (museums, libraries, galleries, etc.)

New slots added to class_metadata_slots.yaml:
- RiC-O: rico_record_set_type, rico_organizational_principle,
  rico_has_or_had_holder, rico_note
- Multilingual: label_de, label_es, label_fr, label_nl, label_it, label_pt
- Scope: scope_includes, scope_excludes, custodian_only,
  organizational_level, geographic_restriction
- Notes: privacy_note, preservation_note, legal_note

Migration script now handles 30+ annotation types.
All migrated schemas pass linkml-validate.

Total: 387 class files now use proper slots instead of annotations.
2026-01-06 12:24:54 +01:00

415 lines
15 KiB
YAML

id: https://nde.nl/ontology/hc/class/CustodianTimelineEvent
name: CustodianTimelineEvent
title: Custodian Timeline Event Class - Organizational Change Events
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
dcterms: http://purl.org/dc/terms/
prov: http://www.w3.org/ns/prov#
xsd: http://www.w3.org/2001/XMLSchema#
crm: http://www.cidoc-crm.org/cidoc-crm/
tooi: https://identifier.overheid.nl/tooi/def/ont/
imports:
- linkml:types
- ../enums/OrganizationalChangeEventTypeEnum
- ../enums/DataTierEnum
- ../slots/description
- ../slots/extraction_method
- ../slots/extraction_timestamp
- ../slots/class_metadata_slots
default_prefix: hc
enums:
DatePrecisionEnum:
description: |
Precision level of an extracted date.
Used to indicate how specific the date information is.
permissible_values:
day:
description: Full date with day precision (YYYY-MM-DD)
comments:
- 'Example: 2005-04-30 (30 april 2005)'
month:
description: Month precision only (YYYY-MM)
comments:
- 'Example: 2005-04 (april 2005)'
year:
description: Year precision only (YYYY)
comments:
- 'Example: 2005 (in 2005)'
decade:
description: Decade precision (YYYY0s)
comments:
- 'Example: 2000s (begin 21e eeuw)'
century:
description: Century precision
comments:
- 'Example: 1900s (begin 20e eeuw)'
unknown:
description: Date mentioned but precision cannot be determined
TimelineExtractionMethodEnum:
description: |
Method used to extract the timeline event.
Source-agnostic enum covering various extraction methods.
permissible_values:
api_response_regex:
description: Date extracted via regex patterns from API response text
comments:
- 'Patterns: YYYY-MM-DD, DD-MM-YYYY, ''in YYYY'', ''op DD maand YYYY'''
api_response_llm:
description: Date extracted using LLM analysis of API response
comments:
- Used for complex temporal expressions
web_scrape_xpath:
description: Date extracted via XPath from archived HTML
comments:
- High confidence - verifiable against archived HTML
wikidata_sparql:
description: Date extracted from Wikidata SPARQL query
comments:
- Uses inception date (P571) or other temporal properties
manual_research:
description: Event discovered through manual research
comments:
- Human-verified from institutional sources
manual_verification:
description: Event manually verified and corrected
comments:
- Promoted from TIER_4 to higher tier after verification
slots:
event_type:
slot_uri: hc:eventType
range: OrganizationalChangeEventTypeEnum
required: true
description: |
Type of organizational change event.
Constrained to values from OrganizationalChangeEventTypeEnum.
Mapping from extraction patterns:
- founding, opgericht, gesticht → FOUNDING
- merger, fusie, samengevoegd → MERGER
- dissolution, opgeheven, gesloten → DISSOLUTION
- name_change, hernoemd, naamswijziging → RENAMING
- relocation, verhuisd, verplaatst → TRANSFER
- expansion, uitgebreid, geabsorbeerd → EXPANSION
- split, opgesplitst → SPLIT
- spin_off, afgesplitst → SPIN_OFF
- reduction, ingekrompen → REDUCTION
- reorganization, herstructurering → REORGANIZATION
event_date:
slot_uri: schema:startDate
range: string
description: |
The date of the event in ISO 8601 format.
Precision indicated by date_precision slot.
Format depends on precision:
- day: YYYY-MM-DD (e.g., "2005-04-30")
- month: YYYY-MM (e.g., "2005-04")
- year: YYYY (e.g., "2005")
- decade: YYYY (e.g., "2000" for 2000s)
- century: YYYY (e.g., "1900" for 20th century)
pattern: ^\d{4}(-\d{2})?(-\d{2})?$
date_precision:
slot_uri: hc:datePrecision
range: DatePrecisionEnum
required: true
description: |
Precision level of the event_date.
Essential for proper interpretation and display.
approximate:
slot_uri: hc:approximate
range: boolean
required: true
description: |
Whether the date is approximate (circa, ongeveer, rond).
True if source uses hedging language:
- "circa 1900", "rond 2000", "ongeveer in 2005"
- "begin 20e eeuw", "eind jaren '90"
source_urls:
slot_uri: dcterms:source
range: string
multivalued: true
description: |
URLs of sources that document this event.
Can be institutional websites, Wikipedia, Wikidata, etc.
Used for manual verification - users can check these URLs
to confirm the extracted information.
extraction_notes:
slot_uri: hc:extractionNotes
range: string
description: "Free-text notes about the extraction process.\n\nUse this for source-specific\
\ details that don't fit elsewhere:\n- API query used (if from an API)\n- XPath\
\ location (if from web scraping)\n- Wikidata property ID (if from SPARQL)\n\
- Research notes (if manual)\n\nExample for API-sourced data:\n \"Query: 'Drents\
\ Archief opgericht' via Linkup API.\n Answer archived at: web/0002/linkup/linkup_founding_20251215T160438Z.json\"\
\n \n"
archive_path:
slot_uri: hc:archivePath
range: string
description: |
Relative path to archived source material (JSON, HTML, etc.).
Path is relative to the data/custodian/ directory.
Examples:
- web/0002/linkup/linkup_founding_20251215T160438Z.json (API response)
- web/0002/example.org/rendered.html (archived webpage)
data_tier:
slot_uri: hc:dataTier
range: DataTierEnum
required: true
description: |
Data quality tier for this event.
Typical values:
- TIER_4_INFERRED: Initial extraction from LLM/API (requires verification)
- TIER_3_CROWD_SOURCED: Verified against Wikipedia/Wikidata
- TIER_2_VERIFIED: Verified against institutional website
- TIER_1_AUTHORITATIVE: Verified against official registry
observation_ref:
slot_uri: prov:wasGeneratedBy
range: uriorcurie
description: |
Optional reference to the observation that generated this event.
Links to a WebObservation or CustodianObservation for full provenance.
Use this to connect events to their source observations when
detailed provenance (XPath, API response, etc.) is needed.
classes:
CustodianTimelineEvent:
class_uri: prov:Entity
description: |
An organizational change event for a heritage custodian.
**PURPOSE**
Captures organizational change events (founding, mergers, name changes, etc.)
as domain entities, independent of how they were discovered.
**SOURCE-AGNOSTIC DESIGN**
This class models WHAT happened, not HOW we know. For source-specific
provenance, use observation classes:
- `WebObservation` - For web-scraped data with XPath or API provenance
- `CustodianObservation` - For institutional source documents
The optional `observation_ref` slot links events to their source observations
when detailed provenance is needed.
**DATA QUALITY**
Use `data_tier` to indicate trustworthiness:
- TIER_4_INFERRED: Initial extraction (LLM-generated, unverified)
- TIER_3_CROWD_SOURCED: Verified against Wikipedia/Wikidata
- TIER_2_VERIFIED: Verified against institutional website
- TIER_1_AUTHORITATIVE: Verified against official registry
Use `extraction_notes` to capture source-specific details:
- API queries and responses
- XPath locations in archived HTML
- Wikidata property references
- Manual research notes
**EVENT TYPE MAPPING**
Events are classified using OrganizationalChangeEventTypeEnum:
- FOUNDING: Institution creation (opgericht, gesticht)
- MERGER: Multiple institutions combining (fusie, samenvoeging)
- DISSOLUTION: Institution closure (opgeheven, gesloten)
- RENAMING: Name change only (hernoemd, naamswijziging)
- TRANSFER: Physical relocation (verhuisd, verplaatst)
- EXPANSION: Absorbing other units (uitgebreid, geabsorbeerd)
- SPLIT: Division into multiple units (opgesplitst)
- SPIN_OFF: Parts becoming independent (afgesplitst)
- REDUCTION: Scope decrease (ingekrompen)
- REORGANIZATION: Complex restructuring (herstructurering)
**EXCLUDED EVENT TYPES**
Some patterns are NOT mapped to events:
- predecessor: This is a relationship, not an event
- friends_org: Separate organization (Vrienden van...)
- reopening: Not in OrganizationalChangeEventTypeEnum
**EXAMPLE USAGE**
```yaml
timeline_events:
- event_type: FOUNDING
event_date: "2005-04-30"
date_precision: day
approximate: false
description: >-
Het RHC Drents Archief werd opgericht op 30 april 2005.
Het is de voortzetting van het Rijksarchief in Drenthe (sinds 2000).
source_urls:
- "https://nl.wikipedia.org/wiki/Drents_Archief"
- "https://bizzy.ai/nl/nl/52454037/regionaal-historisch-centrum-rhc-drents-archief"
extraction_method: api_response_regex
extraction_timestamp: "2025-12-16T10:00:00Z"
extraction_notes: >-
Query: "Regionaal Historisch Centrum (RHC) Drents Archief" Assen opgericht
Answer archived at: web/0002/linkup/linkup_founding_20251215T160438Z.json
archive_path: web/0002/linkup/linkup_founding_20251215T160438Z.json
data_tier: TIER_4_INFERRED
```
exact_mappings:
- prov:Entity
close_mappings:
- crm:E5_Event
- tooi:Wijzigingsgebeurtenis
- schema:Event
slots:
- approximate
- archive_path
- data_tier
- date_precision
- description
- event_date
- event_type
- extraction_method
- extraction_notes
- extraction_timestamp
- observation_ref
- source_urls
- specificity_annotation
- template_specificity
slot_usage:
event_type:
required: true
description: |
Type of organizational change event.
Must be a valid OrganizationalChangeEventTypeEnum value.
event_date:
required: false
description: |
Date of the event. Optional because some events may not have
a determinable date from the source.
date_precision:
required: true
description: |
Always required to indicate how to interpret event_date.
Use 'unknown' if date is mentioned but precision unclear.
approximate:
required: true
description: |
Always required. Default to false unless hedging language detected.
description:
required: true
description: |
Human-readable summary of the event.
Should describe what happened, not how it was discovered.
source_urls:
required: false
description: |
URLs documenting the event. May be empty if no web sources available.
extraction_method:
required: true
range: TimelineExtractionMethodEnum
description: |
How the event was extracted. Required for transparency.
extraction_timestamp:
required: true
description: |
When extraction occurred. Required for temporal provenance.
extraction_notes:
required: false
description: |
Optional notes for source-specific details (API queries, XPaths, etc.)
archive_path:
required: false
description: |
Path to archived source material. Recommended for audit trail.
data_tier:
required: true
description: |
Quality tier. Use TIER_4_INFERRED for unverified extractions.
observation_ref:
required: false
description: |
Optional link to source observation for detailed provenance.
specificity_annotation:
range: SpecificityAnnotation
inlined: true
template_specificity:
range: TemplateSpecificityScores
inlined: true
rules:
- preconditions:
slot_conditions:
event_date:
value_presence: PRESENT
postconditions:
slot_conditions:
date_precision:
value_presence: PRESENT
description: If event_date is provided, date_precision must be specified
comments:
- 'Source-agnostic design - see Rule 37: Provenance Separation'
- Use observation_ref to link to detailed source provenance
- Use extraction_notes for source-specific details (API queries, XPaths)
- Event types constrained to OrganizationalChangeEventTypeEnum
- Use CIDOC-CRM TimeSpan for fuzzy dates if needed
see_also:
- schemas/20251121/linkml/modules/enums/OrganizationalChangeEventTypeEnum.yaml
- schemas/20251121/linkml/modules/classes/WebObservation.yaml
- schemas/20251121/linkml/modules/classes/CustodianObservation.yaml
- schemas/20251121/linkml/modules/classes/TimeSpan.yaml
- .opencode/PROVENANCE_SEPARATION_RULE.md
examples:
- value:
event_type: FOUNDING
event_date: '2005-04-30'
date_precision: day
approximate: false
description: Het RHC Drents Archief werd opgericht op 30 april 2005.
source_urls:
- https://nl.wikipedia.org/wiki/Drents_Archief
extraction_method: api_response_regex
extraction_timestamp: '2025-12-16T10:00:00Z'
extraction_notes: 'Query: "Drents Archief" Assen opgericht OR gesticht API:
Linkup. Archived at: web/0002/linkup/linkup_founding_20251215T160438Z.json'
archive_path: web/0002/linkup/linkup_founding_20251215T160438Z.json
data_tier: TIER_4_INFERRED
description: Founding event extracted from API response
- value:
event_type: MERGER
event_date: '2005'
date_precision: year
approximate: false
description: In 2005 ging het Gemeentearchief Assen op in het Drents Archief.
source_urls:
- https://nl.wikipedia.org/wiki/Drents_Archief
extraction_method: api_response_regex
extraction_timestamp: '2025-12-16T10:05:00Z'
data_tier: TIER_4_INFERRED
description: Merger event with year-only precision
- value:
event_type: FOUNDING
event_date: '1810'
date_precision: year
approximate: false
description: The Rijksmuseum was founded in 1810 as the Royal Museum.
source_urls:
- https://www.wikidata.org/wiki/Q190804
extraction_method: wikidata_sparql
extraction_timestamp: '2025-12-20T14:30:00Z'
extraction_notes: Wikidata P571 (inception date) query
data_tier: TIER_3_CROWD_SOURCED
description: Founding event from Wikidata
- value:
event_type: TRANSFER
event_date: '1885'
date_precision: year
approximate: false
description: The Rijksmuseum moved to its current building designed by Cuypers.
source_urls:
- https://www.rijksmuseum.nl/en/about-us/what-we-do/history
extraction_method: web_scrape_xpath
extraction_timestamp: '2025-12-20T15:00:00Z'
extraction_notes: 'XPath: /html/body/main/section[2]/div/p[3]'
archive_path: web/0001/rijksmuseum.nl/about-us/rendered.html
data_tier: TIER_2_VERIFIED
description: Relocation event from institutional website