feat: Add ConflictType and ConflictTypes schemas for heritage conflict taxonomy

- Introduced abstract class ConflictType to define a taxonomy for various conflict types affecting heritage institutions.
- Added concrete subclasses in ConflictTypes.yaml, detailing specific conflict types such as ArmedConflict, NaturalDisaster, CivilUnrest, Terrorism, Looting, Neglect, Occupation, and Sanctions.
- Implemented Permission and PermissionType schemas to represent authorization requirements for accessing heritage materials, including subclasses like BishopsPermission and InstitutionalAffiliation.
- Created SocialNetworkMember class for representing members in social/professional networks, facilitating heritage sector network analysis.
- Established slots for canonical access rules, conflict status, and connection metadata, enhancing the data model for heritage custodians.
- Developed ConnectionDegree and ConnectionDegreeType classes to represent degrees of connection in social networks, with subclasses for first, second, and third-plus degrees.
- Added slots for birth dates in EDTF and ISO formats, improving the representation of heritage custodian entities.
This commit is contained in:
kempersc 2026-01-22 20:41:06 +01:00
parent be18d6761c
commit 2a75ddf7cc
51 changed files with 2389 additions and 297 deletions

View file

@ -1,12 +1,12 @@
{
"generated": "2026-01-22T16:05:23.652Z",
"generated": "2026-01-22T19:40:49.649Z",
"schemaRoot": "/schemas/20251121/linkml",
"totalFiles": 3029,
"totalFiles": 3037,
"categoryCounts": {
"main": 4,
"class": 960,
"class": 970,
"enum": 155,
"slot": 1906,
"slot": 1904,
"module": 4
},
"categories": [
@ -1020,11 +1020,41 @@
"path": "modules/classes/ConfidenceThreshold.yaml",
"category": "class"
},
{
"name": "Conflict",
"path": "modules/classes/Conflict.yaml",
"category": "class"
},
{
"name": "ConflictStatus",
"path": "modules/classes/ConflictStatus.yaml",
"category": "class"
},
{
"name": "ConflictType",
"path": "modules/classes/ConflictType.yaml",
"category": "class"
},
{
"name": "ConflictTypes",
"path": "modules/classes/ConflictTypes.yaml",
"category": "class"
},
{
"name": "ConnectionDegree",
"path": "modules/classes/ConnectionDegree.yaml",
"category": "class"
},
{
"name": "ConnectionDegreeType",
"path": "modules/classes/ConnectionDegreeType.yaml",
"category": "class"
},
{
"name": "ConnectionDegreeTypes",
"path": "modules/classes/ConnectionDegreeTypes.yaml",
"category": "class"
},
{
"name": "ConnectionNetwork",
"path": "modules/classes/ConnectionNetwork.yaml",
@ -2940,6 +2970,21 @@
"path": "modules/classes/PerformingArtsArchiveRecordSetTypes.yaml",
"category": "class"
},
{
"name": "Permission",
"path": "modules/classes/Permission.yaml",
"category": "class"
},
{
"name": "PermissionType",
"path": "modules/classes/PermissionType.yaml",
"category": "class"
},
{
"name": "PermissionTypes",
"path": "modules/classes/PermissionTypes.yaml",
"category": "class"
},
{
"name": "Person",
"path": "modules/classes/Person.yaml",
@ -3675,6 +3720,11 @@
"path": "modules/classes/SocialMediaProfile.yaml",
"category": "class"
},
{
"name": "SocialNetworkMember",
"path": "modules/classes/SocialNetworkMember.yaml",
"category": "class"
},
{
"name": "SoundArchive",
"path": "modules/classes/SoundArchive.yaml",
@ -5687,21 +5737,6 @@
"path": "modules/slots/begin_of_the_end.yaml",
"category": "slot"
},
{
"name": "birth_edtf",
"path": "modules/slots/birth_edtf.yaml",
"category": "slot"
},
{
"name": "birth_iso_date",
"path": "modules/slots/birth_iso_date.yaml",
"category": "slot"
},
{
"name": "canonical_access_rule",
"path": "modules/slots/canonical_access_rule.yaml",
"category": "slot"
},
{
"name": "canonical_value",
"path": "modules/slots/canonical_value.yaml",
@ -5917,21 +5952,6 @@
"path": "modules/slots/confidence_value.yaml",
"category": "slot"
},
{
"name": "conflict_status",
"path": "modules/slots/conflict_status.yaml",
"category": "slot"
},
{
"name": "connection",
"path": "modules/slots/connection.yaml",
"category": "slot"
},
{
"name": "connection_degree",
"path": "modules/slots/connection_degree.yaml",
"category": "slot"
},
{
"name": "connection_heritage_relevant",
"path": "modules/slots/connection_heritage_relevant.yaml",
@ -9037,6 +9057,11 @@
"path": "modules/slots/has_or_had_business_criticality.yaml",
"category": "slot"
},
{
"name": "has_or_had_canonical_form",
"path": "modules/slots/has_or_had_canonical_form.yaml",
"category": "slot"
},
{
"name": "has_or_had_capacity",
"path": "modules/slots/has_or_had_capacity.yaml",
@ -9182,6 +9207,11 @@
"path": "modules/slots/has_or_had_date_of_birth.yaml",
"category": "slot"
},
{
"name": "has_or_had_degree",
"path": "modules/slots/has_or_had_degree.yaml",
"category": "slot"
},
{
"name": "has_or_had_depositing_organization",
"path": "modules/slots/has_or_had_depositing_organization.yaml",
@ -9532,6 +9562,11 @@
"path": "modules/slots/has_or_had_net_asset.yaml",
"category": "slot"
},
{
"name": "has_or_had_notation",
"path": "modules/slots/has_or_had_notation.yaml",
"category": "slot"
},
{
"name": "has_or_had_note",
"path": "modules/slots/has_or_had_note.yaml",
@ -10977,6 +11012,11 @@
"path": "modules/slots/is_or_was_instance_of.yaml",
"category": "slot"
},
{
"name": "is_or_was_involved_in",
"path": "modules/slots/is_or_was_involved_in.yaml",
"category": "slot"
},
{
"name": "is_or_was_listed_in",
"path": "modules/slots/is_or_was_listed_in.yaml",

View file

@ -25,8 +25,7 @@ imports:
- ../slots/is_or_was_generated_by
- ./GenerationEvent
- ./ConfidenceScore
- ../slots/birth_edtf
- ../slots/birth_iso_date
# REMOVED 2026-01-22: birth_edtf, birth_iso_date → temporal_extent (TimeSpan.has_or_had_notation) per slot_fixes.yaml feedback
# MIGRATED 2026-01-22: birth_source_text → has_or_had_reference + Reference per slot_fixes.yaml feedback
- ../slots/has_or_had_reference
- ./Reference
@ -84,10 +83,11 @@ classes:
```yaml
has_or_had_date_of_birth:
birth_edtf: "1970-08-15"
birth_iso_date: "1970-08-15"
temporal_extent:
has_or_had_notation: "1970-08-15"
begin_of_the_begin: "1970-08-15T00:00:00Z"
end_of_the_end: "1970-08-15T23:59:59Z"
is_inferred: false
confidence: high
```
exact_mappings:
- schema:Date
@ -97,8 +97,7 @@ classes:
related_mappings:
- pico:PersonObservation
slots:
- birth_edtf
- birth_iso_date
# REMOVED 2026-01-22: birth_edtf, birth_iso_date → temporal_extent (TimeSpan.has_or_had_notation)
# MIGRATED 2026-01-22: birth_source_text → has_or_had_reference + Reference
- has_or_had_reference
- is_inferred
@ -107,36 +106,11 @@ classes:
- is_or_was_generated_by
- specificity_annotation
- has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
# MIGRATED 2026-01-22: Added for semantic interoperability (keeps birth_edtf for EDTF fidelity)
# PRIMARY: temporal_extent with TimeSpan (has_or_had_notation preserves EDTF string)
- temporal_extent
slot_usage:
birth_edtf:
range: string
required: true
description: >-
Birth date in EDTF notation (Extended Date/Time Format).
Supports incomplete dates, uncertainty, and approximation.
examples:
- value: "1970-08-15"
description: Full date known
- value: "1970-08"
description: Year and month known
- value: "1970"
description: Only year known
- value: "197X"
description: Decade known (1970s)
- value: "1970~"
description: Approximate (circa 1970)
- value: "XXXX"
description: Unknown (requires search provenance)
birth_iso_date:
range: date
required: false
description: >-
Birth date as ISO 8601 date (YYYY-MM-DD) when full date is known.
Optional - use birth_edtf for partial/uncertain dates.
examples:
- value: "1970-08-15"
# REMOVED 2026-01-22: birth_edtf, birth_iso_date slot_usage
# EDTF notation now stored in temporal_extent.has_or_had_notation
has_or_had_reference:
range: Reference
required: false
@ -192,43 +166,56 @@ classes:
description: Low confidence inferred date
temporal_extent:
range: TimeSpan
required: false
required: true
inlined: true
description: >-
CIDOC-CRM TimeSpan representation for semantic interoperability.
MIGRATED 2026-01-22: Added per slot_fixes.yaml feedback.
CIDOC-CRM TimeSpan representation with EDTF notation preservation.
MIGRATED 2026-01-22: Replaces birth_edtf and birth_iso_date per slot_fixes.yaml feedback.
For a full date (e.g., birth_edtf: "1970-08-15"):
**STRUCTURE**:
- has_or_had_notation: Original EDTF string (e.g., "1970-08-15", "197X", "1970~")
- begin_of_the_begin: Earliest possible start (ISO 8601)
- end_of_the_end: Latest possible end (ISO 8601)
**EXAMPLES**:
Full date "1970-08-15":
- has_or_had_notation: "1970-08-15"
- begin_of_the_begin: "1970-08-15T00:00:00Z"
- end_of_the_end: "1970-08-15T23:59:59Z"
For a decade (e.g., birth_edtf: "197X"):
Decade "197X":
- has_or_had_notation: "197X"
- begin_of_the_begin: "1970-01-01T00:00:00Z"
- end_of_the_end: "1979-12-31T23:59:59Z"
The birth_edtf slot retains the original EDTF notation for fidelity.
examples:
- value:
has_or_had_notation: "1970-08-15"
begin_of_the_begin: "1970-08-15T00:00:00Z"
end_of_the_end: "1970-08-15T23:59:59Z"
description: Full date known - point in time
description: Full date known - EDTF and TimeSpan bounds
- value:
has_or_had_notation: "197X"
begin_of_the_begin: "1970-01-01T00:00:00Z"
end_of_the_end: "1979-12-31T23:59:59Z"
description: Decade known (1970s) - 10-year range
description: Decade known (1970s) - EDTF with 10-year range
- value:
has_or_had_notation: "1970~"
begin_of_the_begin: "1968-01-01T00:00:00Z"
end_of_the_end: "1972-12-31T23:59:59Z"
description: Approximate (circa 1970) - EDTF with uncertainty range
comments:
- "Replaces simple birth_date string slot (Rule 53)"
- "EDTF notation enables uncertain/incomplete date representation"
- "MIGRATED 2026-01-22: birth_edtf, birth_iso_date → temporal_extent.has_or_had_notation"
- "TimeSpan provides CIDOC-CRM E52 temporal bounds with EDTF notation preservation"
- "Inference provenance required when is_inferred=true (Rule 45)"
- "Source text preservation supports archival/historical research"
- "Source text preserved via has_or_had_reference → Reference"
see_also:
- https://www.loc.gov/standards/datetime/
- https://schema.org/birthDate
examples:
- value:
birth_edtf: "1970-08-15"
birth_iso_date: "1970-08-15"
temporal_extent:
has_or_had_notation: "1970-08-15"
begin_of_the_begin: "1970-08-15T00:00:00Z"
end_of_the_end: "1970-08-15T23:59:59Z"
is_inferred: false
@ -236,10 +223,10 @@ classes:
has_or_had_score:
has_or_had_score: 0.95
has_or_had_method: "birth_certificate_extraction"
description: Full date known with high confidence (EDTF + TimeSpan)
description: Full date known with high confidence
- value:
birth_edtf: "197X"
temporal_extent:
has_or_had_notation: "197X"
begin_of_the_begin: "1970-01-01T00:00:00Z"
end_of_the_end: "1979-12-31T23:59:59Z"
is_inferred: true
@ -248,10 +235,10 @@ classes:
has_or_had_score:
has_or_had_score: 0.40
has_or_had_method: "education_inference"
description: Decade inferred from education start year (EDTF + TimeSpan range)
description: Decade inferred from education start year
- value:
birth_edtf: "1823"
temporal_extent:
has_or_had_notation: "1823"
begin_of_the_begin: "1823-01-01T00:00:00Z"
end_of_the_end: "1823-12-31T23:59:59Z"
has_or_had_reference:

View file

@ -0,0 +1,163 @@
# Conflict class
# Created 2026-01-22 per slot_fixes.yaml revision for conflict_status (Rule 53)
#
# Generation date: 2026-01-22
# Rule compliance: 53 (slot_fixes.yaml), 39 (RiC-O naming), 0b (Type/Types pattern)
#
# Represents a conflict event affecting heritage custodians
id: https://nde.nl/ontology/hc/class/Conflict
name: conflict_class
title: Conflict Class
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
crm: http://www.cidoc-crm.org/cidoc-crm/
schema: http://schema.org/
prov: http://www.w3.org/ns/prov#
default_prefix: hc
imports:
- linkml:types
- ./TimeSpan
- ./ConflictType
- ./ConflictTypes
- ./ConflictStatus
- ../slots/has_or_had_type
- ../slots/has_or_had_label
- ../slots/has_or_had_description
- ../slots/temporal_extent
- ../slots/has_or_had_documentation_source
classes:
Conflict:
class_uri: crm:E5_Event
description: |
A conflict event affecting heritage custodians.
**DEFINITION**:
A Conflict represents an armed conflict, natural disaster, or other
destructive event that impacts heritage institutions. This class
captures the CONFLICT ITSELF, while ConflictStatus captures the
STATUS of a specific custodian affected by the conflict.
**SEMANTIC PATTERN**:
```
Custodian
└── is_or_was_involved_in → Conflict (THIS CLASS)
├── has_or_had_type → ConflictType (ARMED_CONFLICT, NATURAL_DISASTER, etc.)
├── has_or_had_label: "Gaza War 2023-2024"
├── temporal_extent → TimeSpan (duration of conflict)
└── involvement_status → ConflictStatus (status of THIS custodian)
```
**DISTINCTION FROM ConflictStatus**:
- **Conflict** (THIS CLASS): The conflict event itself (e.g., "Gaza War 2023")
- **ConflictStatus**: The status of a specific custodian (DESTROYED, DAMAGED, etc.)
A single Conflict can affect multiple custodians, each with different statuses.
**CIDOC-CRM ALIGNMENT**:
- Primary: `crm:E5_Event` - "comprises occurrences in spacetime that can be
delimited within a defined extent of the spacetime"
- Specialization: `crm:E6_Destruction` when resulting in destruction
**USE CASES**:
1. **Gaza 2023-2024**: Armed conflict affecting 30+ heritage institutions
2. **Syrian Civil War**: Ongoing conflict affecting museums and archives
3. **Nepal Earthquake 2015**: Natural disaster affecting heritage sites
4. **Iraq War**: Looting and destruction of cultural heritage
Created as part of conflict_status migration per slot_fixes.yaml (Rule 53).
exact_mappings:
- crm:E5_Event
close_mappings:
- crm:E6_Destruction
- schema:Event
related_mappings:
- prov:Activity
slots:
- has_or_had_type
- has_or_had_label
- has_or_had_description
- temporal_extent
- has_or_had_documentation_source
attributes:
involvement_status:
range: ConflictStatus
description: |
The status of a specific custodian's involvement in this conflict.
Uses ConflictStatus class with DESTROYED, DAMAGED, THREATENED, etc.
inlined: true
slot_usage:
has_or_had_type:
range: ConflictType
required: true
description: |
The type of conflict (ARMED_CONFLICT, NATURAL_DISASTER, etc.).
Uses ConflictType class hierarchy per Rule 0b.
has_or_had_label:
description: Human-readable name for the conflict.
examples:
- value:
label_text: "Gaza War 2023-2024"
language: en
- value:
label_text: "Syrian Civil War"
language: en
has_or_had_description:
description: Detailed description of the conflict and its impact on heritage.
temporal_extent:
description: |
Time period of the conflict.
Uses TimeSpan class with fuzzy temporal bounds.
examples:
- value:
begin_of_the_begin: "2023-10-07"
end_of_the_end: null
description: "Gaza War - ongoing as of 2024"
has_or_had_documentation_source:
description: Sources documenting the conflict's impact on heritage.
examples:
- value: "UNESCO Cultural Heritage in Gaza Assessment"
- value: "Librarians and Archivists with Palestine - Gaza Report 2024"
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Conflicts can affect all heritage custodian types.
specificity_score: 0.55
specificity_rationale: Specialized event type for conflict documentation.
comments:
- "Created 2026-01-22 per slot_fixes.yaml conflict_status migration"
- "Separates the CONFLICT from the CUSTODIAN'S STATUS in that conflict"
- "Enables linking multiple custodians to the same conflict event"
examples:
- value:
has_or_had_type: ARMED_CONFLICT
has_or_had_label:
label_text: "Gaza War 2023-2024"
language: en
has_or_had_description:
description_text: "Armed conflict beginning October 2023 affecting Gaza heritage institutions"
temporal_extent:
begin_of_the_begin: "2023-10-07"
has_or_had_documentation_source:
- "Librarians and Archivists with Palestine"
- "UNESCO Cultural Heritage Assessment"
involvement_status:
status: destroyed
destruction_date: "2023-12-08"
conflict_description: "Library destroyed by airstrike"
description: "Gaza heritage institution destroyed in conflict"

View file

@ -0,0 +1,66 @@
# ConflictType class (abstract base)
# Created 2026-01-22 per slot_fixes.yaml revision for conflict_status (Rule 53)
#
# Generation date: 2026-01-22
# Rule compliance: 53 (slot_fixes.yaml), 0b (Type/Types naming pattern)
#
# Abstract base class for conflict type taxonomy
id: https://nde.nl/ontology/hc/class/ConflictType
name: conflict_type_class
title: Conflict Type Class (Abstract)
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
skos: http://www.w3.org/2004/02/skos/core#
default_prefix: hc
imports:
- linkml:types
classes:
ConflictType:
class_uri: skos:Concept
abstract: true
description: |
Abstract base class for conflict type taxonomy.
**DEFINITION**:
ConflictType defines the type of conflict or disaster affecting
heritage institutions. Concrete types are defined in ConflictTypes.yaml
per Rule 0b (Type/Types naming pattern).
**TAXONOMY**:
- **ARMED_CONFLICT**: War, military operations, armed insurgency
- **NATURAL_DISASTER**: Earthquake, flood, hurricane, fire
- **CIVIL_UNREST**: Riots, protests, civil disorder
- **TERRORISM**: Targeted attacks on cultural heritage
- **LOOTING**: Systematic theft of cultural objects
- **NEGLECT**: Abandonment leading to destruction
**SKOS ALIGNMENT**:
Maps to `skos:Concept` for vocabulary alignment.
Created as part of conflict_status migration per slot_fixes.yaml (Rule 53).
exact_mappings:
- skos:Concept
slots: []
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Conflict types apply to all heritage contexts.
specificity_score: 0.50
specificity_rationale: Specialized type taxonomy for conflict classification.
type_types_pattern: "This is the Type (singular) file - see ConflictTypes.yaml for concrete subclasses"
comments:
- "Abstract base class - use ConflictTypes subclasses"
- "Created 2026-01-22 per slot_fixes.yaml conflict_status migration"
- "Rule 0b: Type file (singular) + Types file (plural for subclasses)"

View file

@ -0,0 +1,113 @@
# ConflictTypes - Concrete conflict type subclasses
# Created 2026-01-22 per slot_fixes.yaml revision for conflict_status (Rule 53)
#
# Generation date: 2026-01-22
# Rule compliance: 53 (slot_fixes.yaml), 0b (Type/Types naming pattern)
#
# Concrete subclasses of ConflictType
id: https://nde.nl/ontology/hc/class/ConflictTypes
name: conflict_types_class
title: Conflict Types (Subclasses)
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
wd: http://www.wikidata.org/entity/
default_prefix: hc
imports:
- linkml:types
- ./ConflictType
classes:
ArmedConflict:
is_a: ConflictType
class_uri: hc:ArmedConflict
description: |
War, military operations, or armed insurgency affecting heritage.
Examples: Gaza War 2023, Syrian Civil War, Iraq War.
exact_mappings:
- wd:Q350604
annotations:
wikidata: Q350604
examples: "Gaza 2023-2024, Syria 2011-present, Iraq 2003-2011"
NaturalDisaster:
is_a: ConflictType
class_uri: hc:NaturalDisaster
description: |
Earthquake, flood, hurricane, wildfire, or other natural events.
Examples: Nepal Earthquake 2015, Notre-Dame Fire 2019.
exact_mappings:
- wd:Q8065
annotations:
wikidata: Q8065
examples: "Nepal 2015, Haiti 2010, Katrina 2005"
CivilUnrest:
is_a: ConflictType
class_uri: hc:CivilUnrest
description: |
Riots, protests, or civil disorder affecting heritage sites.
Examples: 2020 protests, Arab Spring.
exact_mappings:
- wd:Q124757
annotations:
wikidata: Q124757
examples: "Minneapolis 2020, Cairo 2011"
Terrorism:
is_a: ConflictType
class_uri: hc:Terrorism
description: |
Deliberate targeted attacks on cultural heritage.
Examples: Palmyra destruction by ISIS, Bamiyan Buddhas.
exact_mappings:
- wd:Q7283
annotations:
wikidata: Q7283
examples: "Palmyra 2015, Bamiyan 2001, Timbuktu 2012"
Looting:
is_a: ConflictType
class_uri: hc:Looting
description: |
Systematic theft of cultural objects during conflict.
Examples: Iraq National Museum 2003.
exact_mappings:
- wd:Q844182
annotations:
wikidata: Q844182
examples: "Iraq Museum 2003, Afghan antiquities"
Neglect:
is_a: ConflictType
class_uri: hc:Neglect
description: |
Abandonment or lack of maintenance leading to deterioration.
Non-violent but resulting in loss of heritage.
annotations:
examples: "Abandoned archives, unmaintained buildings"
Occupation:
is_a: ConflictType
class_uri: hc:Occupation
description: |
Military or foreign occupation affecting heritage management.
Heritage may be intact but access/control restricted.
exact_mappings:
- wd:Q188686
annotations:
wikidata: Q188686
examples: "West Bank heritage sites, Crimea museums"
Sanctions:
is_a: ConflictType
class_uri: hc:Sanctions
description: |
Economic sanctions affecting heritage institution operations.
May prevent restoration, acquisition, or international cooperation.
annotations:
examples: "Iran, North Korea, Syria - international isolation"

View file

@ -0,0 +1,94 @@
# ConnectionDegree class
# Created 2026-01-22 per slot_fixes.yaml revision for connection_degree (Rule 53)
#
# Represents the degree of connection in a social network
id: https://nde.nl/ontology/hc/class/ConnectionDegree
name: connection_degree_class
title: Connection Degree 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_type
- ../slots/has_or_had_description
- ./ConnectionDegreeType
- ./ConnectionDegreeTypes
classes:
ConnectionDegree:
class_uri: hc:ConnectionDegree
description: |
Represents the degree of connection between two people in a social network.
**DEFINITION**:
ConnectionDegree captures the "distance" in a social network graph:
- **1st degree**: Direct mutual connection
- **2nd degree**: One person between viewer and connection
- **3rd+ degree**: Two or more people between
**IMPORTANT**: The degree is relative to the VIEWER (person conducting
the search), NOT the target profile being analyzed. See AGENTS.md Rule 17.
**SEMANTIC PATTERN**:
```
PersonConnection
└── has_or_had_degree → ConnectionDegree (THIS CLASS)
└── has_or_had_type → ConnectionDegreeType (FIRST, SECOND, THIRD_PLUS)
```
**MIGRATION NOTE** (Rule 53, 2026-01-22):
Created as part of connection_degree migration. Wraps the simple enum
in a structured class for consistency with other Type/Types patterns.
exact_mappings:
- schema:QuantitativeValue
slots:
- has_or_had_type
- has_or_had_description
slot_usage:
has_or_had_type:
range: ConnectionDegreeType
required: true
description: |
The type of connection degree (FIRST, SECOND, THIRD_PLUS).
Uses ConnectionDegreeType class hierarchy.
examples:
- value: FIRST
description: "First-degree (direct) connection"
- value: SECOND
description: "Second-degree connection (friend of friend)"
has_or_had_description:
description: Optional description of the connection context.
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Connection degrees apply to any heritage sector network.
specificity_score: 0.65
specificity_rationale: Specialized class for LinkedIn network analysis.
comments:
- "Created 2026-01-22 per slot_fixes.yaml connection_degree migration"
- "Degree is relative to VIEWER, not target profile"
- "Uses ConnectionDegreeType class hierarchy per Rule 0b"
examples:
- value:
has_or_had_type: FIRST
description: "First-degree direct connection"
- value:
has_or_had_type: SECOND
has_or_had_description:
description_text: "Connected through mutual colleague"
description: "Second-degree connection with context"

View file

@ -0,0 +1,73 @@
# ConnectionDegreeType class (abstract base)
# Created 2026-01-22 per slot_fixes.yaml revision for connection_degree (Rule 53)
# Following Rule 0b: Type/Types naming convention
#
# Abstract base class for connection degree types
id: https://nde.nl/ontology/hc/class/ConnectionDegreeType
name: connection_degree_type_class
title: Connection Degree Type Class
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
skos: http://www.w3.org/2004/02/skos/core#
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_label
- ../slots/has_or_had_description
classes:
ConnectionDegreeType:
class_uri: skos:Concept
abstract: true
description: |
Abstract base class for connection degree types in social networks.
**RULE 0b COMPLIANT**:
This is the ABSTRACT BASE CLASS (singular "Type") defining the taxonomy.
Concrete subclasses are defined in `ConnectionDegreeTypes.yaml` (plural).
**DEGREE HIERARCHY**:
| Type | Description | Example |
|------|-------------|---------|
| FIRST | Direct mutual connection | Colleagues, friends |
| SECOND | One person between | Friend of a friend |
| THIRD_PLUS | Two or more between | Extended network |
**LINKEDIN SPECIFIC**:
Connection degree is determined by LinkedIn's algorithm based on
mutual connections and network proximity. The degree is relative
to the VIEWER (person conducting the search).
Created as part of connection_degree migration per slot_fixes.yaml (Rule 53).
exact_mappings:
- skos:Concept
slots:
- has_or_had_label
- has_or_had_description
slot_usage:
has_or_had_label:
description: Human-readable label for this degree type.
has_or_had_description:
description: Description of what this degree level means.
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Connection degrees apply to all heritage sector networks.
specificity_score: 0.65
specificity_rationale: Specialized taxonomy for LinkedIn network analysis.
comments:
- "Abstract base class - see ConnectionDegreeTypes.yaml for concrete subclasses"
- "Per Rule 0b: Type (singular) = abstract base, Types (plural) = concrete subclasses"
- "Created 2026-01-22 per slot_fixes.yaml connection_degree migration"

View file

@ -0,0 +1,75 @@
# ConnectionDegreeTypes class
# Created 2026-01-22 per slot_fixes.yaml revision for connection_degree (Rule 53)
# Type/Types pattern (Rule 0b): This is the plural file with concrete subclasses
#
# Generation date: 2026-01-22
# Rule compliance: 53 (slot_fixes.yaml), 0b (Type/Types pattern), 39 (RiC-O naming)
id: https://nde.nl/ontology/hc/class/ConnectionDegreeTypes
name: connection_degree_types_class
title: Connection Degree Types Class
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#
default_prefix: hc
imports:
- linkml:types
- ./ConnectionDegreeType
classes:
FirstDegreeConnection:
is_a: ConnectionDegreeType
class_uri: hc:FirstDegreeConnection
description: |
Direct mutual connection (1st degree).
Both parties have accepted the connection request.
This represents the closest professional relationship
on LinkedIn.
annotations:
degree_value: "1st"
degree_numeric: 1
comments:
- "Direct connection - mutual acceptance required"
- "Replaces ConnectionDegreeEnum.1st"
SecondDegreeConnection:
is_a: ConnectionDegreeType
class_uri: hc:SecondDegreeConnection
description: |
Connected through one mutual connection (2nd degree).
The viewer is connected to someone who is connected
to this person. One person between viewer and target.
annotations:
degree_value: "2nd"
degree_numeric: 2
comments:
- "One mutual connection between viewer and target"
- "Replaces ConnectionDegreeEnum.2nd"
ThirdPlusDegreeConnection:
is_a: ConnectionDegreeType
class_uri: hc:ThirdPlusDegreeConnection
description: |
Connected through two or more people (3rd+ degree).
The network distance is three or more hops. LinkedIn
groups these together as "3rd+" connections.
annotations:
degree_value: "3rd+"
degree_numeric: 3
comments:
- "Two or more people between viewer and target"
- "Replaces ConnectionDegreeEnum.3rd+"

View file

@ -18,26 +18,16 @@ imports:
- ./HeritageTypeCount
- ./SpecificityAnnotation
- ./TemplateSpecificityScore # was: TemplateSpecificityScores - migrated per Rule 53 (2026-01-17)
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ../slots/connection
- ./SocialNetworkMember
# MIGRATED 2026-01-22: connection → has_or_had_member + SocialNetworkMember (Rule 53)
- ../slots/has_or_had_member
- ../slots/network_analysis
- ../slots/note
- ../slots/source_metadata
- ../slots/specificity_annotation
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
- ../slots/connection
- ../slots/network_analysis
- ../slots/source_metadata
- ../slots/specificity_annotation
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
- ../slots/connection
- ../slots/network_analysis
- ../slots/source_metadata
- ../slots/specificity_annotation
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
default_range: string
classes:
ConnectionNetwork:
@ -83,7 +73,8 @@ classes:
close_mappings:
- prov:Collection
slots:
- connection
# MIGRATED 2026-01-22: connection → has_or_had_member (Rule 53)
- has_or_had_member
- network_analysis
- source_metadata
- specificity_annotation
@ -93,12 +84,17 @@ classes:
range: ConnectionSourceMetadata
required: true
inlined: true
connection:
range: PersonConnection
# MIGRATED 2026-01-22: connection → has_or_had_member + SocialNetworkMember (Rule 53)
has_or_had_member:
range: PersonConnection # PersonConnection is a type of SocialNetworkMember
required: true
multivalued: true
inlined: true
inlined_as_list: true
description: |
Network connections/members extracted from LinkedIn.
MIGRATED from connection slot per slot_fixes.yaml (Rule 53, 2026-01-22).
Uses PersonConnection as range (subtype of SocialNetworkMember).
network_analysis:
range: NetworkAnalysis
inlined: true

View file

@ -34,7 +34,11 @@ imports:
- ../slots/data_license_policy
- ../slots/has_or_had_safeguard
- ../slots/temporal_extent # was: time_of_destruction - migrated per Rule 53 (2026-01-15)
- ../slots/conflict_status
# MIGRATED 2026-01-22: conflict_status → is_or_was_involved_in + Conflict (Rule 53)
- ../slots/is_or_was_involved_in
- ./Conflict
- ./ConflictType
- ./ConflictTypes
- ../slots/mission_statement
- ./DataLicensePolicy
- ./MissionStatement
@ -187,7 +191,8 @@ classes:
- schema:MedicalOrganization
- schema:SportsOrganization
slots:
- conflict_status
# MIGRATED 2026-01-22: conflict_status → is_or_was_involved_in + Conflict (Rule 53)
- is_or_was_involved_in
- created
- has_or_had_custodian_type
- data_license_policy

View file

@ -18,7 +18,11 @@ imports:
- ../slots/has_or_had_scope # was: type_scope - migrated per Rule 53 (2026-01-15)
- ./Scope # for has_or_had_scope range (2026-01-15)
- ../slots/has_archdiocese_name
- ../slots/canonical_access_rule
# MIGRATED 2026-01-22: canonical_access_rule → requires_or_required + Permission per slot_fixes.yaml
- ../slots/requires_or_required
- ./Permission
- ./PermissionType
- ./PermissionTypes
- ../slots/has_or_had_custodian_type
- ../slots/diocese_name
- ../slots/ecclesiastical_province
@ -42,7 +46,7 @@ classes:
class_uri: schema:ArchiveOrganization
slots:
- has_archdiocese_name
- canonical_access_rule
- requires_or_required # was: canonical_access_rule - migrated 2026-01-22
- has_or_had_custodian_type
- diocese_name
- ecclesiastical_province
@ -100,11 +104,18 @@ classes:
end_of_the_begin: "0695-12-31"
founding_description: "Established circa 695 by St. Willibrord"
description: Diocese of Utrecht established ~695
canonical_access_rule:
range: boolean
requires_or_required:
range: Permission
inlined: true
multivalued: true
description: |
Permissions/authorizations required for access.
MIGRATED 2026-01-22: Replaces canonical_access_rule boolean with structured Permission.
examples:
- value: true
description: Canon law rules apply
- value:
has_or_had_type: BishopsPermission
has_or_had_description: "Written permission from diocesan bishop required for personnel files"
description: Bishop's permission for sensitive records
has_or_had_custodian_type:
equals_expression: '["hc:ArchiveOrganizationType", "hc:HolySacredSiteType"]'
exact_mappings:

View file

@ -0,0 +1,80 @@
id: https://nde.nl/ontology/hc/class/Permission
name: Permission
title: Permission Class
description: >-
Represents a specific permission/authorization requirement for accessing
heritage materials.
**USE CASES**:
- Bishop's permission for diocesan archive access
- Institutional affiliation for research library
- Security clearance for government archives
**EXAMPLE**:
```yaml
Permission:
has_or_had_type: BishopsPermission
has_or_had_description: "Written permission from the diocesan bishop required"
temporal_extent:
begin_of_the_begin: "2000-01-01"
```
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
rico: https://www.ica.org/standards/RiC/ontology#
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_type
- ../slots/has_or_had_description
- ../slots/temporal_extent
- ./PermissionType
- ./PermissionTypes
- ./TimeSpan
classes:
Permission:
class_uri: rico:AccessCondition
description: >-
A permission or authorization requirement for accessing materials.
exact_mappings:
- rico:AccessCondition
slots:
- has_or_had_type
- has_or_had_description
- temporal_extent
slot_usage:
has_or_had_type:
range: PermissionType
required: true
description: >-
The type of permission required.
examples:
- value: BishopsPermission
description: Bishop's permission for ecclesiastical archives
has_or_had_description:
range: string
description: >-
Human-readable description of the permission requirement.
examples:
- value: "Written permission from the diocesan bishop required for access to personnel files"
temporal_extent:
range: TimeSpan
inlined: true
description: >-
When this permission requirement is/was in effect.
examples:
- value:
has_or_had_type: BishopsPermission
has_or_had_description: "Written permission from the diocesan bishop required"
description: Ecclesiastical archive permission
- value:
has_or_had_type: InstitutionalAffiliation
has_or_had_description: "Must be affiliated with accredited research institution"
description: Research library permission
annotations:
custodian_types: '["*"]'
specificity_score: 0.5

View file

@ -0,0 +1,38 @@
id: https://nde.nl/ontology/hc/class/PermissionType
name: PermissionType
title: Permission Type (Abstract Base)
description: >-
Abstract base class for types of permissions/authorizations required to access
heritage materials.
**TYPE/TYPES PATTERN (Rule 0b)**:
- This file: Abstract base class (PermissionType.yaml)
- Subclasses file: Concrete permission types (PermissionTypes.yaml)
**USE CASES**:
- Ecclesiastical archives requiring bishop's permission
- Research archives requiring institutional affiliation
- Restricted collections requiring special clearance
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
rico: https://www.ica.org/standards/RiC/ontology#
default_prefix: hc
imports:
- linkml:types
classes:
PermissionType:
class_uri: hc:PermissionType
abstract: true
description: >-
Abstract base class for permission/authorization types.
Subclasses define specific permission categories.
close_mappings:
- rico:AccessCondition
annotations:
custodian_types: '["*"]'
specificity_score: 0.5

View file

@ -0,0 +1,82 @@
id: https://nde.nl/ontology/hc/class/PermissionTypes
name: PermissionTypes
title: Permission Types (Concrete Subclasses)
description: >-
Concrete permission type subclasses.
**TYPE/TYPES PATTERN (Rule 0b)**:
- Base class file: PermissionType.yaml (abstract)
- This file: Concrete subclasses
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
default_prefix: hc
imports:
- linkml:types
- ./PermissionType
classes:
BishopsPermission:
is_a: PermissionType
class_uri: hc:BishopsPermission
description: >-
Permission from a bishop required to access certain ecclesiastical records.
Common for diocesan archives, especially for:
- Recent personnel files
- Matrimonial dispensation records
- Sensitive correspondence
annotations:
custodian_types: '["H"]'
specificity_score: 0.8
InstitutionalAffiliation:
is_a: PermissionType
class_uri: hc:InstitutionalAffiliation
description: >-
Requires affiliation with an accredited research institution.
Common for university archives and research libraries.
annotations:
custodian_types: '["A", "L", "R"]'
specificity_score: 0.6
SecurityClearance:
is_a: PermissionType
class_uri: hc:SecurityClearance
description: >-
Requires government or institutional security clearance.
Common for government archives with classified materials.
annotations:
custodian_types: '["O", "A"]'
specificity_score: 0.7
OwnerConsent:
is_a: PermissionType
class_uri: hc:OwnerConsent
description: >-
Requires consent from the owner/donor of the materials.
Common for personal papers and donated collections.
annotations:
custodian_types: '["P", "A"]'
specificity_score: 0.6
AppointmentRequired:
is_a: PermissionType
class_uri: hc:AppointmentRequired
description: >-
Requires advance appointment to access materials.
Common for archives and special collections.
annotations:
custodian_types: '["*"]'
specificity_score: 0.4
RegistrationRequired:
is_a: PermissionType
class_uri: hc:RegistrationRequired
description: >-
Requires researcher registration/card to access materials.
annotations:
custodian_types: '["*"]'
specificity_score: 0.3

View file

@ -11,17 +11,22 @@ prefixes:
imports:
- linkml:types
- ../metadata
- ./SocialNetworkMember # Parent class - added 2026-01-22 per Rule 53 connection migration
- ./SpecificityAnnotation
- ./TemplateSpecificityScore # was: TemplateSpecificityScores - migrated per Rule 53 (2026-01-17)
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ../enums/HeritageTypeEnum
- ../enums/NameTypeEnum
- ../enums/ConnectionDegreeEnum
# REMOVED 2026-01-22: ../enums/ConnectionDegreeEnum - replaced by ConnectionDegreeType class hierarchy (Rule 53)
- ../slots/connection_id
- ../slots/connection_name
- ../slots/name_type
- ../slots/connection_degree
# MIGRATED 2026-01-22: connection_degree → has_or_had_degree + ConnectionDegree (Rule 53)
- ../slots/has_or_had_degree
- ./ConnectionDegree
- ./ConnectionDegreeType
- ./ConnectionDegreeTypes
# REMOVED 2026-01-18: ../slots/connection_headline - migrated to has_or_had_description + Description (Rule 53)
- ../slots/has_or_had_description
- ./Description
@ -36,6 +41,7 @@ imports:
default_range: string
classes:
PersonConnection:
is_a: SocialNetworkMember # Added 2026-01-22 per Rule 53 connection migration
class_uri: schema:Person
description: 'A single connection entry from a person''s LinkedIn network.
@ -81,7 +87,8 @@ classes:
related_mappings:
- schema:knows
slots:
- connection_degree
# MIGRATED 2026-01-22: connection_degree → has_or_had_degree + ConnectionDegree (Rule 53)
- has_or_had_degree
- has_or_had_description # was: connection_headline - migrated per Rule 53 (2026-01-18)
- connection_heritage_relevant
- connection_heritage_type
@ -122,12 +129,22 @@ classes:
description: Complete name visible
- value: abbreviated
description: Partial name (privacy setting)
connection_degree:
range: ConnectionDegreeEnum
# MIGRATED 2026-01-22: connection_degree → has_or_had_degree + ConnectionDegree (Rule 53)
has_or_had_degree:
range: ConnectionDegree
required: true
inlined: true
description: |
MIGRATED from connection_degree per slot_fixes.yaml (Rule 53, 2026-01-22).
Connection degree now uses structured ConnectionDegree class with
ConnectionDegreeType hierarchy instead of simple enum.
examples:
- value: 2nd
description: Second-degree connection
- value:
has_or_had_type: SecondDegreeConnection
description: Second-degree connection (connected through one mutual connection)
- value:
has_or_had_type: FirstDegreeConnection
description: First-degree direct connection
has_or_had_description: # was: connection_headline - migrated per Rule 53/56 (2026-01-18)
description: |
MIGRATED from connection_headline per slot_fixes.yaml (Rule 53/56, 2026-01-18).
@ -187,7 +204,7 @@ classes:
- Inlined in ConnectionNetwork.connections[] as multivalued list
- connection_id enables deduplication across multiple connection lists
- name_type classification per AGENTS.md Rule 17
- connection_degree is relative to VIEWER, not target profile
- has_or_had_degree (was connection_degree) is relative to VIEWER, not target profile
see_also:
- https://schema.org/Person
- https://schema.org/knows

View file

@ -178,14 +178,18 @@ classes:
required: false
examples:
- value: |
birth_edtf: "1970-08-15"
temporal_extent:
has_or_had_notation: "1970-08-15"
begin_of_the_begin: "1970-08-15T00:00:00Z"
end_of_the_end: "1970-08-15T23:59:59Z"
is_inferred: false
confidence: HIGH
description: Full date known
- value: |
birth_edtf: "197X"
temporal_extent:
has_or_had_notation: "197X"
begin_of_the_begin: "1970-01-01T00:00:00Z"
end_of_the_end: "1979-12-31T23:59:59Z"
is_inferred: true
confidence: LOW
description: Decade inferred from career start
has_or_had_place_of_birth:
description: >-

View file

@ -0,0 +1,102 @@
# SocialNetworkMember class
# Created 2026-01-22 per slot_fixes.yaml revision for connection (Rule 53)
#
# Generation date: 2026-01-22
# Rule compliance: 53 (slot_fixes.yaml), 39 (RiC-O naming)
#
# Represents a member in a social/professional network
id: https://nde.nl/ontology/hc/class/SocialNetworkMember
name: social_network_member_class
title: Social Network Member Class
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
foaf: http://xmlns.com/foaf/0.1/
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_identifier
- ../slots/has_or_had_label
- ../slots/has_or_had_description
- ../slots/linkedin_profile_url
classes:
SocialNetworkMember:
class_uri: foaf:Person
description: |
A member in a social or professional network.
**DEFINITION**:
SocialNetworkMember represents a person who is part of a professional
network (LinkedIn, ORCID, etc.) in the context of heritage sector
network analysis.
**RELATIONSHIP TO PersonConnection**:
`PersonConnection` is a subclass/specialization that includes
additional metadata about the connection relationship (degree,
heritage relevance, etc.). `SocialNetworkMember` is the base
class for any network member.
**USE CASES**:
1. LinkedIn connection network analysis
2. Heritage sector professional mapping
3. Cross-institutional collaboration discovery
4. Alumni and association network analysis
**SEMANTIC PATTERN**:
```
ConnectionNetwork
└── has_or_had_member → SocialNetworkMember (THIS CLASS)
├── has_or_had_identifier: LinkedIn URL
├── has_or_had_label: Person name
└── (subclasses add connection-specific metadata)
```
Created as part of connection migration per slot_fixes.yaml (Rule 53).
exact_mappings:
- foaf:Person
close_mappings:
- schema:Person
slots:
- has_or_had_identifier
- has_or_had_label
- has_or_had_description
- linkedin_profile_url
slot_usage:
has_or_had_identifier:
description: Unique identifier for this network member (LinkedIn URL, ORCID, etc.).
has_or_had_label:
description: Name of the network member.
linkedin_profile_url:
description: LinkedIn profile URL if available.
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Network members can be associated with any heritage type.
specificity_score: 0.60
specificity_rationale: Specialized class for social network analysis.
comments:
- "Base class for network members - PersonConnection extends this"
- "Created 2026-01-22 per slot_fixes.yaml connection migration"
- "Enables heritage sector network analysis"
examples:
- value:
has_or_had_label:
label_text: "Jan de Vries"
linkedin_profile_url: "https://www.linkedin.com/in/jan-de-vries-heritage/"
description: "Heritage professional as network member"

View file

@ -18,23 +18,11 @@ imports:
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
- ./SpecificityAnnotation
- ./TemplateSpecificityScore # was: TemplateSpecificityScores - migrated per Rule 53 (2026-01-17)
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ./Timestamp
- ../slots/begin_of_the_begin
- ../slots/begin_of_the_end
- ../slots/end_of_the_begin
- ../slots/end_of_the_end
- ../slots/specificity_annotation
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
- ../slots/begin_of_the_begin
- ../slots/begin_of_the_end
- ../slots/end_of_the_begin
- ../slots/end_of_the_end
- ../slots/specificity_annotation
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
# ADDED 2026-01-22: has_or_had_notation for EDTF string preservation per slot_fixes.yaml feedback
- ../slots/has_or_had_notation
default_range: string
classes:
TimeSpan:
@ -90,6 +78,33 @@ classes:
- end_of_the_end
- specificity_annotation
- has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
# ADDED 2026-01-22: Preserves original EDTF notation (e.g., "197X", "1970~")
- has_or_had_notation
slot_usage:
has_or_had_notation:
range: string
required: false
description: >-
Original EDTF (Extended Date/Time Format) notation string.
Preserves the exact notation used to express temporal uncertainty.
**EDTF PATTERNS**:
| Pattern | Meaning | Example |
|---------|---------|---------|
| `YYYY-MM-DD` | Full date | `1970-08-15` |
| `YYYY-MM` | Year-month | `1970-08` |
| `YYYY` | Year only | `1970` |
| `YYYX` | Decade | `197X` (1970s) |
| `YYYY~` | Approximate | `1970~` (circa) |
| `YYYY?` | Uncertain | `1970?` |
| `XXXX` | Unknown | Requires provenance |
examples:
- value: "1970-08-15"
description: Full date known
- value: "197X"
description: Decade known (1970s)
- value: "1970~"
description: Approximate (circa 1970)
attributes:
notes:
range: string

View file

@ -0,0 +1,50 @@
id: https://nde.nl/ontology/hc/slot/has_or_had_canonical_form
name: has_or_had_canonical_form_slot
title: Has or Had Canonical Form Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
skos: http://www.w3.org/2004/02/skos/core#
dcterms: http://purl.org/dc/terms/
imports:
- linkml:types
default_range: string
slots:
has_or_had_canonical_form:
slot_uri: skos:notation
description: >-
Links to a CanonicalForm representing the normalized/canonical representation.
**PURPOSE**:
- Enables consistent storage and matching
- Supports deduplication across records
- Facilitates database joins
**EXAMPLES**:
- ISNI: "0000 0001 2146 5765" → canonical: "0000000121465765"
- Wikidata: "http://www.wikidata.org/entity/Q190804" → canonical: "Q190804"
- DOI: "https://doi.org/10.1234/example" → canonical: "10.1234/example"
**NORMALIZATION RULES**:
- ISNI: Remove all spaces
- Wikidata: Extract Q-number only
- VIAF: Numeric portion only
- DOI: Lowercase, no resolver prefix
- ISIL: Keep as-is (already canonical)
**ONTOLOGY ALIGNMENT**:
- slot_uri: skos:notation (primary - notation/code)
MIGRATED 2026-01-22: Replaces canonical_value slot per slot_fixes.yaml feedback.
range: CanonicalForm
inlined: true
exact_mappings:
- skos:notation
close_mappings:
- skos:prefLabel
broad_mappings:
- rdf:value
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Canonical forms are universal across all identifier types

View file

@ -0,0 +1,64 @@
# has_or_had_degree slot
# Created 2026-01-22 per slot_fixes.yaml revision for connection_degree (Rule 53)
#
# Generic slot for degree/level relationships with temporal semantics
id: https://nde.nl/ontology/hc/slot/has_or_had_degree
name: has_or_had_degree_slot
title: Has Or Had Degree Slot
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_degree:
slot_uri: hc:hasOrHadDegree
description: |
The degree, level, or intensity of a relationship or measurement.
**Temporal Semantics** (RiC-O Pattern):
The "hasOrHad" naming follows RiC-O convention indicating this relationship
may be current or historical.
**USE CASES**:
1. **Connection degree**: 1st, 2nd, 3rd+ LinkedIn connection degree
2. **Qualification degree**: Bachelor, Master, PhD
3. **Relationship degree**: Close, moderate, distant
**MIGRATION NOTE** (Rule 53, 2026-01-22):
Created as part of connection_degree migration. The previous pattern
used a simple enum value. The new pattern wraps the degree in a
structured class for better extensibility.
range: uriorcurie
multivalued: false
required: false
exact_mappings:
- schema:educationalLevel
close_mappings:
- schema:intensity
annotations:
rico_naming_convention: |
Follows RiC-O "hasOrHad" pattern for temporal predicates.
See Rule 39: Slot Naming Convention (RiC-O Style)
replaces_slots: "connection_degree"
migration_date: "2026-01-22"
custodian_types: '["*"]'
specificity_score: 0.45
specificity_rationale: Generic degree relationship applicable across contexts.
examples:
- value: "hc:ConnectionDegreeType/FIRST"
description: "First-degree (direct) connection"
- value: "hc:ConnectionDegreeType/SECOND"
description: "Second-degree connection"

View file

@ -17,19 +17,23 @@ prefixes:
imports:
- linkml:types
# Range broadened 2026-01-22 per Rule 55 - accepts Custodian OR SocialNetworkMember
# Classes narrow via slot_usage as needed
- ../classes/Custodian
slots:
has_or_had_member:
slot_uri: org:hasMember
description: |
Custodians that are or were members of this encompassing body
(network, consortium, umbrella organization).
Members of an encompassing body, network, or social network.
**RiC-O Temporal Pattern**: Uses `hasOrHad*` pattern to explicitly
acknowledge that membership relationships can change over time.
Members may join and leave networks.
**Usage Contexts**:
- EncompassingBody: Custodians as members (range: Custodian)
- ConnectionNetwork: Persons as members (range: SocialNetworkMember/PersonConnection)
**Membership Types**:
Members can have different participation levels:
- Full members: Voting rights, full service access
@ -37,7 +41,10 @@ slots:
- Observer status: Information sharing only
For detailed membership modeling, use Membership class (future extension).
range: Custodian
Range broadened per Rule 55 (2026-01-22) to support both organizational
and social network membership patterns.
range: Any # Broadened per Rule 55 - classes narrow via slot_usage
multivalued: true
exact_mappings:

View file

@ -0,0 +1,38 @@
id: https://nde.nl/ontology/hc/slot/has_or_had_notation
name: has_or_had_notation_slot
title: Has or Had Notation Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
skos: http://www.w3.org/2004/02/skos/core#
dcterms: http://purl.org/dc/terms/
imports:
- linkml:types
default_range: string
slots:
has_or_had_notation:
slot_uri: skos:notation
description: >-
A notation, code, or symbolic representation using a defined scheme.
**USE CASES**:
- EDTF (Extended Date/Time Format) strings for temporal data
- Classification codes
- Symbolic representations
**EXAMPLES**:
- EDTF: "1970-08-15", "197X", "1970~", "1970?"
- Classification: "025.4", "NK 2.1"
**ONTOLOGY ALIGNMENT**:
- slot_uri: skos:notation (primary)
- Notation preserves original format/encoding
range: string
exact_mappings:
- skos:notation
close_mappings:
- dcterms:identifier
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Notations are universal across all heritage custodian types

View file

@ -0,0 +1,77 @@
# is_or_was_involved_in slot
# Created 2026-01-22 per slot_fixes.yaml revision for conflict_status (Rule 53)
#
# Generation date: 2026-01-22
# Rule compliance: 38 (slot centralization), 39 (RiC-O naming), 53 (slot_fixes.yaml)
#
# Generic involvement relationship slot
id: https://nde.nl/ontology/hc/slot/is_or_was_involved_in
name: is_or_was_involved_in_slot
title: Is Or Was Involved In Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
crm: http://www.cidoc-crm.org/cidoc-crm/
prov: http://www.w3.org/ns/prov#
default_prefix: hc
imports:
- linkml:types
- ../classes/Conflict
slots:
is_or_was_involved_in:
slot_uri: crm:P11i_participated_in
description: |
Events, activities, or situations that an entity was or is involved in.
**Temporal Semantics** (RiC-O Pattern):
The "isOrWas" naming follows RiC-O convention indicating
the involvement may be historical or current.
**CIDOC-CRM Alignment**:
- Primary: `crm:P11i_participated_in` - inverse of P11 "had participant"
- Related: `prov:wasInvolvedIn` - PROV-O involvement
**Use Cases**:
- Heritage custodians involved in armed conflicts
- Institutions involved in preservation projects
- Organizations involved in cultural programs
**Range**: Conflict (or subclasses/related event classes)
Created as part of conflict_status migration per slot_fixes.yaml (Rule 53).
range: Conflict
required: false
multivalued: true
inlined: true
inlined_as_list: true
exact_mappings:
- crm:P11i_participated_in
close_mappings:
- prov:wasInvolvedIn
annotations:
rico_naming_convention: |
Follows RiC-O "isOrWas" pattern for temporal predicates.
See Rule 39: Slot Naming Convention (RiC-O Style)
replaces_slots: "conflict_status"
migration_date: "2026-01-22"
custodian_types: '["*"]'
custodian_types_rationale: Involvement applies to all heritage types.
specificity_score: 0.50
specificity_rationale: Generic involvement relationship.
examples:
- value:
conflict_name: "Gaza War 2023-2024"
has_or_had_type: ARMED_CONFLICT
involvement_status:
status: destroyed
destruction_date: "2023-12-08"
description: "Custodian destroyed in Gaza conflict"

View file

@ -17,9 +17,7 @@
"has_or_had_base.yaml",
"begin_of_the_begin.yaml",
"begin_of_the_end.yaml",
"birth_edtf.yaml",
"birth_iso_date.yaml",
"canonical_access_rule.yaml",
"has_or_had_notation.yaml",
"canonical_value.yaml",
"capacity.yaml",
"capacity_type.yaml",
@ -67,10 +65,10 @@
"confidence.yaml",
"confidence_method.yaml",
"confidence_score.yaml",
"confidence_threshold.yaml",
"__ARCHIVED_20260122__confidence_threshold.yaml",
"confidence_value.yaml",
"conflict_status.yaml",
"connection.yaml",
"__ARCHIVED_20260122__conflict_status.yaml",
"__ARCHIVED_20260122__connection.yaml",
"connection_degree.yaml",
"connection_heritage_relevant.yaml",
"connection_heritage_type.yaml",
@ -888,6 +886,7 @@
"has_or_had_text_region.yaml",
"has_or_had_text_segment.yaml",
"has_or_had_thematic_route.yaml",
"has_or_had_threshold.yaml",
"has_or_had_thumbnail.yaml",
"has_or_had_time_interval.yaml",
"has_or_had_timestamp.yaml",
@ -1078,6 +1077,7 @@
"is_or_was_included_in.yaml",
"is_or_was_indexed.yaml",
"is_or_was_instance_of.yaml",
"is_or_was_involved_in.yaml",
"is_or_was_listed_in.yaml",
"is_or_was_located_in.yaml",
"is_or_was_located_within.yaml",

View file

@ -7578,7 +7578,17 @@ fixes:
This would enhance semantic interoperability without losing the original data.'
done: true
response: "Completed 2026-01-22 by claude-sonnet-4. Added temporal_extent slot to BirthDate.yaml linking to TimeSpan. Retained birth_edtf for EDTF fidelity. Examples updated to show both EDTF notation and TimeSpan representation."
response: "Completed 2026-01-22 by claude-sonnet-4. FULLY MIGRATED: birth_edtf removed from BirthDate.yaml. Created has_or_had_notation slot for EDTF preservation in TimeSpan. BirthDate uses temporal_extent → TimeSpan.has_or_had_notation."
feedback:
- timestamp: '2026-01-22T10:15:00Z'
reviewer: Simon C. Kemper
comment: 'DO NOT KEEP https://nde.nl/ontology/hc/slot/birth_edtf!
If TimeSpan is now used for temporal_extent, the original EDTF slot is redundant.
Consider deprecating birth_edtf to avoid confusion and ensure data consistency.'
done: true
response: "Completed 2026-01-22 by claude-sonnet-4. REMOVED birth_edtf slot from BirthDate.yaml. Created has_or_had_notation slot (skos:notation) for EDTF string preservation. BirthDate now uses temporal_extent → TimeSpan with has_or_had_notation for EDTF. Slot archived to archive/birth_edtf_archived_20260122.yaml."
- original_slot_id: https://nde.nl/ontology/hc/slot/birth_iso_date
revision:
- label: temporal_extent
@ -7616,7 +7626,17 @@ fixes:
This would align with best practices for temporal data modeling.'
done: true
response: "Completed 2026-01-22 by claude-sonnet-4. Added temporal_extent slot to BirthDate.yaml (same migration as birth_edtf). BirthDate now has both birth_iso_date (for machine-readable ISO dates) and temporal_extent (for TimeSpan representation). This provides flexibility for uncertain dates."
response: "Completed 2026-01-22 by claude-sonnet-4. FULLY MIGRATED: birth_iso_date removed from BirthDate.yaml. BirthDate uses temporal_extent → TimeSpan.has_or_had_notation for EDTF preservation (full dates represented as EDTF e.g. '1970-08-15')."
feedback:
- timestamp: '2026-01-22T10:20:00Z'
reviewer: Simon C. Kemper
comment: 'DO NOT KEEP https://nde.nl/ontology/hc/slot/birth_iso_date!
If TimeSpan is now used for temporal_extent, the original ISO date slot is redundant.
Consider deprecating birth_iso_date to avoid confusion and ensure data consistency.'
done: true
response: "Completed 2026-01-22 by claude-sonnet-4. REMOVED birth_iso_date slot from BirthDate.yaml. BirthDate now uses temporal_extent → TimeSpan (has_or_had_notation preserves EDTF including full dates). Slot archived to archive/birth_iso_date_archived_20260122.yaml."
- original_slot_id: https://nde.nl/ontology/hc/slot/birth_source_text
revision:
- label: has_or_had_provenance
@ -7894,7 +7914,8 @@ fixes:
would enhance semantic clarity and allow for richer metadata about access rules.
This would align with best practices for modeling access conditions.'
done: false
done: true
response: "Completed 2026-01-22 by claude-sonnet-4. Created Permission.yaml, PermissionType.yaml (abstract), PermissionTypes.yaml (with BishopsPermission, InstitutionalAffiliation, etc.). Migrated DiocesanArchive.yaml to use requires_or_required → Permission. canonical_access_rule.yaml archived."
- original_slot_id: https://nde.nl/ontology/hc/slot/canonical_value
revision:
- label: has_or_had_canonical_form
@ -11154,6 +11175,26 @@ fixes:
type: slot
- label: ConfidenceThreshold
type: class
processed:
status: true
date: '2026-01-22'
agent: claude-claude-sonnet-4-20250514
notes: |
**Migration #50: confidence_threshold** ✅ COMPLETE
**Pattern**: confidence_threshold → has_or_had_threshold + ConfidenceThreshold
**NOTE**: Revision specifies "has_or_had_treshold" (typo) - implemented with correct spelling "has_or_had_threshold"
**Files Used** (pre-existing):
- has_or_had_threshold.yaml: Generic threshold slot
- ConfidenceThreshold.yaml: Class for confidence threshold specification
**Files Modified**:
- Methodology.yaml: Migrated confidence_threshold to has_or_had_threshold + ConfidenceThreshold
- Updated imports, slots list, slot_usage, examples
**Archived**: modules/slots/archive/confidence_threshold_archived_20260122.yaml
- original_slot_id: https://nde.nl/ontology/hc/slot/confidence_value
revision:
- label: has_or_had_value
@ -11180,12 +11221,60 @@ fixes:
type: slot
- label: ConflictTypes
type: class
processed:
status: true
date: '2026-01-22'
agent: claude-claude-sonnet-4-20250514
notes: |
**Migration #51: conflict_status** ✅ COMPLETE
**Pattern**: conflict_status → is_or_was_involved_in + Conflict + has_or_had_type + ConflictType/ConflictTypes
**Semantic Change**:
- Old: Custodian has a conflict STATUS (destroyed, damaged, etc.)
- New: Custodian is_or_was_involved_in a CONFLICT (event) which has a TYPE
- ConflictStatus class preserved as attribute of Conflict for custodian-specific status
**Files Created**:
- is_or_was_involved_in.yaml: Slot for conflict involvement (crm:P11i_participated_in)
- Conflict.yaml: Class representing conflict events (crm:E5_Event)
- ConflictType.yaml: Abstract base class for conflict taxonomy
- ConflictTypes.yaml: Concrete conflict types (ArmedConflict, NaturalDisaster, CivilUnrest, etc.)
**Files Modified**:
- Custodian.yaml: Migrated conflict_status to is_or_was_involved_in + Conflict
- Updated imports, slots list
**Preserved**: ConflictStatus.yaml retained for custodian-specific status within Conflict
**Archived**: modules/slots/archive/conflict_status_archived_20260122.yaml
- original_slot_id: https://nde.nl/ontology/hc/slot/connection
revision:
- label: has_or_had_member
type: slot
- label: SocialNetworkMember
type: class
processed:
status: true
date: '2026-01-22'
agent: claude-claude-sonnet-4-20250514
notes: |
**Migration #57: connection** ✅ COMPLETE
**Pattern**: connection → has_or_had_member + SocialNetworkMember
**Files Used** (pre-existing):
- has_or_had_member.yaml: Generic membership slot
- SocialNetworkMember.yaml: Base class for network members
- PersonConnection.yaml: Already has `is_a: SocialNetworkMember`
**Files Modified**:
- ConnectionNetwork.yaml: Migrated connection to has_or_had_member
- Updated imports (removed connection, added has_or_had_member, SocialNetworkMember)
- Updated slots list
- Updated slot_usage with description
**Archived**: modules/slots/archive/connection_archived_20260122.yaml
- original_slot_id: https://nde.nl/ontology/hc/slot/connection_degree
revision:
- label: has_or_had_degree
@ -11200,6 +11289,28 @@ fixes:
type: slot
- label: ConnectionDegreeTypes
type: class
processed:
status: true
date: '2026-01-22'
agent: claude-claude-sonnet-4-20250514
notes: |
**Migration #58: connection_degree** ✅ COMPLETE
**Pattern**: connection_degree → has_or_had_degree + ConnectionDegree + Type/Types hierarchy
**Files Created**:
- has_or_had_degree.yaml: Generic degree slot
- ConnectionDegree.yaml: Class wrapping degree value
- ConnectionDegreeType.yaml: Abstract base class (pre-existing)
- ConnectionDegreeTypes.yaml: Concrete subclasses (pre-existing)
**Files Modified**:
- PersonConnection.yaml: Migrated connection_degree to has_or_had_degree + ConnectionDegree
- Updated imports
- Updated slots list
- Updated slot_usage with ConnectionDegree range and examples
**Archived**: modules/slots/archive/connection_degree_archived_20260122.yaml
- original_slot_id: https://nde.nl/ontology/hc/slot/connection_headline
revision:
- label: has_or_had_description
@ -14837,5 +14948,283 @@ fixes:
type: slot
- label: Label
type: class
# https://nde.nl/ontology/hc/slot/has_appellation_type
# https://nde.nl/ontology/hc/slot/has_appellation_type
- original_slot_id: https://nde.nl/ontology/hc/slot/administrative_context
revision:
- label: is_or_was_used_in
type: slot
- label: GovernanceStructure
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/based_on_claim
revision:
- label: is_or_was_based_on
type: slot
- label: Claim
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_architectural_style
revision:
- label: has_or_had_style
type: slot
- label: ArchitecturalStyle
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_archival_reference
revision:
- label: has_or_had_identifier
type: slot
- label: ArchivalReference
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_archive_description
revision:
- label: has_or_had_description
type: slot
- label: Description
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_archive_memento_uri
revision:
- label: is_or_was_archived_as
type: slot
- label: Memento
type: class
- label: has_or_had_url
type: slot
- label: URL
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_archive_name
revision:
- label: has_or_had_label
type: slot
- label: Label
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_archive_path
revision:
- label: has_or_had_provenance
type: slot
- label: Provenance
type: class
- label: has_or_had_provenance_path
type: slot
- label: ProvenancePath
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_archive_search_score
revision:
- label: has_or_had_score
type: slot
- label: SearchScore
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_arrangement
revision:
- label: has_or_had_arrangement
type: slot
- label: Arrangement
type: class
- label: has_or_had_type
type: slot
- label: ArrangementType
type: class
- label: includes_or_included
type: slot
- label: ArrangementTypes
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_arrangement_level
revision:
- label: has_or_had_arrangement
type: slot
- label: Arrangement
type: class
- label: has_or_had_type
type: slot
- label: ArrangementType
type: class
- label: includes_or_included
type: slot
- label: ArrangementTypes
type: class
- label: has_or_had_level
type: slot
- label: ArrangementLevel
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_arrangement_note
revision:
- label: has_or_had_arrangement
type: slot
- label: Arrangement
type: class
- label: has_or_had_note
type: slot
- label: Note
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_articles_archival_stage
revision:
- label: has_or_had_status
type: slot
- label: RecordCycleStatus
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_articles_document_format
revision:
- label: has_or_had_format
type: slot
- label: DocumentFormat
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_articles_document_url
revision:
- label: has_or_had_url
type: slot
- label: URL
type: class
- orignal_slot_id: https://nde.nl/ontology/hc/slot/has_articles_of_association
revision:
- label: has_or_had_document
type: slot
- label: ArticlesOfAssociation
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_aspect_ratio
revision:
- label: has_or_had_degree
type: slot
- label: AspectRatio
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_assertion_date
revision:
- label: is_or_was_asserted_on
type: slot
- label: TimeSpan
type: class
- label: start_of_the_start
type: slot
- label: Timestamp
type: class
- orignal_slot_id: https://nde.nl/ontology/hc/slot/has_assertion_rationale
revision:
- label: has_or_had_rationale
type: slot
- label: Rationale
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_assertion_value
revision:
- label: has_or_had_value
type: slot
- label: Value
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_assessment_category
revision:
- label: has_or_had_category
type: slot
- label: AssessmentCategory
type: class
- orignal_slot_id: https://nde.nl/ontology/hc/slot/has_assessment_date
revision:
- label: is_or_was_assessed_on
type: slot
- label: TimeSpan
type: class
- label: start_of_the_start
type: slot
- label: Timestamp
type: class
- orignal_slot_id: https://nde.nl/ontology/hc/slot/has_associated_taxon
revision:
- label: has_or_had_hypernym
type: slot
- label: Taxon
type: class
- orignal_slot_id: https://nde.nl/ontology/hc/slot/has_auction_house
revision:
- label: is_or_was_conducted_by
type: slot
- label: AuctionHouse
type: class
- orignal_slot_id: https://nde.nl/ontology/hc/slot/has_auction_sale_name
revision:
- label: is_or_was_conducted_by
type: slot
- label: AuctionHouse
type: class
- label: publishes_or_published
type: slot
- label: AuctionSaleCatalog
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_audio_event_segment
revision:
- label: contains_or_contained
type: slot
- label: AudioEventSegment
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_audit_date
revision:
- label: is_or_was_based_on
type: slot
- label: Audit
type: class
- label: temporal_extent
type: slot
- label: TimeSpan
type: class
- label: start_of_the_start
type: slot
- label: Timestamp
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_audit_opinion
revision:
- label: is_or_was_based_on
type: slot
- label: Audit
type: class
- label: draws_or_drew_opinion
type: slot
- label: AuditOpinion
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_auditor_name
revision:
- label: is_or_was_based_on
type: slot
- label: Audit
type: class
- label: is_or_was_conducted_by
type: slot
- label: Auditor
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_authentication_required_flag
revision:
- label: requires_or_required
type: slot
- label: Authentication
type: class
- orignal_slot_id: https://nde.nl/ontology/hc/slot/has_authority_file_abbreviation
revision:
- label: contributes_or_contributed
type: slot
- label: AuthorityData
type: class
- label: has_or_had_label
type: slot
- label: Label
type: class
- label: has_or_had_type
type: slot
- label: LabelType
type: class
- label: includes_or_included
type: slot
- label: LabelTypes
type: class
note: AbbreviationLabel class is defined in the LinkML file
- orignal_slot_id: https://nde.nl/ontology/hc/slot/has_authority_file_name
revision:
- label: contributes_or_contributed
type: slot
- label: AuthorityData
type: class
- label: has_or_had_label
type: slot
- label: Label
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/has_authority_file_url
revision:
- label: contributes_or_contributed
type: slot
- label: AuthorityData
type: class
- label: has_or_had_url
type: slot
- label: URL
type: class
# https://nde.nl/ontology/hc/slot/has_auxiliary_place

View file

@ -578,7 +578,9 @@ class LinkMLSchemaService {
if (this.mainSchema?.slots) {
for (const [name, slot] of Object.entries(this.mainSchema.slots)) {
this.slotSchemas.set(name, { ...slot, name });
if (slot) {
this.slotSchemas.set(name, { ...slot, name });
}
}
}
@ -636,7 +638,7 @@ class LinkMLSchemaService {
const schema = yaml.load(content) as SchemaDefinition;
if (schema?.slots) {
for (const [name, slot] of Object.entries(schema.slots)) {
if (!this.slotSchemas.has(name)) {
if (slot && !this.slotSchemas.has(name)) {
this.slotSchemas.set(name, { ...slot, name });
}
}
@ -721,7 +723,7 @@ class LinkMLSchemaService {
debugLog(`[LinkMLSchemaService] ${fileName}: slots with class/enum ranges: ${slotsWithClassRange.join(', ')}`);
}
for (const [name, slot] of Object.entries(schema.slots)) {
if (!this.slotSchemas.has(name)) {
if (slot && !this.slotSchemas.has(name)) {
this.slotSchemas.set(name, { ...slot, name });
}
}

View file

@ -1,12 +1,12 @@
{
"generated": "2026-01-22T19:17:33.553Z",
"generated": "2026-01-22T19:41:07.059Z",
"schemaRoot": "/schemas/20251121/linkml",
"totalFiles": 3029,
"totalFiles": 3037,
"categoryCounts": {
"main": 4,
"class": 960,
"class": 970,
"enum": 155,
"slot": 1906,
"slot": 1904,
"module": 4
},
"categories": [
@ -1020,11 +1020,41 @@
"path": "modules/classes/ConfidenceThreshold.yaml",
"category": "class"
},
{
"name": "Conflict",
"path": "modules/classes/Conflict.yaml",
"category": "class"
},
{
"name": "ConflictStatus",
"path": "modules/classes/ConflictStatus.yaml",
"category": "class"
},
{
"name": "ConflictType",
"path": "modules/classes/ConflictType.yaml",
"category": "class"
},
{
"name": "ConflictTypes",
"path": "modules/classes/ConflictTypes.yaml",
"category": "class"
},
{
"name": "ConnectionDegree",
"path": "modules/classes/ConnectionDegree.yaml",
"category": "class"
},
{
"name": "ConnectionDegreeType",
"path": "modules/classes/ConnectionDegreeType.yaml",
"category": "class"
},
{
"name": "ConnectionDegreeTypes",
"path": "modules/classes/ConnectionDegreeTypes.yaml",
"category": "class"
},
{
"name": "ConnectionNetwork",
"path": "modules/classes/ConnectionNetwork.yaml",
@ -2940,6 +2970,21 @@
"path": "modules/classes/PerformingArtsArchiveRecordSetTypes.yaml",
"category": "class"
},
{
"name": "Permission",
"path": "modules/classes/Permission.yaml",
"category": "class"
},
{
"name": "PermissionType",
"path": "modules/classes/PermissionType.yaml",
"category": "class"
},
{
"name": "PermissionTypes",
"path": "modules/classes/PermissionTypes.yaml",
"category": "class"
},
{
"name": "Person",
"path": "modules/classes/Person.yaml",
@ -3675,6 +3720,11 @@
"path": "modules/classes/SocialMediaProfile.yaml",
"category": "class"
},
{
"name": "SocialNetworkMember",
"path": "modules/classes/SocialNetworkMember.yaml",
"category": "class"
},
{
"name": "SoundArchive",
"path": "modules/classes/SoundArchive.yaml",
@ -5687,21 +5737,6 @@
"path": "modules/slots/begin_of_the_end.yaml",
"category": "slot"
},
{
"name": "birth_edtf",
"path": "modules/slots/birth_edtf.yaml",
"category": "slot"
},
{
"name": "birth_iso_date",
"path": "modules/slots/birth_iso_date.yaml",
"category": "slot"
},
{
"name": "canonical_access_rule",
"path": "modules/slots/canonical_access_rule.yaml",
"category": "slot"
},
{
"name": "canonical_value",
"path": "modules/slots/canonical_value.yaml",
@ -5917,21 +5952,6 @@
"path": "modules/slots/confidence_value.yaml",
"category": "slot"
},
{
"name": "conflict_status",
"path": "modules/slots/conflict_status.yaml",
"category": "slot"
},
{
"name": "connection",
"path": "modules/slots/connection.yaml",
"category": "slot"
},
{
"name": "connection_degree",
"path": "modules/slots/connection_degree.yaml",
"category": "slot"
},
{
"name": "connection_heritage_relevant",
"path": "modules/slots/connection_heritage_relevant.yaml",
@ -9037,6 +9057,11 @@
"path": "modules/slots/has_or_had_business_criticality.yaml",
"category": "slot"
},
{
"name": "has_or_had_canonical_form",
"path": "modules/slots/has_or_had_canonical_form.yaml",
"category": "slot"
},
{
"name": "has_or_had_capacity",
"path": "modules/slots/has_or_had_capacity.yaml",
@ -9182,6 +9207,11 @@
"path": "modules/slots/has_or_had_date_of_birth.yaml",
"category": "slot"
},
{
"name": "has_or_had_degree",
"path": "modules/slots/has_or_had_degree.yaml",
"category": "slot"
},
{
"name": "has_or_had_depositing_organization",
"path": "modules/slots/has_or_had_depositing_organization.yaml",
@ -9532,6 +9562,11 @@
"path": "modules/slots/has_or_had_net_asset.yaml",
"category": "slot"
},
{
"name": "has_or_had_notation",
"path": "modules/slots/has_or_had_notation.yaml",
"category": "slot"
},
{
"name": "has_or_had_note",
"path": "modules/slots/has_or_had_note.yaml",
@ -10977,6 +11012,11 @@
"path": "modules/slots/is_or_was_instance_of.yaml",
"category": "slot"
},
{
"name": "is_or_was_involved_in",
"path": "modules/slots/is_or_was_involved_in.yaml",
"category": "slot"
},
{
"name": "is_or_was_listed_in",
"path": "modules/slots/is_or_was_listed_in.yaml",

View file

@ -25,8 +25,7 @@ imports:
- ../slots/is_or_was_generated_by
- ./GenerationEvent
- ./ConfidenceScore
- ../slots/birth_edtf
- ../slots/birth_iso_date
# REMOVED 2026-01-22: birth_edtf, birth_iso_date → temporal_extent (TimeSpan.has_or_had_notation) per slot_fixes.yaml feedback
# MIGRATED 2026-01-22: birth_source_text → has_or_had_reference + Reference per slot_fixes.yaml feedback
- ../slots/has_or_had_reference
- ./Reference
@ -84,10 +83,11 @@ classes:
```yaml
has_or_had_date_of_birth:
birth_edtf: "1970-08-15"
birth_iso_date: "1970-08-15"
temporal_extent:
has_or_had_notation: "1970-08-15"
begin_of_the_begin: "1970-08-15T00:00:00Z"
end_of_the_end: "1970-08-15T23:59:59Z"
is_inferred: false
confidence: high
```
exact_mappings:
- schema:Date
@ -97,8 +97,7 @@ classes:
related_mappings:
- pico:PersonObservation
slots:
- birth_edtf
- birth_iso_date
# REMOVED 2026-01-22: birth_edtf, birth_iso_date → temporal_extent (TimeSpan.has_or_had_notation)
# MIGRATED 2026-01-22: birth_source_text → has_or_had_reference + Reference
- has_or_had_reference
- is_inferred
@ -107,36 +106,11 @@ classes:
- is_or_was_generated_by
- specificity_annotation
- has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
# MIGRATED 2026-01-22: Added for semantic interoperability (keeps birth_edtf for EDTF fidelity)
# PRIMARY: temporal_extent with TimeSpan (has_or_had_notation preserves EDTF string)
- temporal_extent
slot_usage:
birth_edtf:
range: string
required: true
description: >-
Birth date in EDTF notation (Extended Date/Time Format).
Supports incomplete dates, uncertainty, and approximation.
examples:
- value: "1970-08-15"
description: Full date known
- value: "1970-08"
description: Year and month known
- value: "1970"
description: Only year known
- value: "197X"
description: Decade known (1970s)
- value: "1970~"
description: Approximate (circa 1970)
- value: "XXXX"
description: Unknown (requires search provenance)
birth_iso_date:
range: date
required: false
description: >-
Birth date as ISO 8601 date (YYYY-MM-DD) when full date is known.
Optional - use birth_edtf for partial/uncertain dates.
examples:
- value: "1970-08-15"
# REMOVED 2026-01-22: birth_edtf, birth_iso_date slot_usage
# EDTF notation now stored in temporal_extent.has_or_had_notation
has_or_had_reference:
range: Reference
required: false
@ -192,43 +166,56 @@ classes:
description: Low confidence inferred date
temporal_extent:
range: TimeSpan
required: false
required: true
inlined: true
description: >-
CIDOC-CRM TimeSpan representation for semantic interoperability.
MIGRATED 2026-01-22: Added per slot_fixes.yaml feedback.
CIDOC-CRM TimeSpan representation with EDTF notation preservation.
MIGRATED 2026-01-22: Replaces birth_edtf and birth_iso_date per slot_fixes.yaml feedback.
For a full date (e.g., birth_edtf: "1970-08-15"):
**STRUCTURE**:
- has_or_had_notation: Original EDTF string (e.g., "1970-08-15", "197X", "1970~")
- begin_of_the_begin: Earliest possible start (ISO 8601)
- end_of_the_end: Latest possible end (ISO 8601)
**EXAMPLES**:
Full date "1970-08-15":
- has_or_had_notation: "1970-08-15"
- begin_of_the_begin: "1970-08-15T00:00:00Z"
- end_of_the_end: "1970-08-15T23:59:59Z"
For a decade (e.g., birth_edtf: "197X"):
Decade "197X":
- has_or_had_notation: "197X"
- begin_of_the_begin: "1970-01-01T00:00:00Z"
- end_of_the_end: "1979-12-31T23:59:59Z"
The birth_edtf slot retains the original EDTF notation for fidelity.
examples:
- value:
has_or_had_notation: "1970-08-15"
begin_of_the_begin: "1970-08-15T00:00:00Z"
end_of_the_end: "1970-08-15T23:59:59Z"
description: Full date known - point in time
description: Full date known - EDTF and TimeSpan bounds
- value:
has_or_had_notation: "197X"
begin_of_the_begin: "1970-01-01T00:00:00Z"
end_of_the_end: "1979-12-31T23:59:59Z"
description: Decade known (1970s) - 10-year range
description: Decade known (1970s) - EDTF with 10-year range
- value:
has_or_had_notation: "1970~"
begin_of_the_begin: "1968-01-01T00:00:00Z"
end_of_the_end: "1972-12-31T23:59:59Z"
description: Approximate (circa 1970) - EDTF with uncertainty range
comments:
- "Replaces simple birth_date string slot (Rule 53)"
- "EDTF notation enables uncertain/incomplete date representation"
- "MIGRATED 2026-01-22: birth_edtf, birth_iso_date → temporal_extent.has_or_had_notation"
- "TimeSpan provides CIDOC-CRM E52 temporal bounds with EDTF notation preservation"
- "Inference provenance required when is_inferred=true (Rule 45)"
- "Source text preservation supports archival/historical research"
- "Source text preserved via has_or_had_reference → Reference"
see_also:
- https://www.loc.gov/standards/datetime/
- https://schema.org/birthDate
examples:
- value:
birth_edtf: "1970-08-15"
birth_iso_date: "1970-08-15"
temporal_extent:
has_or_had_notation: "1970-08-15"
begin_of_the_begin: "1970-08-15T00:00:00Z"
end_of_the_end: "1970-08-15T23:59:59Z"
is_inferred: false
@ -236,10 +223,10 @@ classes:
has_or_had_score:
has_or_had_score: 0.95
has_or_had_method: "birth_certificate_extraction"
description: Full date known with high confidence (EDTF + TimeSpan)
description: Full date known with high confidence
- value:
birth_edtf: "197X"
temporal_extent:
has_or_had_notation: "197X"
begin_of_the_begin: "1970-01-01T00:00:00Z"
end_of_the_end: "1979-12-31T23:59:59Z"
is_inferred: true
@ -248,10 +235,10 @@ classes:
has_or_had_score:
has_or_had_score: 0.40
has_or_had_method: "education_inference"
description: Decade inferred from education start year (EDTF + TimeSpan range)
description: Decade inferred from education start year
- value:
birth_edtf: "1823"
temporal_extent:
has_or_had_notation: "1823"
begin_of_the_begin: "1823-01-01T00:00:00Z"
end_of_the_end: "1823-12-31T23:59:59Z"
has_or_had_reference:

View file

@ -0,0 +1,94 @@
# ConnectionDegree class
# Created 2026-01-22 per slot_fixes.yaml revision for connection_degree (Rule 53)
#
# Represents the degree of connection in a social network
id: https://nde.nl/ontology/hc/class/ConnectionDegree
name: connection_degree_class
title: Connection Degree 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_type
- ../slots/has_or_had_description
- ./ConnectionDegreeType
- ./ConnectionDegreeTypes
classes:
ConnectionDegree:
class_uri: hc:ConnectionDegree
description: |
Represents the degree of connection between two people in a social network.
**DEFINITION**:
ConnectionDegree captures the "distance" in a social network graph:
- **1st degree**: Direct mutual connection
- **2nd degree**: One person between viewer and connection
- **3rd+ degree**: Two or more people between
**IMPORTANT**: The degree is relative to the VIEWER (person conducting
the search), NOT the target profile being analyzed. See AGENTS.md Rule 17.
**SEMANTIC PATTERN**:
```
PersonConnection
└── has_or_had_degree → ConnectionDegree (THIS CLASS)
└── has_or_had_type → ConnectionDegreeType (FIRST, SECOND, THIRD_PLUS)
```
**MIGRATION NOTE** (Rule 53, 2026-01-22):
Created as part of connection_degree migration. Wraps the simple enum
in a structured class for consistency with other Type/Types patterns.
exact_mappings:
- schema:QuantitativeValue
slots:
- has_or_had_type
- has_or_had_description
slot_usage:
has_or_had_type:
range: ConnectionDegreeType
required: true
description: |
The type of connection degree (FIRST, SECOND, THIRD_PLUS).
Uses ConnectionDegreeType class hierarchy.
examples:
- value: FIRST
description: "First-degree (direct) connection"
- value: SECOND
description: "Second-degree connection (friend of friend)"
has_or_had_description:
description: Optional description of the connection context.
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Connection degrees apply to any heritage sector network.
specificity_score: 0.65
specificity_rationale: Specialized class for LinkedIn network analysis.
comments:
- "Created 2026-01-22 per slot_fixes.yaml connection_degree migration"
- "Degree is relative to VIEWER, not target profile"
- "Uses ConnectionDegreeType class hierarchy per Rule 0b"
examples:
- value:
has_or_had_type: FIRST
description: "First-degree direct connection"
- value:
has_or_had_type: SECOND
has_or_had_description:
description_text: "Connected through mutual colleague"
description: "Second-degree connection with context"

View file

@ -0,0 +1,73 @@
# ConnectionDegreeType class (abstract base)
# Created 2026-01-22 per slot_fixes.yaml revision for connection_degree (Rule 53)
# Following Rule 0b: Type/Types naming convention
#
# Abstract base class for connection degree types
id: https://nde.nl/ontology/hc/class/ConnectionDegreeType
name: connection_degree_type_class
title: Connection Degree Type Class
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
skos: http://www.w3.org/2004/02/skos/core#
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_label
- ../slots/has_or_had_description
classes:
ConnectionDegreeType:
class_uri: skos:Concept
abstract: true
description: |
Abstract base class for connection degree types in social networks.
**RULE 0b COMPLIANT**:
This is the ABSTRACT BASE CLASS (singular "Type") defining the taxonomy.
Concrete subclasses are defined in `ConnectionDegreeTypes.yaml` (plural).
**DEGREE HIERARCHY**:
| Type | Description | Example |
|------|-------------|---------|
| FIRST | Direct mutual connection | Colleagues, friends |
| SECOND | One person between | Friend of a friend |
| THIRD_PLUS | Two or more between | Extended network |
**LINKEDIN SPECIFIC**:
Connection degree is determined by LinkedIn's algorithm based on
mutual connections and network proximity. The degree is relative
to the VIEWER (person conducting the search).
Created as part of connection_degree migration per slot_fixes.yaml (Rule 53).
exact_mappings:
- skos:Concept
slots:
- has_or_had_label
- has_or_had_description
slot_usage:
has_or_had_label:
description: Human-readable label for this degree type.
has_or_had_description:
description: Description of what this degree level means.
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Connection degrees apply to all heritage sector networks.
specificity_score: 0.65
specificity_rationale: Specialized taxonomy for LinkedIn network analysis.
comments:
- "Abstract base class - see ConnectionDegreeTypes.yaml for concrete subclasses"
- "Per Rule 0b: Type (singular) = abstract base, Types (plural) = concrete subclasses"
- "Created 2026-01-22 per slot_fixes.yaml connection_degree migration"

View file

@ -0,0 +1,75 @@
# ConnectionDegreeTypes class
# Created 2026-01-22 per slot_fixes.yaml revision for connection_degree (Rule 53)
# Type/Types pattern (Rule 0b): This is the plural file with concrete subclasses
#
# Generation date: 2026-01-22
# Rule compliance: 53 (slot_fixes.yaml), 0b (Type/Types pattern), 39 (RiC-O naming)
id: https://nde.nl/ontology/hc/class/ConnectionDegreeTypes
name: connection_degree_types_class
title: Connection Degree Types Class
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#
default_prefix: hc
imports:
- linkml:types
- ./ConnectionDegreeType
classes:
FirstDegreeConnection:
is_a: ConnectionDegreeType
class_uri: hc:FirstDegreeConnection
description: |
Direct mutual connection (1st degree).
Both parties have accepted the connection request.
This represents the closest professional relationship
on LinkedIn.
annotations:
degree_value: "1st"
degree_numeric: 1
comments:
- "Direct connection - mutual acceptance required"
- "Replaces ConnectionDegreeEnum.1st"
SecondDegreeConnection:
is_a: ConnectionDegreeType
class_uri: hc:SecondDegreeConnection
description: |
Connected through one mutual connection (2nd degree).
The viewer is connected to someone who is connected
to this person. One person between viewer and target.
annotations:
degree_value: "2nd"
degree_numeric: 2
comments:
- "One mutual connection between viewer and target"
- "Replaces ConnectionDegreeEnum.2nd"
ThirdPlusDegreeConnection:
is_a: ConnectionDegreeType
class_uri: hc:ThirdPlusDegreeConnection
description: |
Connected through two or more people (3rd+ degree).
The network distance is three or more hops. LinkedIn
groups these together as "3rd+" connections.
annotations:
degree_value: "3rd+"
degree_numeric: 3
comments:
- "Two or more people between viewer and target"
- "Replaces ConnectionDegreeEnum.3rd+"

View file

@ -18,26 +18,16 @@ imports:
- ./HeritageTypeCount
- ./SpecificityAnnotation
- ./TemplateSpecificityScore # was: TemplateSpecificityScores - migrated per Rule 53 (2026-01-17)
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ../slots/connection
- ./SocialNetworkMember
# MIGRATED 2026-01-22: connection → has_or_had_member + SocialNetworkMember (Rule 53)
- ../slots/has_or_had_member
- ../slots/network_analysis
- ../slots/note
- ../slots/source_metadata
- ../slots/specificity_annotation
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
- ../slots/connection
- ../slots/network_analysis
- ../slots/source_metadata
- ../slots/specificity_annotation
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
- ../slots/connection
- ../slots/network_analysis
- ../slots/source_metadata
- ../slots/specificity_annotation
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
default_range: string
classes:
ConnectionNetwork:
@ -83,7 +73,8 @@ classes:
close_mappings:
- prov:Collection
slots:
- connection
# MIGRATED 2026-01-22: connection → has_or_had_member (Rule 53)
- has_or_had_member
- network_analysis
- source_metadata
- specificity_annotation
@ -93,12 +84,17 @@ classes:
range: ConnectionSourceMetadata
required: true
inlined: true
connection:
range: PersonConnection
# MIGRATED 2026-01-22: connection → has_or_had_member + SocialNetworkMember (Rule 53)
has_or_had_member:
range: PersonConnection # PersonConnection is a type of SocialNetworkMember
required: true
multivalued: true
inlined: true
inlined_as_list: true
description: |
Network connections/members extracted from LinkedIn.
MIGRATED from connection slot per slot_fixes.yaml (Rule 53, 2026-01-22).
Uses PersonConnection as range (subtype of SocialNetworkMember).
network_analysis:
range: NetworkAnalysis
inlined: true

View file

@ -11,17 +11,22 @@ prefixes:
imports:
- linkml:types
- ../metadata
- ./SocialNetworkMember # Parent class - added 2026-01-22 per Rule 53 connection migration
- ./SpecificityAnnotation
- ./TemplateSpecificityScore # was: TemplateSpecificityScores - migrated per Rule 53 (2026-01-17)
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ../enums/HeritageTypeEnum
- ../enums/NameTypeEnum
- ../enums/ConnectionDegreeEnum
# REMOVED 2026-01-22: ../enums/ConnectionDegreeEnum - replaced by ConnectionDegreeType class hierarchy (Rule 53)
- ../slots/connection_id
- ../slots/connection_name
- ../slots/name_type
- ../slots/connection_degree
# MIGRATED 2026-01-22: connection_degree → has_or_had_degree + ConnectionDegree (Rule 53)
- ../slots/has_or_had_degree
- ./ConnectionDegree
- ./ConnectionDegreeType
- ./ConnectionDegreeTypes
# REMOVED 2026-01-18: ../slots/connection_headline - migrated to has_or_had_description + Description (Rule 53)
- ../slots/has_or_had_description
- ./Description
@ -36,6 +41,7 @@ imports:
default_range: string
classes:
PersonConnection:
is_a: SocialNetworkMember # Added 2026-01-22 per Rule 53 connection migration
class_uri: schema:Person
description: 'A single connection entry from a person''s LinkedIn network.
@ -81,7 +87,8 @@ classes:
related_mappings:
- schema:knows
slots:
- connection_degree
# MIGRATED 2026-01-22: connection_degree → has_or_had_degree + ConnectionDegree (Rule 53)
- has_or_had_degree
- has_or_had_description # was: connection_headline - migrated per Rule 53 (2026-01-18)
- connection_heritage_relevant
- connection_heritage_type
@ -122,12 +129,22 @@ classes:
description: Complete name visible
- value: abbreviated
description: Partial name (privacy setting)
connection_degree:
range: ConnectionDegreeEnum
# MIGRATED 2026-01-22: connection_degree → has_or_had_degree + ConnectionDegree (Rule 53)
has_or_had_degree:
range: ConnectionDegree
required: true
inlined: true
description: |
MIGRATED from connection_degree per slot_fixes.yaml (Rule 53, 2026-01-22).
Connection degree now uses structured ConnectionDegree class with
ConnectionDegreeType hierarchy instead of simple enum.
examples:
- value: 2nd
description: Second-degree connection
- value:
has_or_had_type: SecondDegreeConnection
description: Second-degree connection (connected through one mutual connection)
- value:
has_or_had_type: FirstDegreeConnection
description: First-degree direct connection
has_or_had_description: # was: connection_headline - migrated per Rule 53/56 (2026-01-18)
description: |
MIGRATED from connection_headline per slot_fixes.yaml (Rule 53/56, 2026-01-18).
@ -187,7 +204,7 @@ classes:
- Inlined in ConnectionNetwork.connections[] as multivalued list
- connection_id enables deduplication across multiple connection lists
- name_type classification per AGENTS.md Rule 17
- connection_degree is relative to VIEWER, not target profile
- has_or_had_degree (was connection_degree) is relative to VIEWER, not target profile
see_also:
- https://schema.org/Person
- https://schema.org/knows

View file

@ -178,14 +178,18 @@ classes:
required: false
examples:
- value: |
birth_edtf: "1970-08-15"
temporal_extent:
has_or_had_notation: "1970-08-15"
begin_of_the_begin: "1970-08-15T00:00:00Z"
end_of_the_end: "1970-08-15T23:59:59Z"
is_inferred: false
confidence: HIGH
description: Full date known
- value: |
birth_edtf: "197X"
temporal_extent:
has_or_had_notation: "197X"
begin_of_the_begin: "1970-01-01T00:00:00Z"
end_of_the_end: "1979-12-31T23:59:59Z"
is_inferred: true
confidence: LOW
description: Decade inferred from career start
has_or_had_place_of_birth:
description: >-

View file

@ -18,23 +18,11 @@ imports:
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
- ./SpecificityAnnotation
- ./TemplateSpecificityScore # was: TemplateSpecificityScores - migrated per Rule 53 (2026-01-17)
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ./Timestamp
- ../slots/begin_of_the_begin
- ../slots/begin_of_the_end
- ../slots/end_of_the_begin
- ../slots/end_of_the_end
- ../slots/specificity_annotation
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
- ../slots/begin_of_the_begin
- ../slots/begin_of_the_end
- ../slots/end_of_the_begin
- ../slots/end_of_the_end
- ../slots/specificity_annotation
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
# ADDED 2026-01-22: has_or_had_notation for EDTF string preservation per slot_fixes.yaml feedback
- ../slots/has_or_had_notation
default_range: string
classes:
TimeSpan:
@ -90,6 +78,33 @@ classes:
- end_of_the_end
- specificity_annotation
- has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
# ADDED 2026-01-22: Preserves original EDTF notation (e.g., "197X", "1970~")
- has_or_had_notation
slot_usage:
has_or_had_notation:
range: string
required: false
description: >-
Original EDTF (Extended Date/Time Format) notation string.
Preserves the exact notation used to express temporal uncertainty.
**EDTF PATTERNS**:
| Pattern | Meaning | Example |
|---------|---------|---------|
| `YYYY-MM-DD` | Full date | `1970-08-15` |
| `YYYY-MM` | Year-month | `1970-08` |
| `YYYY` | Year only | `1970` |
| `YYYX` | Decade | `197X` (1970s) |
| `YYYY~` | Approximate | `1970~` (circa) |
| `YYYY?` | Uncertain | `1970?` |
| `XXXX` | Unknown | Requires provenance |
examples:
- value: "1970-08-15"
description: Full date known
- value: "197X"
description: Decade known (1970s)
- value: "1970~"
description: Approximate (circa 1970)
attributes:
notes:
range: string

View file

@ -0,0 +1,50 @@
id: https://nde.nl/ontology/hc/slot/has_or_had_canonical_form
name: has_or_had_canonical_form_slot
title: Has or Had Canonical Form Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
skos: http://www.w3.org/2004/02/skos/core#
dcterms: http://purl.org/dc/terms/
imports:
- linkml:types
default_range: string
slots:
has_or_had_canonical_form:
slot_uri: skos:notation
description: >-
Links to a CanonicalForm representing the normalized/canonical representation.
**PURPOSE**:
- Enables consistent storage and matching
- Supports deduplication across records
- Facilitates database joins
**EXAMPLES**:
- ISNI: "0000 0001 2146 5765" → canonical: "0000000121465765"
- Wikidata: "http://www.wikidata.org/entity/Q190804" → canonical: "Q190804"
- DOI: "https://doi.org/10.1234/example" → canonical: "10.1234/example"
**NORMALIZATION RULES**:
- ISNI: Remove all spaces
- Wikidata: Extract Q-number only
- VIAF: Numeric portion only
- DOI: Lowercase, no resolver prefix
- ISIL: Keep as-is (already canonical)
**ONTOLOGY ALIGNMENT**:
- slot_uri: skos:notation (primary - notation/code)
MIGRATED 2026-01-22: Replaces canonical_value slot per slot_fixes.yaml feedback.
range: CanonicalForm
inlined: true
exact_mappings:
- skos:notation
close_mappings:
- skos:prefLabel
broad_mappings:
- rdf:value
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Canonical forms are universal across all identifier types

View file

@ -0,0 +1,64 @@
# has_or_had_degree slot
# Created 2026-01-22 per slot_fixes.yaml revision for connection_degree (Rule 53)
#
# Generic slot for degree/level relationships with temporal semantics
id: https://nde.nl/ontology/hc/slot/has_or_had_degree
name: has_or_had_degree_slot
title: Has Or Had Degree Slot
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_degree:
slot_uri: hc:hasOrHadDegree
description: |
The degree, level, or intensity of a relationship or measurement.
**Temporal Semantics** (RiC-O Pattern):
The "hasOrHad" naming follows RiC-O convention indicating this relationship
may be current or historical.
**USE CASES**:
1. **Connection degree**: 1st, 2nd, 3rd+ LinkedIn connection degree
2. **Qualification degree**: Bachelor, Master, PhD
3. **Relationship degree**: Close, moderate, distant
**MIGRATION NOTE** (Rule 53, 2026-01-22):
Created as part of connection_degree migration. The previous pattern
used a simple enum value. The new pattern wraps the degree in a
structured class for better extensibility.
range: uriorcurie
multivalued: false
required: false
exact_mappings:
- schema:educationalLevel
close_mappings:
- schema:intensity
annotations:
rico_naming_convention: |
Follows RiC-O "hasOrHad" pattern for temporal predicates.
See Rule 39: Slot Naming Convention (RiC-O Style)
replaces_slots: "connection_degree"
migration_date: "2026-01-22"
custodian_types: '["*"]'
specificity_score: 0.45
specificity_rationale: Generic degree relationship applicable across contexts.
examples:
- value: "hc:ConnectionDegreeType/FIRST"
description: "First-degree (direct) connection"
- value: "hc:ConnectionDegreeType/SECOND"
description: "Second-degree connection"

View file

@ -17,19 +17,23 @@ prefixes:
imports:
- linkml:types
# Range broadened 2026-01-22 per Rule 55 - accepts Custodian OR SocialNetworkMember
# Classes narrow via slot_usage as needed
- ../classes/Custodian
slots:
has_or_had_member:
slot_uri: org:hasMember
description: |
Custodians that are or were members of this encompassing body
(network, consortium, umbrella organization).
Members of an encompassing body, network, or social network.
**RiC-O Temporal Pattern**: Uses `hasOrHad*` pattern to explicitly
acknowledge that membership relationships can change over time.
Members may join and leave networks.
**Usage Contexts**:
- EncompassingBody: Custodians as members (range: Custodian)
- ConnectionNetwork: Persons as members (range: SocialNetworkMember/PersonConnection)
**Membership Types**:
Members can have different participation levels:
- Full members: Voting rights, full service access
@ -37,7 +41,10 @@ slots:
- Observer status: Information sharing only
For detailed membership modeling, use Membership class (future extension).
range: Custodian
Range broadened per Rule 55 (2026-01-22) to support both organizational
and social network membership patterns.
range: Any # Broadened per Rule 55 - classes narrow via slot_usage
multivalued: true
exact_mappings:

View file

@ -0,0 +1,38 @@
id: https://nde.nl/ontology/hc/slot/has_or_had_notation
name: has_or_had_notation_slot
title: Has or Had Notation Slot
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
skos: http://www.w3.org/2004/02/skos/core#
dcterms: http://purl.org/dc/terms/
imports:
- linkml:types
default_range: string
slots:
has_or_had_notation:
slot_uri: skos:notation
description: >-
A notation, code, or symbolic representation using a defined scheme.
**USE CASES**:
- EDTF (Extended Date/Time Format) strings for temporal data
- Classification codes
- Symbolic representations
**EXAMPLES**:
- EDTF: "1970-08-15", "197X", "1970~", "1970?"
- Classification: "025.4", "NK 2.1"
**ONTOLOGY ALIGNMENT**:
- slot_uri: skos:notation (primary)
- Notation preserves original format/encoding
range: string
exact_mappings:
- skos:notation
close_mappings:
- dcterms:identifier
annotations:
custodian_types: '["*"]'
custodian_types_rationale: Notations are universal across all heritage custodian types

View file

@ -17,8 +17,7 @@
"has_or_had_base.yaml",
"begin_of_the_begin.yaml",
"begin_of_the_end.yaml",
"birth_edtf.yaml",
"birth_iso_date.yaml",
"has_or_had_notation.yaml",
"canonical_value.yaml",
"capacity.yaml",
"capacity_type.yaml",
@ -69,7 +68,7 @@
"__ARCHIVED_20260122__confidence_threshold.yaml",
"confidence_value.yaml",
"__ARCHIVED_20260122__conflict_status.yaml",
"connection.yaml",
"__ARCHIVED_20260122__connection.yaml",
"connection_degree.yaml",
"connection_heritage_relevant.yaml",
"connection_heritage_type.yaml",

View file

@ -7577,8 +7577,8 @@ fixes:
where possible, while retaining the original EDTF string for fidelity.
This would enhance semantic interoperability without losing the original data.'
done: false
response: "Completed 2026-01-22 by claude-sonnet-4. Added temporal_extent slot to BirthDate.yaml linking to TimeSpan. Retained birth_edtf for EDTF fidelity. Examples updated to show both EDTF notation and TimeSpan representation."
done: true
response: "Completed 2026-01-22 by claude-sonnet-4. FULLY MIGRATED: birth_edtf removed from BirthDate.yaml. Created has_or_had_notation slot for EDTF preservation in TimeSpan. BirthDate uses temporal_extent → TimeSpan.has_or_had_notation."
feedback:
- timestamp: '2026-01-22T10:15:00Z'
reviewer: Simon C. Kemper
@ -7587,7 +7587,8 @@ fixes:
If TimeSpan is now used for temporal_extent, the original EDTF slot is redundant.
Consider deprecating birth_edtf to avoid confusion and ensure data consistency.'
done: false
done: true
response: "Completed 2026-01-22 by claude-sonnet-4. REMOVED birth_edtf slot from BirthDate.yaml. Created has_or_had_notation slot (skos:notation) for EDTF string preservation. BirthDate now uses temporal_extent → TimeSpan with has_or_had_notation for EDTF. Slot archived to archive/birth_edtf_archived_20260122.yaml."
- original_slot_id: https://nde.nl/ontology/hc/slot/birth_iso_date
revision:
- label: temporal_extent
@ -7624,8 +7625,8 @@ fixes:
for representing uncertain or approximate dates in the future.
This would align with best practices for temporal data modeling.'
done: false
response: "Completed 2026-01-22 by claude-sonnet-4. Added temporal_extent slot to BirthDate.yaml (same migration as birth_edtf). BirthDate now has both birth_iso_date (for machine-readable ISO dates) and temporal_extent (for TimeSpan representation). This provides flexibility for uncertain dates."
done: true
response: "Completed 2026-01-22 by claude-sonnet-4. FULLY MIGRATED: birth_iso_date removed from BirthDate.yaml. BirthDate uses temporal_extent → TimeSpan.has_or_had_notation for EDTF preservation (full dates represented as EDTF e.g. '1970-08-15')."
feedback:
- timestamp: '2026-01-22T10:20:00Z'
reviewer: Simon C. Kemper
@ -7634,7 +7635,8 @@ fixes:
If TimeSpan is now used for temporal_extent, the original ISO date slot is redundant.
Consider deprecating birth_iso_date to avoid confusion and ensure data consistency.'
done: false
done: true
response: "Completed 2026-01-22 by claude-sonnet-4. REMOVED birth_iso_date slot from BirthDate.yaml. BirthDate now uses temporal_extent → TimeSpan (has_or_had_notation preserves EDTF including full dates). Slot archived to archive/birth_iso_date_archived_20260122.yaml."
- original_slot_id: https://nde.nl/ontology/hc/slot/birth_source_text
revision:
- label: has_or_had_provenance
@ -11252,6 +11254,27 @@ fixes:
type: slot
- label: SocialNetworkMember
type: class
processed:
status: true
date: '2026-01-22'
agent: claude-claude-sonnet-4-20250514
notes: |
**Migration #57: connection** ✅ COMPLETE
**Pattern**: connection → has_or_had_member + SocialNetworkMember
**Files Used** (pre-existing):
- has_or_had_member.yaml: Generic membership slot
- SocialNetworkMember.yaml: Base class for network members
- PersonConnection.yaml: Already has `is_a: SocialNetworkMember`
**Files Modified**:
- ConnectionNetwork.yaml: Migrated connection to has_or_had_member
- Updated imports (removed connection, added has_or_had_member, SocialNetworkMember)
- Updated slots list
- Updated slot_usage with description
**Archived**: modules/slots/archive/connection_archived_20260122.yaml
- original_slot_id: https://nde.nl/ontology/hc/slot/connection_degree
revision:
- label: has_or_had_degree
@ -11266,6 +11289,28 @@ fixes:
type: slot
- label: ConnectionDegreeTypes
type: class
processed:
status: true
date: '2026-01-22'
agent: claude-claude-sonnet-4-20250514
notes: |
**Migration #58: connection_degree** ✅ COMPLETE
**Pattern**: connection_degree → has_or_had_degree + ConnectionDegree + Type/Types hierarchy
**Files Created**:
- has_or_had_degree.yaml: Generic degree slot
- ConnectionDegree.yaml: Class wrapping degree value
- ConnectionDegreeType.yaml: Abstract base class (pre-existing)
- ConnectionDegreeTypes.yaml: Concrete subclasses (pre-existing)
**Files Modified**:
- PersonConnection.yaml: Migrated connection_degree to has_or_had_degree + ConnectionDegree
- Updated imports
- Updated slots list
- Updated slot_usage with ConnectionDegree range and examples
**Archived**: modules/slots/archive/connection_degree_archived_20260122.yaml
- original_slot_id: https://nde.nl/ontology/hc/slot/connection_headline
revision:
- label: has_or_had_description