From 2a75ddf7ccc3a44d92772a751dd55c9c4037d8a2 Mon Sep 17 00:00:00 2001 From: kempersc Date: Thu, 22 Jan 2026 20:41:06 +0100 Subject: [PATCH] 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. --- .../schemas/20251121/linkml/manifest.json | 108 +++-- .../linkml/modules/classes/BirthDate.yaml | 93 ++-- .../linkml/modules/classes/Conflict.yaml | 163 +++++++ .../linkml/modules/classes/ConflictType.yaml | 66 +++ .../linkml/modules/classes/ConflictTypes.yaml | 113 +++++ .../modules/classes/ConnectionDegree.yaml | 94 +++++ .../modules/classes/ConnectionDegreeType.yaml | 73 ++++ .../classes/ConnectionDegreeTypes.yaml | 75 ++++ .../modules/classes/ConnectionNetwork.yaml | 28 +- .../linkml/modules/classes/Custodian.yaml | 9 +- .../modules/classes/DiocesanArchive.yaml | 23 +- .../linkml/modules/classes/Permission.yaml | 80 ++++ .../modules/classes/PermissionType.yaml | 38 ++ .../modules/classes/PermissionTypes.yaml | 82 ++++ .../modules/classes/PersonConnection.yaml | 33 +- .../modules/classes/PersonObservation.yaml | 12 +- .../modules/classes/SocialNetworkMember.yaml | 102 +++++ .../linkml/modules/classes/TimeSpan.yaml | 43 +- .../birth_edtf_archived_20260122.yaml} | 0 .../birth_iso_date_archived_20260122.yaml} | 0 ...onical_access_rule_archived_20260122.yaml} | 0 .../conflict_status_archived_20260122.yaml} | 0 .../connection_archived_20260122.yaml} | 0 .../connection_degree_archived_20260122.yaml} | 0 .../slots/has_or_had_canonical_form.yaml | 50 +++ .../modules/slots/has_or_had_degree.yaml | 64 +++ .../modules/slots/has_or_had_member.yaml | 15 +- .../modules/slots/has_or_had_notation.yaml | 38 ++ .../modules/slots/is_or_was_involved_in.yaml | 77 ++++ .../linkml/modules/slots/manifest.json | 12 +- .../linkml/modules/slots/slot_fixes.yaml | 399 +++++++++++++++++- .../src/lib/linkml/linkml-schema-service.ts | 8 +- schemas/20251121/linkml/manifest.json | 108 +++-- .../linkml/modules/classes/BirthDate.yaml | 93 ++-- .../modules/classes/ConnectionDegree.yaml | 94 +++++ .../modules/classes/ConnectionDegreeType.yaml | 73 ++++ .../classes/ConnectionDegreeTypes.yaml | 75 ++++ .../modules/classes/ConnectionNetwork.yaml | 28 +- .../modules/classes/PersonConnection.yaml | 33 +- .../modules/classes/PersonObservation.yaml | 12 +- .../linkml/modules/classes/TimeSpan.yaml | 43 +- .../birth_edtf_archived_20260122.yaml} | 0 .../birth_iso_date_archived_20260122.yaml} | 0 .../connection_archived_20260122.yaml} | 0 .../connection_degree_archived_20260122.yaml} | 0 .../slots/has_or_had_canonical_form.yaml | 50 +++ .../modules/slots/has_or_had_degree.yaml | 64 +++ .../modules/slots/has_or_had_member.yaml | 15 +- .../modules/slots/has_or_had_notation.yaml | 38 ++ .../linkml/modules/slots/manifest.json | 5 +- .../linkml/modules/slots/slot_fixes.yaml | 57 ++- 51 files changed, 2389 insertions(+), 297 deletions(-) create mode 100644 frontend/public/schemas/20251121/linkml/modules/classes/Conflict.yaml create mode 100644 frontend/public/schemas/20251121/linkml/modules/classes/ConflictType.yaml create mode 100644 frontend/public/schemas/20251121/linkml/modules/classes/ConflictTypes.yaml create mode 100644 frontend/public/schemas/20251121/linkml/modules/classes/ConnectionDegree.yaml create mode 100644 frontend/public/schemas/20251121/linkml/modules/classes/ConnectionDegreeType.yaml create mode 100644 frontend/public/schemas/20251121/linkml/modules/classes/ConnectionDegreeTypes.yaml create mode 100644 frontend/public/schemas/20251121/linkml/modules/classes/Permission.yaml create mode 100644 frontend/public/schemas/20251121/linkml/modules/classes/PermissionType.yaml create mode 100644 frontend/public/schemas/20251121/linkml/modules/classes/PermissionTypes.yaml create mode 100644 frontend/public/schemas/20251121/linkml/modules/classes/SocialNetworkMember.yaml rename frontend/public/schemas/20251121/linkml/modules/slots/{birth_edtf.yaml => archive/birth_edtf_archived_20260122.yaml} (100%) rename frontend/public/schemas/20251121/linkml/modules/slots/{birth_iso_date.yaml => archive/birth_iso_date_archived_20260122.yaml} (100%) rename frontend/public/schemas/20251121/linkml/modules/slots/{canonical_access_rule.yaml => archive/canonical_access_rule_archived_20260122.yaml} (100%) rename frontend/public/schemas/20251121/linkml/modules/slots/{conflict_status.yaml => archive/conflict_status_archived_20260122.yaml} (100%) rename frontend/public/schemas/20251121/linkml/modules/slots/{connection.yaml => archive/connection_archived_20260122.yaml} (100%) rename frontend/public/schemas/20251121/linkml/modules/slots/{connection_degree.yaml => archive/connection_degree_archived_20260122.yaml} (100%) create mode 100644 frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_canonical_form.yaml create mode 100644 frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_degree.yaml create mode 100644 frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_notation.yaml create mode 100644 frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_involved_in.yaml create mode 100644 schemas/20251121/linkml/modules/classes/ConnectionDegree.yaml create mode 100644 schemas/20251121/linkml/modules/classes/ConnectionDegreeType.yaml create mode 100644 schemas/20251121/linkml/modules/classes/ConnectionDegreeTypes.yaml rename schemas/20251121/linkml/modules/slots/{birth_edtf.yaml => archive/birth_edtf_archived_20260122.yaml} (100%) rename schemas/20251121/linkml/modules/slots/{birth_iso_date.yaml => archive/birth_iso_date_archived_20260122.yaml} (100%) rename schemas/20251121/linkml/modules/slots/{connection.yaml => archive/connection_archived_20260122.yaml} (100%) rename schemas/20251121/linkml/modules/slots/{connection_degree.yaml => archive/connection_degree_archived_20260122.yaml} (100%) create mode 100644 schemas/20251121/linkml/modules/slots/has_or_had_canonical_form.yaml create mode 100644 schemas/20251121/linkml/modules/slots/has_or_had_degree.yaml create mode 100644 schemas/20251121/linkml/modules/slots/has_or_had_notation.yaml diff --git a/frontend/public/schemas/20251121/linkml/manifest.json b/frontend/public/schemas/20251121/linkml/manifest.json index ceae408b53..dc7062b0c5 100644 --- a/frontend/public/schemas/20251121/linkml/manifest.json +++ b/frontend/public/schemas/20251121/linkml/manifest.json @@ -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", diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/BirthDate.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/BirthDate.yaml index 802508f724..a7df507b3f 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/BirthDate.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/BirthDate.yaml @@ -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: diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Conflict.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Conflict.yaml new file mode 100644 index 0000000000..770ca1ee2f --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/Conflict.yaml @@ -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" diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/ConflictType.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/ConflictType.yaml new file mode 100644 index 0000000000..15ed105ebf --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/ConflictType.yaml @@ -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)" diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/ConflictTypes.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/ConflictTypes.yaml new file mode 100644 index 0000000000..b028608ed6 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/ConflictTypes.yaml @@ -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" diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/ConnectionDegree.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/ConnectionDegree.yaml new file mode 100644 index 0000000000..16a215c6ac --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/ConnectionDegree.yaml @@ -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" diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/ConnectionDegreeType.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/ConnectionDegreeType.yaml new file mode 100644 index 0000000000..e7855cb766 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/ConnectionDegreeType.yaml @@ -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" diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/ConnectionDegreeTypes.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/ConnectionDegreeTypes.yaml new file mode 100644 index 0000000000..70a38e7f78 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/ConnectionDegreeTypes.yaml @@ -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+" diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/ConnectionNetwork.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/ConnectionNetwork.yaml index 2a4a449337..d12df40e4e 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/ConnectionNetwork.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/ConnectionNetwork.yaml @@ -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 diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Custodian.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Custodian.yaml index 60227829e4..86286572e4 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/Custodian.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/Custodian.yaml @@ -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 diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/DiocesanArchive.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/DiocesanArchive.yaml index 6c2b9e5f9f..50dae3cb63 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/DiocesanArchive.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/DiocesanArchive.yaml @@ -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: diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Permission.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Permission.yaml new file mode 100644 index 0000000000..ef45336c1b --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/Permission.yaml @@ -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 diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/PermissionType.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/PermissionType.yaml new file mode 100644 index 0000000000..9f0b424a9a --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/PermissionType.yaml @@ -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 diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/PermissionTypes.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/PermissionTypes.yaml new file mode 100644 index 0000000000..0dc5f56206 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/PermissionTypes.yaml @@ -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 diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/PersonConnection.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/PersonConnection.yaml index b94058e19f..da4b53e773 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/PersonConnection.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/PersonConnection.yaml @@ -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 diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/PersonObservation.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/PersonObservation.yaml index eee9da687c..b5f1f1091a 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/PersonObservation.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/PersonObservation.yaml @@ -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: >- diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/SocialNetworkMember.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/SocialNetworkMember.yaml new file mode 100644 index 0000000000..651b24d4e4 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/SocialNetworkMember.yaml @@ -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" diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/TimeSpan.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/TimeSpan.yaml index fb0516cf03..c3f796f3c3 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/TimeSpan.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/TimeSpan.yaml @@ -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 diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/birth_edtf.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/birth_edtf_archived_20260122.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/birth_edtf.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/birth_edtf_archived_20260122.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/birth_iso_date.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/birth_iso_date_archived_20260122.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/birth_iso_date.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/birth_iso_date_archived_20260122.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/canonical_access_rule.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/canonical_access_rule_archived_20260122.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/canonical_access_rule.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/canonical_access_rule_archived_20260122.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/conflict_status.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/conflict_status_archived_20260122.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/conflict_status.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/conflict_status_archived_20260122.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/connection.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/connection_archived_20260122.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/connection.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/connection_archived_20260122.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/connection_degree.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/connection_degree_archived_20260122.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/connection_degree.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/connection_degree_archived_20260122.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_canonical_form.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_canonical_form.yaml new file mode 100644 index 0000000000..708ed58812 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_canonical_form.yaml @@ -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 diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_degree.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_degree.yaml new file mode 100644 index 0000000000..07fb406f24 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_degree.yaml @@ -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" diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_member.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_member.yaml index 9d0d04f81c..63d4dfe1e7 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_member.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_member.yaml @@ -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: diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_notation.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_notation.yaml new file mode 100644 index 0000000000..7943294f26 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/slots/has_or_had_notation.yaml @@ -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 diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_involved_in.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_involved_in.yaml new file mode 100644 index 0000000000..3bf5c138e1 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_involved_in.yaml @@ -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" diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/manifest.json b/frontend/public/schemas/20251121/linkml/modules/slots/manifest.json index d385c6a836..439a3e02ea 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/manifest.json +++ b/frontend/public/schemas/20251121/linkml/modules/slots/manifest.json @@ -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", diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml index b4844f5801..fa74a3925c 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml @@ -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 \ No newline at end of file +- 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 diff --git a/frontend/src/lib/linkml/linkml-schema-service.ts b/frontend/src/lib/linkml/linkml-schema-service.ts index ca475fa17d..365a1ae9dd 100644 --- a/frontend/src/lib/linkml/linkml-schema-service.ts +++ b/frontend/src/lib/linkml/linkml-schema-service.ts @@ -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 }); } } diff --git a/schemas/20251121/linkml/manifest.json b/schemas/20251121/linkml/manifest.json index a9026bf6ec..70b3e4fb54 100644 --- a/schemas/20251121/linkml/manifest.json +++ b/schemas/20251121/linkml/manifest.json @@ -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", diff --git a/schemas/20251121/linkml/modules/classes/BirthDate.yaml b/schemas/20251121/linkml/modules/classes/BirthDate.yaml index 802508f724..a7df507b3f 100644 --- a/schemas/20251121/linkml/modules/classes/BirthDate.yaml +++ b/schemas/20251121/linkml/modules/classes/BirthDate.yaml @@ -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: diff --git a/schemas/20251121/linkml/modules/classes/ConnectionDegree.yaml b/schemas/20251121/linkml/modules/classes/ConnectionDegree.yaml new file mode 100644 index 0000000000..16a215c6ac --- /dev/null +++ b/schemas/20251121/linkml/modules/classes/ConnectionDegree.yaml @@ -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" diff --git a/schemas/20251121/linkml/modules/classes/ConnectionDegreeType.yaml b/schemas/20251121/linkml/modules/classes/ConnectionDegreeType.yaml new file mode 100644 index 0000000000..e7855cb766 --- /dev/null +++ b/schemas/20251121/linkml/modules/classes/ConnectionDegreeType.yaml @@ -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" diff --git a/schemas/20251121/linkml/modules/classes/ConnectionDegreeTypes.yaml b/schemas/20251121/linkml/modules/classes/ConnectionDegreeTypes.yaml new file mode 100644 index 0000000000..70a38e7f78 --- /dev/null +++ b/schemas/20251121/linkml/modules/classes/ConnectionDegreeTypes.yaml @@ -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+" diff --git a/schemas/20251121/linkml/modules/classes/ConnectionNetwork.yaml b/schemas/20251121/linkml/modules/classes/ConnectionNetwork.yaml index 2a4a449337..d12df40e4e 100644 --- a/schemas/20251121/linkml/modules/classes/ConnectionNetwork.yaml +++ b/schemas/20251121/linkml/modules/classes/ConnectionNetwork.yaml @@ -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 diff --git a/schemas/20251121/linkml/modules/classes/PersonConnection.yaml b/schemas/20251121/linkml/modules/classes/PersonConnection.yaml index b94058e19f..da4b53e773 100644 --- a/schemas/20251121/linkml/modules/classes/PersonConnection.yaml +++ b/schemas/20251121/linkml/modules/classes/PersonConnection.yaml @@ -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 diff --git a/schemas/20251121/linkml/modules/classes/PersonObservation.yaml b/schemas/20251121/linkml/modules/classes/PersonObservation.yaml index eee9da687c..b5f1f1091a 100644 --- a/schemas/20251121/linkml/modules/classes/PersonObservation.yaml +++ b/schemas/20251121/linkml/modules/classes/PersonObservation.yaml @@ -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: >- diff --git a/schemas/20251121/linkml/modules/classes/TimeSpan.yaml b/schemas/20251121/linkml/modules/classes/TimeSpan.yaml index fb0516cf03..c3f796f3c3 100644 --- a/schemas/20251121/linkml/modules/classes/TimeSpan.yaml +++ b/schemas/20251121/linkml/modules/classes/TimeSpan.yaml @@ -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 diff --git a/schemas/20251121/linkml/modules/slots/birth_edtf.yaml b/schemas/20251121/linkml/modules/slots/archive/birth_edtf_archived_20260122.yaml similarity index 100% rename from schemas/20251121/linkml/modules/slots/birth_edtf.yaml rename to schemas/20251121/linkml/modules/slots/archive/birth_edtf_archived_20260122.yaml diff --git a/schemas/20251121/linkml/modules/slots/birth_iso_date.yaml b/schemas/20251121/linkml/modules/slots/archive/birth_iso_date_archived_20260122.yaml similarity index 100% rename from schemas/20251121/linkml/modules/slots/birth_iso_date.yaml rename to schemas/20251121/linkml/modules/slots/archive/birth_iso_date_archived_20260122.yaml diff --git a/schemas/20251121/linkml/modules/slots/connection.yaml b/schemas/20251121/linkml/modules/slots/archive/connection_archived_20260122.yaml similarity index 100% rename from schemas/20251121/linkml/modules/slots/connection.yaml rename to schemas/20251121/linkml/modules/slots/archive/connection_archived_20260122.yaml diff --git a/schemas/20251121/linkml/modules/slots/connection_degree.yaml b/schemas/20251121/linkml/modules/slots/archive/connection_degree_archived_20260122.yaml similarity index 100% rename from schemas/20251121/linkml/modules/slots/connection_degree.yaml rename to schemas/20251121/linkml/modules/slots/archive/connection_degree_archived_20260122.yaml diff --git a/schemas/20251121/linkml/modules/slots/has_or_had_canonical_form.yaml b/schemas/20251121/linkml/modules/slots/has_or_had_canonical_form.yaml new file mode 100644 index 0000000000..708ed58812 --- /dev/null +++ b/schemas/20251121/linkml/modules/slots/has_or_had_canonical_form.yaml @@ -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 diff --git a/schemas/20251121/linkml/modules/slots/has_or_had_degree.yaml b/schemas/20251121/linkml/modules/slots/has_or_had_degree.yaml new file mode 100644 index 0000000000..07fb406f24 --- /dev/null +++ b/schemas/20251121/linkml/modules/slots/has_or_had_degree.yaml @@ -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" diff --git a/schemas/20251121/linkml/modules/slots/has_or_had_member.yaml b/schemas/20251121/linkml/modules/slots/has_or_had_member.yaml index 9d0d04f81c..63d4dfe1e7 100644 --- a/schemas/20251121/linkml/modules/slots/has_or_had_member.yaml +++ b/schemas/20251121/linkml/modules/slots/has_or_had_member.yaml @@ -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: diff --git a/schemas/20251121/linkml/modules/slots/has_or_had_notation.yaml b/schemas/20251121/linkml/modules/slots/has_or_had_notation.yaml new file mode 100644 index 0000000000..7943294f26 --- /dev/null +++ b/schemas/20251121/linkml/modules/slots/has_or_had_notation.yaml @@ -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 diff --git a/schemas/20251121/linkml/modules/slots/manifest.json b/schemas/20251121/linkml/modules/slots/manifest.json index e61e8b4d3b..439a3e02ea 100644 --- a/schemas/20251121/linkml/modules/slots/manifest.json +++ b/schemas/20251121/linkml/modules/slots/manifest.json @@ -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", diff --git a/schemas/20251121/linkml/modules/slots/slot_fixes.yaml b/schemas/20251121/linkml/modules/slots/slot_fixes.yaml index 20bc2616f4..fa74a3925c 100644 --- a/schemas/20251121/linkml/modules/slots/slot_fixes.yaml +++ b/schemas/20251121/linkml/modules/slots/slot_fixes.yaml @@ -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