From be18d6761c606cab856d3b0a978ddcc47e662e9f Mon Sep 17 00:00:00 2001 From: kempersc Date: Thu, 22 Jan 2026 20:17:33 +0100 Subject: [PATCH] feat: Update manifest generated timestamp and mark slot fixes as completed with detailed response --- .../schemas/20251121/linkml/manifest.json | 2 +- .../src/lib/linkml/linkml-schema-service.ts | 8 +- schemas/20251121/linkml/manifest.json | 2 +- .../modules/classes/SocialNetworkMember.yaml | 102 ++++++++++++ .../linkml/modules/slots/manifest.json | 1 - .../linkml/modules/slots/slot_fixes.yaml | 153 +++++++++++++++++- 6 files changed, 257 insertions(+), 11 deletions(-) create mode 100644 schemas/20251121/linkml/modules/classes/SocialNetworkMember.yaml diff --git a/frontend/public/schemas/20251121/linkml/manifest.json b/frontend/public/schemas/20251121/linkml/manifest.json index 5979adf646..ceae408b53 100644 --- a/frontend/public/schemas/20251121/linkml/manifest.json +++ b/frontend/public/schemas/20251121/linkml/manifest.json @@ -1,5 +1,5 @@ { - "generated": "2026-01-22T15:51:41.730Z", + "generated": "2026-01-22T16:05:23.652Z", "schemaRoot": "/schemas/20251121/linkml", "totalFiles": 3029, "categoryCounts": { diff --git a/frontend/src/lib/linkml/linkml-schema-service.ts b/frontend/src/lib/linkml/linkml-schema-service.ts index 773ed2ce67..ca475fa17d 100644 --- a/frontend/src/lib/linkml/linkml-schema-service.ts +++ b/frontend/src/lib/linkml/linkml-schema-service.ts @@ -715,7 +715,7 @@ class LinkMLSchemaService { if (schema.slots) { const slotsWithClassRange = Object.entries(schema.slots) - .filter(([_, slot]) => slot.range && typeof slot.range === 'string' && !['string', 'integer', 'float', 'boolean', 'uri', 'uriorcurie', 'date', 'datetime'].includes(slot.range)) + .filter(([_, slot]) => slot && slot.range && typeof slot.range === 'string' && !['string', 'integer', 'float', 'boolean', 'uri', 'uriorcurie', 'date', 'datetime'].includes(slot.range)) .map(([name, slot]) => `${name}→${slot.range}`); if (slotsWithClassRange.length > 0) { debugLog(`[LinkMLSchemaService] ${fileName}: slots with class/enum ranges: ${slotsWithClassRange.join(', ')}`); @@ -1488,7 +1488,7 @@ class LinkMLSchemaService { // Scan all slots for this class as range for (const [slotName, slot] of this.slotSchemas.entries()) { - if (slot.range === className) { + if (slot && slot.range === className) { exportInfo.slotsWithThisRange.push(slotName); } } @@ -1868,7 +1868,7 @@ class LinkMLSchemaService { const slots: string[] = []; for (const [slotName, slot] of this.slotSchemas.entries()) { - if (slot.range === className) { + if (slot && slot.range === className) { slots.push(slotName); } } @@ -2032,7 +2032,7 @@ class LinkMLSchemaService { // Second pass: Calculate exports from slots with class ranges for (const [slotName, slot] of this.slotSchemas.entries()) { - if (slot.range && counts.has(slot.range)) { + if (slot && slot.range && counts.has(slot.range)) { // This slot has a class as its range const classesUsingSlot = slotToClasses.get(slotName); if (classesUsingSlot) { diff --git a/schemas/20251121/linkml/manifest.json b/schemas/20251121/linkml/manifest.json index ceae408b53..a9026bf6ec 100644 --- a/schemas/20251121/linkml/manifest.json +++ b/schemas/20251121/linkml/manifest.json @@ -1,5 +1,5 @@ { - "generated": "2026-01-22T16:05:23.652Z", + "generated": "2026-01-22T19:17:33.553Z", "schemaRoot": "/schemas/20251121/linkml", "totalFiles": 3029, "categoryCounts": { diff --git a/schemas/20251121/linkml/modules/classes/SocialNetworkMember.yaml b/schemas/20251121/linkml/modules/classes/SocialNetworkMember.yaml new file mode 100644 index 0000000000..651b24d4e4 --- /dev/null +++ b/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/schemas/20251121/linkml/modules/slots/manifest.json b/schemas/20251121/linkml/modules/slots/manifest.json index d56142cda0..e61e8b4d3b 100644 --- a/schemas/20251121/linkml/modules/slots/manifest.json +++ b/schemas/20251121/linkml/modules/slots/manifest.json @@ -19,7 +19,6 @@ "begin_of_the_end.yaml", "birth_edtf.yaml", "birth_iso_date.yaml", - "canonical_access_rule.yaml", "canonical_value.yaml", "capacity.yaml", "capacity_type.yaml", diff --git a/schemas/20251121/linkml/modules/slots/slot_fixes.yaml b/schemas/20251121/linkml/modules/slots/slot_fixes.yaml index 04ea7312cc..20bc2616f4 100644 --- a/schemas/20251121/linkml/modules/slots/slot_fixes.yaml +++ b/schemas/20251121/linkml/modules/slots/slot_fixes.yaml @@ -7912,7 +7912,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 @@ -15032,9 +15033,153 @@ fixes: type: class - original_slot_id: https://nde.nl/ontology/hc/slot/has_aspect_ratio revision: - - label: has_or_had_ratio + - label: has_or_had_degree type: slot - label: AspectRatio 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/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