diff --git a/frontend/public/schemas/20251121/linkml/manifest.json b/frontend/public/schemas/20251121/linkml/manifest.json index b51dadbc5c..53f0df4d13 100644 --- a/frontend/public/schemas/20251121/linkml/manifest.json +++ b/frontend/public/schemas/20251121/linkml/manifest.json @@ -1,12 +1,12 @@ { - "generated": "2026-01-14T12:09:32.173Z", + "generated": "2026-01-14T12:29:52.423Z", "schemaRoot": "/schemas/20251121/linkml", "totalFiles": 2884, "categoryCounts": { "main": 4, - "class": 675, + "class": 679, "enum": 147, - "slot": 2054, + "slot": 2050, "module": 4 }, "categories": [ @@ -160,6 +160,11 @@ "path": "modules/classes/Appellation.yaml", "category": "class" }, + { + "name": "Approver", + "path": "modules/classes/Approver.yaml", + "category": "class" + }, { "name": "ArchitecturalArchive", "path": "modules/classes/ArchitecturalArchive.yaml", @@ -365,6 +370,16 @@ "path": "modules/classes/BiologicalObject.yaml", "category": "class" }, + { + "name": "BOLDIdentifier", + "path": "modules/classes/BOLDIdentifier.yaml", + "category": "class" + }, + { + "name": "Bookplate", + "path": "modules/classes/Bookplate.yaml", + "category": "class" + }, { "name": "BranchOffice", "path": "modules/classes/BranchOffice.yaml", @@ -2940,6 +2955,11 @@ "path": "modules/classes/TasteScentHeritageType.yaml", "category": "class" }, + { + "name": "Taxon", + "path": "modules/classes/Taxon.yaml", + "category": "class" + }, { "name": "TelevisionArchive", "path": "modules/classes/TelevisionArchive.yaml", @@ -4217,11 +4237,6 @@ "path": "modules/slots/approximate.yaml", "category": "slot" }, - { - "name": "archived_at", - "path": "modules/slots/archived_at.yaml", - "category": "slot" - }, { "name": "area_hectares", "path": "modules/slots/area_hectares.yaml", @@ -4237,11 +4252,6 @@ "path": "modules/slots/asserted_by.yaml", "category": "slot" }, - { - "name": "associated_taxa", - "path": "modules/slots/associated_taxa.yaml", - "category": "slot" - }, { "name": "audio_event_segments", "path": "modules/slots/audio_event_segments.yaml", @@ -4252,11 +4262,6 @@ "path": "modules/slots/authors.yaml", "category": "slot" }, - { - "name": "auto_generated", - "path": "modules/slots/auto_generated.yaml", - "category": "slot" - }, { "name": "auxiliary_places", "path": "modules/slots/auxiliary_places.yaml", @@ -4322,16 +4327,6 @@ "path": "modules/slots/birth_place.yaml", "category": "slot" }, - { - "name": "bold_id", - "path": "modules/slots/bold_id.yaml", - "category": "slot" - }, - { - "name": "bookplate", - "path": "modules/slots/bookplate.yaml", - "category": "slot" - }, { "name": "borrower", "path": "modules/slots/borrower.yaml", @@ -9362,11 +9357,6 @@ "path": "modules/slots/is_approximate.yaml", "category": "slot" }, - { - "name": "is_auto_generated", - "path": "modules/slots/is_auto_generated.yaml", - "category": "slot" - }, { "name": "is_auxiliary_of_place", "path": "modules/slots/is_auxiliary_of_place.yaml", @@ -9502,11 +9492,21 @@ "path": "modules/slots/is_or_was_also_allocation_agency.yaml", "category": "slot" }, + { + "name": "is_or_was_approved_by", + "path": "modules/slots/is_or_was_approved_by.yaml", + "category": "slot" + }, { "name": "is_or_was_archive_department_of", "path": "modules/slots/is_or_was_archive_department_of.yaml", "category": "slot" }, + { + "name": "is_or_was_archived_at", + "path": "modules/slots/is_or_was_archived_at.yaml", + "category": "slot" + }, { "name": "is_or_was_archived_in", "path": "modules/slots/is_or_was_archived_in.yaml", diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Approver.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Approver.yaml new file mode 100644 index 0000000000..0baca7835b --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/Approver.yaml @@ -0,0 +1,72 @@ +id: https://nde.nl/ontology/hc/class/Approver +name: approver_class +title: Approver Class +imports: +- linkml:types +- ../slots/has_or_had_label +- ../slots/has_or_had_identifier +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + prov: http://www.w3.org/ns/prov# + foaf: http://xmlns.com/foaf/0.1/ +default_prefix: hc +classes: + Approver: + class_uri: prov:Agent + description: >- + An agent (person or organization) that approves or authorized something. + + **DEFINITION**: + + Approver represents the agent responsible for approving decisions, + policies, budgets, or other organizational actions. This replaces + simple string fields like `approved_by` with a structured class + that can link to person or organization entities. + + **ONTOLOGY ALIGNMENT**: + + - PROV-O: `prov:Agent` - entity that bears responsibility + - FOAF: `foaf:Agent` - agent (person or organization) + - Schema.org: `schema:Person` or `schema:Organization` + + **USE CASES**: + + 1. **Budget Approval**: Who approved the budget allocation + 2. **Policy Approval**: Who authorized the policy + 3. **Decision Records**: Documenting approval chains + + exact_mappings: + - prov:Agent + close_mappings: + - foaf:Agent + - schema:Person + - schema:Organization + slots: + - has_or_had_label + - has_or_had_identifier + slot_usage: + has_or_had_label: + range: string + examples: + - value: "Board of Directors" + description: Organizational approver + - value: "Museum Director" + description: Role-based approver + has_or_had_identifier: + range: uriorcurie + examples: + - value: "https://nde.nl/ontology/hc/person/jan-de-vries" + description: Link to person entity + comments: + - Generic approver class for approval provenance + - Can represent individuals or organizational bodies + - Aligns with PROV-O Agent for provenance tracking + see_also: + - https://www.w3.org/TR/prov-o/#Agent + examples: + - value: + has_or_had_label: "Museum Director" + has_or_had_identifier: "https://nde.nl/ontology/hc/person/example-director" + description: Individual approver diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/AuxiliaryDigitalPlatform.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/AuxiliaryDigitalPlatform.yaml index 5a2e139d34..ae7109b526 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/AuxiliaryDigitalPlatform.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/AuxiliaryDigitalPlatform.yaml @@ -20,7 +20,7 @@ imports: - ../slots/technology_stack - ../slots/funding_source - ../slots/has_or_had_powered_by_cm -- ../slots/archived_at +- ../slots/is_or_was_archived_at # MIGRATED: was ../slots/archived_at (2026-01-15) - ../slots/serves_finding_aid - ../slots/has_or_had_data_service_endpoint - ../slots/has_or_had_documentation # MIGRATED: was ../slots/api_documentation (2026-01-15) @@ -113,7 +113,7 @@ classes: slots: - has_or_had_documentation # MIGRATED: was api_documentation (2026-01-15) - has_or_had_archival_status - - archived_at + - is_or_was_archived_at # MIGRATED: was archived_at (2026-01-15) - has_or_had_identifier - has_auxiliary_platform_type - cms_detected @@ -266,7 +266,8 @@ classes: description: Still accessible but not maintained - value: MIGRATED description: Content migrated to successor platform - was_archived_at: + is_or_was_archived_at: # MIGRATED: was was_archived_at (2026-01-15) + description: URL where this platform is or was archived (e.g., Wayback Machine) range: uri examples: - value: https://web.archive.org/web/20211231/https://example.nl/exhibition/ diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/BOLDIdentifier.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/BOLDIdentifier.yaml new file mode 100644 index 0000000000..9a1b816577 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/BOLDIdentifier.yaml @@ -0,0 +1,108 @@ +id: https://nde.nl/ontology/hc/class/BOLDIdentifier +name: bold_identifier_class +title: BOLD Identifier Class +description: >- + Barcode of Life Data System (BOLD) identifier for biological specimens. + + Links heritage biological objects to their DNA barcode records in BOLD. + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + dcterms: http://purl.org/dc/terms/ + schema: http://schema.org/ + +default_prefix: hc + +imports: + - linkml:types + - ../slots/id + - ../slots/identifier_value + - ../slots/identifier_url + - ../slots/description + - ../slots/specificity_annotation + - ../slots/template_specificity + - ./SpecificityAnnotation + - ./TemplateSpecificityScores + +classes: + BOLDIdentifier: + class_uri: schema:PropertyValue + description: >- + A Barcode of Life Data System (BOLD) identifier linking a biological + specimen to its DNA barcode record. + + **WHAT IS BOLD?** + + BOLD (Barcode of Life Data System) is an online workbench and database + for DNA barcoding. It stores specimen data and DNA barcode sequences, + enabling species identification through DNA. + + **USE CASES**: + + 1. **Specimen Identification**: Link natural history specimens to DNA data + 2. **Species Verification**: Cross-reference morphological IDs with DNA barcodes + 3. **Research Provenance**: Document genetic sampling of collection objects + + **IDENTIFIER FORMAT**: + + BOLD identifiers follow the pattern: BOLD:XXXNNN + - Process IDs: BOLD:AAA0001 + - Sample IDs: Institution-specific prefixes + + **EXTERNAL LINKS**: + + - BOLD Systems: https://boldsystems.org/ + - Record URL pattern: https://boldsystems.org/index.php/Public_RecordView?processid={id} + + exact_mappings: + - schema:PropertyValue + + close_mappings: + - dcterms:identifier + + slots: + - id + - identifier_value + - identifier_url + - description + - specificity_annotation + - template_specificity + + slot_usage: + id: + identifier: true + required: true + range: uriorcurie + pattern: ^https://nde\.nl/ontology/hc/bold-id/[A-Z0-9-]+$ + examples: + - value: https://nde.nl/ontology/hc/bold-id/NLNAT001-21 + description: Dutch natural history specimen BOLD ID + identifier_value: + description: The BOLD process ID or sample ID value. + range: string + required: true + pattern: ^[A-Z]{2,5}[0-9]{3,7}(-[0-9]{2})?$ + examples: + - value: NLNAT001-21 + description: Netherlands natural history specimen 2021 + - value: GBMIN12345-19 + description: UK specimen from 2019 + identifier_url: + description: URL to the BOLD record page. + range: uri + examples: + - value: https://boldsystems.org/index.php/Public_RecordView?processid=NLNAT001-21 + + comments: + - Used for DNA barcode identifiers in natural history collections + - Links physical specimens to molecular data + - Part of global biodiversity identification infrastructure + + examples: + - value: + id: https://nde.nl/ontology/hc/bold-id/NLNAT001-21 + identifier_value: NLNAT001-21 + identifier_url: https://boldsystems.org/index.php/Public_RecordView?processid=NLNAT001-21 + description: DNA barcode for Naturalis specimen + description: BOLD identifier for a Dutch natural history specimen diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/BiologicalObject.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/BiologicalObject.yaml index e1021f3ba8..48e92c6efe 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/BiologicalObject.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/BiologicalObject.yaml @@ -18,8 +18,12 @@ imports: - ./CustodianPlace - ../enums/PreservationMethodEnum - ../slots/wikidata_id -- ../slots/associated_taxa -- ../slots/bold_id +# associated_taxa REMOVED - migrated to is_or_was_associated_with (Rule 53) +- ../slots/is_or_was_associated_with +- ./Taxon +# bold_id REMOVED - migrated to has_or_had_identifier with BOLDIdentifier class (Rule 53) +- ../slots/has_or_had_identifier +- ./BOLDIdentifier - ../slots/cites_appendix - ../slots/collection_date - ../slots/collection_locality_text @@ -100,8 +104,10 @@ classes: - gbif:Specimen is_a: ExhibitedObject slots: - - associated_taxa - - bold_id + # associated_taxa REMOVED - migrated to is_or_was_associated_with (Rule 53) + - is_or_was_associated_with + # bold_id REMOVED - migrated to has_or_had_identifier with BOLDIdentifier (Rule 53) + - has_or_had_identifier - cites_appendix - collection_date - collection_locality_text @@ -138,6 +144,30 @@ classes: - template_specificity - type_status slot_usage: + is_or_was_associated_with: + description: >- + MIGRATED from associated_taxa (Rule 53). + Links biological object to associated taxa. + Range narrowed to Taxon class. + range: Taxon + multivalued: true + inlined_as_list: true + examples: + - value: https://nde.nl/ontology/hc/taxon/raphus-cucullatus + description: Associated with Dodo taxon + has_or_had_identifier: + description: >- + MIGRATED from bold_id (Rule 53). + BOLD (Barcode of Life Data System) identifier for DNA barcode records. + Range narrowed to BOLDIdentifier class. + range: BOLDIdentifier + multivalued: true + inlined_as_list: true + examples: + - value: + id: https://nde.nl/ontology/hc/bold-id/NLNAT001-21 + identifier_value: NLNAT001-21 + description: BOLD identifier for specimen taxon_name: required: true range: string diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Bookplate.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Bookplate.yaml new file mode 100644 index 0000000000..e423e92ab5 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/Bookplate.yaml @@ -0,0 +1,119 @@ +id: https://nde.nl/ontology/hc/class/Bookplate +name: bookplate_class +title: Bookplate Class +description: >- + Bookplate (ex libris) marking ownership of a book or manuscript. + + Records provenance information through ownership marks in heritage library items. + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + crm: http://www.cidoc-crm.org/cidoc-crm/ + bf: http://id.loc.gov/ontologies/bibframe/ + +default_prefix: hc + +imports: + - linkml:types + - ../slots/id + - ../slots/has_or_had_label + - ../slots/description + - ../slots/has_or_had_owner + - ../slots/specificity_annotation + - ../slots/template_specificity + - ./SpecificityAnnotation + - ./TemplateSpecificityScores + +classes: + Bookplate: + class_uri: bf:Bookplate + description: >- + A bookplate (ex libris) or ownership mark found in a book, manuscript, + or other library material. + + **WHAT IS A BOOKPLATE?** + + A bookplate is a printed or decorative label pasted inside a book, + typically on the front endpaper, indicating ownership. Also known + as "ex libris" (Latin: "from the books of"). + + **PROVENANCE SIGNIFICANCE**: + + Bookplates are crucial for provenance research: + - Document historical ownership chains + - Connect items to notable collectors + - Evidence of institutional vs. personal ownership + - May indicate stolen/looted heritage + + **USE CASES**: + + 1. **Provenance Research**: Track ownership history of rare books + 2. **Collection Documentation**: Record all bookplates in a volume + 3. **Restitution Claims**: Document pre-war ownership evidence + + **TYPES OF BOOKPLATES**: + + - Printed pictorial bookplates + - Armorial bookplates (with coat of arms) + - Typographic bookplates (text only) + - Stamps and ink marks + - Manuscript ownership inscriptions + + exact_mappings: + - bf:Bookplate + + close_mappings: + - crm:E37_Mark + - schema:Thing + + slots: + - id + - has_or_had_label + - description + - has_or_had_owner + - specificity_annotation + - template_specificity + + slot_usage: + id: + identifier: true + required: true + range: uriorcurie + pattern: ^https://nde\.nl/ontology/hc/bookplate/[a-z0-9-]+$ + examples: + - value: https://nde.nl/ontology/hc/bookplate/kb-exlibris-001 + description: KB bookplate record + has_or_had_label: + description: Text or name on the bookplate. + range: string + required: true + examples: + - value: "Ex Libris Johann Wolfgang von Goethe" + description: Goethe's bookplate + - value: "Bibliotheca Regia" + description: Royal library bookplate + description: + range: string + examples: + - value: Armorial bookplate with three lions, gilt border, 18th century + has_or_had_owner: + description: Person or institution who owned the book according to this bookplate. + range: string + examples: + - value: Johann Wolfgang von Goethe + - value: Royal Library of Prussia + + comments: + - Used for provenance research in rare book collections + - Links library items to historical owners + - Multiple bookplates may appear in single volume + + examples: + - value: + id: https://nde.nl/ontology/hc/bookplate/kb-exlibris-goethe-001 + has_or_had_label: "Ex Libris J.W. von Goethe" + description: Armorial bookplate with oak wreath, early 19th century + has_or_had_owner: Johann Wolfgang von Goethe + description: Goethe bookplate in rare book collection diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Budget.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Budget.yaml index e9811238ef..6ce70c552b 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/Budget.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/Budget.yaml @@ -12,7 +12,7 @@ imports: - ../slots/revision_date - ../slots/has_approval_date - ../slots/has_or_had_acquisition_budget -- ../slots/approved_by +- ../slots/is_or_was_approved_by # MIGRATED: was ../slots/approved_by (2026-01-15) - ../slots/budget_currency - ../slots/has_or_had_description - ../slots/has_or_had_label @@ -44,7 +44,8 @@ imports: - ../slots/was_generated_by - ./SpecificityAnnotation - ./TemplateSpecificityScores -- ../slots/was_approved_by +- ./Approver # Added for is_or_was_approved_by migration (2026-01-15) +# REMOVED: ../slots/was_approved_by - migrated to is_or_was_approved_by (2026-01-15) prefixes: linkml: https://w3id.org/linkml/ hc: https://nde.nl/ontology/hc/ @@ -92,7 +93,7 @@ classes: slots: - has_or_had_acquisition_budget - has_approval_date - - approved_by + - is_or_was_approved_by # MIGRATED: was approved_by (2026-01-15) - budget_currency - has_or_had_description - has_or_had_label @@ -244,7 +245,8 @@ classes: has_approval_date: range: date required: false - was_approved_by: + is_or_was_is_or_was_approved_by: # MIGRATED: was was_approved_by (2026-01-15) + description: Agent (person/organization) that approved this budget range: string required: false budget_status: @@ -316,7 +318,7 @@ classes: internal_funding: 25000000.0 endowment_draw: 5000000.0 approval_date: '2023-11-15' - approved_by: Board of Directors + is_or_was_approved_by: Board of Directors budget_status: ACTIVE refers_to_custodian: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804 description: Major museum annual operating budget @@ -338,7 +340,7 @@ classes: external_funding: 6000000.0 internal_funding: 2500000.0 approval_date: '2024-03-01' - approved_by: Province of Noord-Holland + is_or_was_approved_by: Province of Noord-Holland budget_status: ACTIVE refers_to_custodian: https://nde.nl/ontology/hc/nl-nh-haa-a-nha description: Regional archive government-funded budget diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/InformationCarrier.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/InformationCarrier.yaml index e6cc7f7a77..94262cdcab 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/InformationCarrier.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/InformationCarrier.yaml @@ -26,7 +26,9 @@ imports: - ../slots/has_or_had_description - ../slots/has_or_had_provenance - ../slots/has_or_had_type -- ../slots/bookplate +# bookplate REMOVED - migrated to includes_or_included with Bookplate class (Rule 53) +- ../slots/includes_or_included +- ./Bookplate - ./BindingType - ../slots/call_number - ../slots/carrier_type @@ -112,7 +114,8 @@ classes: - has_or_had_description - has_or_had_provenance - has_or_had_type - - bookplate + # bookplate REMOVED - migrated to includes_or_included (Rule 53) + - includes_or_included - call_number - carrier_type - carries_information @@ -344,12 +347,20 @@ classes: examples: - value: John Dee - value: Unknown 17th-century reader - bookplate: + includes_or_included: + description: >- + MIGRATED from bookplate (Rule 53). + Bookplate(s) present in the volume, indicating ownership. + Range narrowed to Bookplate class. required: false - range: string + range: Bookplate multivalued: true + inlined_as_list: true examples: - - value: Armorial bookplate of the Earl of Pembroke + - value: + id: https://nde.nl/ontology/hc/bookplate/pembroke-001 + has_or_had_label: "Ex Libris Earl of Pembroke" + description: Armorial bookplate of the Earl of Pembroke ownership_stamp: required: false range: string diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/Taxon.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/Taxon.yaml new file mode 100644 index 0000000000..6799380edc --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/classes/Taxon.yaml @@ -0,0 +1,106 @@ +id: https://nde.nl/ontology/hc/class/Taxon +name: taxon_class +title: Taxon Class +description: >- + Biological taxon (species, genus, family, etc.) associated with heritage objects. + + Follows Schema.org Taxon pattern for biological classification. + Used primarily for natural history collections. + +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + dwc: http://rs.tdwg.org/dwc/terms/ + skos: http://www.w3.org/2004/02/skos/core# + +default_prefix: hc + +imports: + - linkml:types + - ../slots/id + - ../slots/has_or_had_label + - ../slots/description + - ../slots/specificity_annotation + - ../slots/template_specificity + - ./SpecificityAnnotation + - ./TemplateSpecificityScores + +classes: + Taxon: + class_uri: schema:Taxon + description: >- + A biological taxon (species, genus, family, order, etc.) that can be + associated with heritage objects in natural history collections. + + **USE CASES**: + + 1. **Specimen Classification**: Link BiologicalObject to its taxonomic identification + 2. **Collection Scope**: Define taxa covered by a natural history collection + 3. **Research Context**: Document species studied in research archives + + **DARWIN CORE ALIGNMENT**: + + Uses Darwin Core terms for taxonomic data: + - dwc:scientificName - Full scientific name + - dwc:taxonRank - Level in hierarchy (species, genus, etc.) + - dwc:kingdom, dwc:phylum, dwc:class, dwc:order, dwc:family, dwc:genus + + **EXTERNAL IDENTIFIERS**: + + Link to authoritative taxonomic databases: + - GBIF (Global Biodiversity Information Facility) + - NCBI Taxonomy + - Wikidata (Q-numbers for taxa) + - BOLD (Barcode of Life) + + exact_mappings: + - schema:Taxon + - dwc:Taxon + + close_mappings: + - skos:Concept + + slots: + - id + - has_or_had_label + - description + - specificity_annotation + - template_specificity + + slot_usage: + id: + identifier: true + required: true + range: uriorcurie + pattern: ^https://nde\.nl/ontology/hc/taxon/[a-z0-9-]+$ + examples: + - value: https://nde.nl/ontology/hc/taxon/raphus-cucullatus + description: Dodo (extinct species) + has_or_had_label: + description: Scientific name of the taxon. + range: string + required: true + examples: + - value: Raphus cucullatus + description: Dodo scientific name + - value: Homo sapiens + description: Human scientific name + description: + range: string + examples: + - value: Extinct flightless bird endemic to Mauritius + + comments: + - Used for taxonomic associations in natural history collections + - Link to GBIF, NCBI, or Wikidata for authoritative identifiers + - Range should be narrowed via slot_usage when used + + examples: + - value: + id: https://nde.nl/ontology/hc/taxon/raphus-cucullatus + has_or_had_label: Raphus cucullatus + description: >- + Dodo - an extinct flightless bird that was endemic to the island + of Mauritius. Last confirmed sighting in 1662. + description: Dodo taxon for natural history specimen diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/VideoChapter.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/VideoChapter.yaml index 0549baffe6..cf2d612a4a 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/VideoChapter.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/VideoChapter.yaml @@ -8,8 +8,9 @@ imports: - ./SpecificityAnnotation - ../slots/template_specificity - ./TemplateSpecificityScores +- ./AutoGeneration # Added for is_or_was_created_through migration (2026-01-15) - ../enums/ChapterSourceEnum -- ../slots/auto_generated +- ../slots/is_or_was_created_through # MIGRATED: was ../slots/auto_generated (2026-01-15) - ../slots/chapter_description - ../slots/chapter_end_seconds - ../slots/chapter_end_time @@ -67,7 +68,7 @@ classes: related_mappings: - wikidata:Q1454986 slots: - - auto_generated + - is_or_was_created_through # MIGRATED: was auto_generated (2026-01-15) - chapter_description - chapter_end_seconds - chapter_end_time @@ -147,7 +148,8 @@ classes: examples: - value: PT5M0S description: 5 minutes - is_auto_generated: + is_or_was_created_through: # MIGRATED: was is_auto_generated (2026-01-15) + description: Whether this chapter was auto-generated by AI/platform algorithms range: boolean required: false examples: diff --git a/frontend/public/schemas/20251121/linkml/modules/classes/WebObservation.yaml b/frontend/public/schemas/20251121/linkml/modules/classes/WebObservation.yaml index b6de48f9ed..2ba880afdf 100644 --- a/frontend/public/schemas/20251121/linkml/modules/classes/WebObservation.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/classes/WebObservation.yaml @@ -13,7 +13,7 @@ prefixes: imports: - linkml:types - ./WebClaim -- ../slots/archived_at +- ../slots/is_or_was_is_or_was_archived_at # MIGRATED: was ../slots/is_or_was_archived_at (2026-01-15) - ../slots/extraction_confidence - ../slots/extraction_note - ../slots/source_url @@ -58,7 +58,7 @@ classes: \ DETECTION**:\n\nWebObservation supports tracking changes over time:\n- Link to `previous_observation` for same URL\n\ - `content_changed` flag for quick change detection\n- `content_hash` for integrity verification\n- Compare `last_modified`\ \ and `etag` across observations\n\n**ARCHIVAL INTEGRATION**:\n\nFor long-term preservation, link to archived copies:\n\ - - `archived_at` can point to Wayback Machine, Archive.today, etc.\n- Ensures cited web content remains accessible\n\n\ + - `is_or_was_archived_at` can point to Wayback Machine, Archive.today, etc.\n- Ensures cited web content remains accessible\n\n\ **EXAMPLES**:\n\n1. **EU Funding Portal Observation**\n - source_url: https://ec.europa.eu/.../topic-details/horizon-cl2-2025-heritage-01\n\ \ - retrieved_on: 2025-11-29T10:30:00Z\n - retrieved_by: \"glam-harvester/1.0\"\n - extraction_confidence: 0.95\n\ \ \n2. **Heritage Organisation Website**\n - source_url: https://www.heritagefund.org.uk/funding/medium-grants\n\ @@ -75,7 +75,7 @@ classes: - pav:sourceAccessedAt - dcterms:source slots: - - archived_at + - is_or_was_is_or_was_archived_at # MIGRATED: was is_or_was_archived_at (2026-01-15) - claim - content_changed - content_hash @@ -99,7 +99,7 @@ classes: - WebObservation is a prov:Activity documenting web content retrieval - Integrates PROV-O for provenance and PAV for retrieval-specific properties - Supports change detection via content_hash, previous_observation, content_changed - - Links to archived copies via archived_at for long-term citation + - Links to archived copies via is_or_was_archived_at for long-term citation - observed_entities links observation to extracted data (prov:generated) see_also: - https://www.w3.org/TR/prov-o/ @@ -121,7 +121,7 @@ classes: stated. Eligibility criteria parsed from HTML sections. observed_entity: - https://nde.nl/ontology/hc/call/ec/cl2-2025-heritage-01 - archived_at: https://web.archive.org/web/20251129103000/https://ec.europa.eu/info/funding-tenders/opportunities/portal/screen/opportunities/topic-details/horizon-cl2-2025-heritage-01 + is_or_was_archived_at: https://web.archive.org/web/20251129103000/https://ec.europa.eu/info/funding-tenders/opportunities/portal/screen/opportunities/topic-details/horizon-cl2-2025-heritage-01 description: Web observation of Horizon Europe CL2 2025 heritage call - value: observation_id: https://nde.nl/ontology/hc/observation/web/2025-11-28/nlhf-medium-grants diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/archived_at.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/archived_at_archived_20260115.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/archived_at.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/archived_at_archived_20260115.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/associated_taxa.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/associated_taxa_archived_20260114.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/associated_taxa.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/associated_taxa_archived_20260114.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/auto_generated.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/auto_generated_archived_20260115.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/auto_generated.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/auto_generated_archived_20260115.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/bold_id.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/bold_id_archived_20260114.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/bold_id.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/bold_id_archived_20260114.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/bookplate.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/bookplate_archived_20260114.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/bookplate.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/bookplate_archived_20260114.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/is_auto_generated.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/archive/is_auto_generated_archived_20260115.yaml similarity index 100% rename from frontend/public/schemas/20251121/linkml/modules/slots/is_auto_generated.yaml rename to frontend/public/schemas/20251121/linkml/modules/slots/archive/is_auto_generated_archived_20260115.yaml diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_approved_by.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_approved_by.yaml new file mode 100644 index 0000000000..866eda51d7 --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_approved_by.yaml @@ -0,0 +1,44 @@ +id: https://nde.nl/ontology/hc/slot/is_or_was_approved_by +name: is_or_was_approved_by_slot +title: Is Or Was Approved By Slot +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + prov: http://www.w3.org/ns/prov# + schema: http://schema.org/ +imports: +- linkml:types +default_prefix: hc +slots: + is_or_was_approved_by: + description: >- + The agent (person or organization) that approved or authorized something. + + **SEMANTIC PATTERN**: + + This slot follows the RiC-O temporal predicate pattern (is_or_was_*) + to indicate that approval is a historical event - something was approved + by someone at some point in time. + + **REPLACES**: + + - `approved_by` - Simple string field for approver name + + **RANGE OPTIONS**: + + - string: Simple approver name (backwards compatible) + - Approver: Structured approver with identity link + + Classes should use slot_usage to specify appropriate range. + + slot_uri: prov:wasAttributedTo + range: string + exact_mappings: + - prov:wasAttributedTo + close_mappings: + - schema:author + examples: + - value: "Museum Director" + description: Role-based approver + - value: "Board of Directors" + description: Organizational body approver diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_archived_at.yaml b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_archived_at.yaml new file mode 100644 index 0000000000..ceb638d4fb --- /dev/null +++ b/frontend/public/schemas/20251121/linkml/modules/slots/is_or_was_archived_at.yaml @@ -0,0 +1,44 @@ +id: https://nde.nl/ontology/hc/slot/is_or_was_archived_at +name: is_or_was_archived_at_slot +title: Is Or Was Archived At Slot +prefixes: + linkml: https://w3id.org/linkml/ + hc: https://nde.nl/ontology/hc/ + schema: http://schema.org/ + prov: http://www.w3.org/ns/prov# +imports: +- linkml:types +default_prefix: hc +slots: + is_or_was_archived_at: + description: >- + Location or URL where content was archived or preserved. + + **SEMANTIC PATTERN**: + + This slot follows the RiC-O temporal predicate pattern (is_or_was_*) + to indicate that archival location may change over time or refer to + historical archival events. + + **REPLACES**: + + - `archived_at` - URL to archived version (e.g., Wayback Machine) + - `was_archived_at` - Similar pattern + + **USE CASES**: + + 1. **Web Archival**: Link to Internet Archive/Wayback Machine snapshots + 2. **Platform Preservation**: Where deprecated platforms are preserved + 3. **Content Snapshots**: Historical versions of web content + + slot_uri: schema:archivedAt + range: uri + exact_mappings: + - schema:archivedAt + close_mappings: + - prov:atLocation + examples: + - value: "https://web.archive.org/web/20211231/https://example.nl/exhibition/" + description: Wayback Machine archived URL + - value: "https://archive.org/details/example-collection" + description: Internet Archive collection diff --git a/frontend/public/schemas/20251121/linkml/modules/slots/manifest.json b/frontend/public/schemas/20251121/linkml/modules/slots/manifest.json index 55929a803a..23c7b33e2d 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/manifest.json +++ b/frontend/public/schemas/20251121/linkml/modules/slots/manifest.json @@ -22,7 +22,6 @@ "area_hectares.yaml", "arrangement_notes.yaml", "asserted_by.yaml", - "associated_taxa.yaml", "audio_event_segments.yaml", "authors.yaml", "auto_generated.yaml", @@ -45,9 +44,7 @@ "bio_type_classification.yaml", "birth_date.yaml", "birth_place.yaml", - "bold_id.yaml", "booking_required.yaml", - "bookplate.yaml", "borrower.yaml", "borrower_contact.yaml", "bounding_box.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 b46690503f..32539a7d11 100644 --- a/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml +++ b/frontend/public/schemas/20251121/linkml/modules/slots/slot_fixes.yaml @@ -349,10 +349,10 @@ fixes: - original_slot_id: https://nde.nl/ontology/hc/slot/api_available processed: - status: false - timestamp: null - session: null - notes: "Requires AvailabilityStatus class creation" + status: true + timestamp: '2026-01-15T12:00:00Z' + session: "session-2026-01-15-availability-migration" + notes: "FULLY MIGRATED: CollectionManagementSystem - api_available and has_api_available_flag REMOVED, using is_or_was_available. Created AvailabilityStatus class. Both slots archived to archive/." revision: - label: is_or_was_available type: slot @@ -361,10 +361,10 @@ fixes: - original_slot_id: https://nde.nl/ontology/hc/slot/api_documentation processed: - status: false - timestamp: null - session: null - notes: "Requires Documentation class creation" + status: true + timestamp: '2026-01-15T12:15:00Z' + session: "session-2026-01-15-documentation-migration" + notes: "FULLY MIGRATED: AuxiliaryDigitalPlatform - api_documentation and has_api_documentation_url REMOVED, using has_or_had_documentation. Created Documentation class. Both slots archived to archive/." revision: - label: has_or_had_documentation type: slot @@ -530,10 +530,14 @@ fixes: - original_slot_id: https://nde.nl/ontology/hc/slot/associated_taxa processed: - status: false - timestamp: null - session: null - notes: "Maps to existing Taxon class" + status: true + timestamp: '2026-01-14T22:45:00Z' + session: "session-2026-01-14-association-migration" + notes: >- + FULLY MIGRATED: BiologicalObject - associated_taxa REMOVED. + Replaced with is_or_was_associated_with slot (created this session). + Created Taxon class (schema:Taxon alignment) for range narrowing. + Slot archived to modules/slots/archive/associated_taxa_archived_20260114.yaml (Rule 53). revision: - label: is_or_was_associated_with type: slot @@ -578,10 +582,10 @@ fixes: - original_slot_id: https://nde.nl/ontology/hc/slot/auto_generated processed: - status: false - timestamp: null - session: null - notes: "Requires AutoGeneration class creation" + status: true + timestamp: '2026-01-15T12:30:00Z' + session: "session-2026-01-15-autogeneration-migration" + notes: "FULLY MIGRATED: VideoSubtitle + VideoChapter - auto_generated and is_auto_generated REMOVED, using is_or_was_created_through. Created AutoGeneration class. Both slots archived to archive/." revision: - label: is_or_was_created_through type: slot @@ -847,10 +851,14 @@ fixes: - original_slot_id: https://nde.nl/ontology/hc/slot/bold_id processed: - status: false - timestamp: null - session: null - notes: "Requires BOLDIdentifier class creation" + status: true + timestamp: '2026-01-14T23:00:00Z' + session: "session-2026-01-14-identifier-migration" + notes: >- + FULLY MIGRATED: BiologicalObject - bold_id REMOVED. + Created BOLDIdentifier class (Barcode of Life Data System identifier). + Replaced with has_or_had_identifier slot with range BOLDIdentifier. + Slot archived to modules/slots/archive/bold_id_archived_20260114.yaml (Rule 53). revision: - label: has_or_had_identifier type: slot @@ -879,10 +887,14 @@ fixes: - original_slot_id: https://nde.nl/ontology/hc/slot/bookplate processed: - status: false - timestamp: null - session: null - notes: "Requires Bookplate class creation" + status: true + timestamp: '2026-01-14T23:15:00Z' + session: "session-2026-01-14-bookplate-migration" + notes: >- + FULLY MIGRATED: InformationCarrier - bookplate REMOVED. + Created Bookplate class (bf:Bookplate alignment) for provenance/ownership marks. + Replaced with includes_or_included slot with range Bookplate. + Slot archived to modules/slots/archive/bookplate_archived_20260114.yaml (Rule 53). revision: - label: includes_or_included type: slot diff --git a/frontend/src/pages/LinkMLViewerPage.tsx b/frontend/src/pages/LinkMLViewerPage.tsx index 97addc6294..c28ba144ec 100644 --- a/frontend/src/pages/LinkMLViewerPage.tsx +++ b/frontend/src/pages/LinkMLViewerPage.tsx @@ -1038,9 +1038,23 @@ const TEXT = { clearSearch: { nl: 'Zoekopdracht wissen', en: 'Clear search' }, // Slot exports (classes using this slot) exports: { nl: 'Exports', en: 'Exports' }, - classesUsingSlot: { nl: 'Klassen die deze slot gebruiken:', en: 'Classes using this slot:' }, - classesWithSlotUsage: { nl: 'Klassen met slot_usage overschrijvingen:', en: 'Classes with slot_usage overrides:' }, + classesUsingSlot: { nl: 'Klassen die deze slot gebruiken', en: 'Classes using this slot' }, + classesWithSlotUsage: { nl: 'Klassen met slot_usage overschrijvingen', en: 'Classes with slot_usage overrides' }, noClassesUsingSlot: { nl: 'Geen klassen gebruiken deze slot.', en: 'No classes use this slot.' }, + // Slot imports/exports (dependencies) + slotImports: { nl: 'Imports', en: 'Imports' }, + slotImportsTooltip: { + nl: 'Toont welke klassen en enumeraties deze slot als range type gebruikt', + en: 'Shows what classes and enums this slot depends on as range type' + }, + slotExports: { nl: 'Exports', en: 'Exports' }, + slotExportsTooltip: { + nl: 'Toont welke klassen deze slot gebruiken', + en: 'Shows what classes use this slot' + }, + rangeTypeLabel: { nl: 'Range Type', en: 'Range Type' }, + anyOfTypesLabel: { nl: 'Any Of Types', en: 'Any Of Types' }, + noSlotImports: { nl: 'Deze slot heeft geen afhankelijkheden van klassen of enumeraties.', en: 'This slot has no dependencies on classes or enums.' }, }; // Dynamically discover schema files from the modules directory diff --git a/schemas/20251121/linkml/manifest.json b/schemas/20251121/linkml/manifest.json index 2aea1d0187..64ab71ea07 100644 --- a/schemas/20251121/linkml/manifest.json +++ b/schemas/20251121/linkml/manifest.json @@ -1,12 +1,12 @@ { - "generated": "2026-01-14T12:28:33.699Z", + "generated": "2026-01-14T14:05:38.322Z", "schemaRoot": "/schemas/20251121/linkml", "totalFiles": 2884, "categoryCounts": { "main": 4, - "class": 675, + "class": 679, "enum": 147, - "slot": 2054, + "slot": 2050, "module": 4 }, "categories": [ @@ -160,6 +160,11 @@ "path": "modules/classes/Appellation.yaml", "category": "class" }, + { + "name": "Approver", + "path": "modules/classes/Approver.yaml", + "category": "class" + }, { "name": "ArchitecturalArchive", "path": "modules/classes/ArchitecturalArchive.yaml", @@ -365,6 +370,16 @@ "path": "modules/classes/BiologicalObject.yaml", "category": "class" }, + { + "name": "BOLDIdentifier", + "path": "modules/classes/BOLDIdentifier.yaml", + "category": "class" + }, + { + "name": "Bookplate", + "path": "modules/classes/Bookplate.yaml", + "category": "class" + }, { "name": "BranchOffice", "path": "modules/classes/BranchOffice.yaml", @@ -2940,6 +2955,11 @@ "path": "modules/classes/TasteScentHeritageType.yaml", "category": "class" }, + { + "name": "Taxon", + "path": "modules/classes/Taxon.yaml", + "category": "class" + }, { "name": "TelevisionArchive", "path": "modules/classes/TelevisionArchive.yaml", @@ -4217,11 +4237,6 @@ "path": "modules/slots/approximate.yaml", "category": "slot" }, - { - "name": "archived_at", - "path": "modules/slots/archived_at.yaml", - "category": "slot" - }, { "name": "area_hectares", "path": "modules/slots/area_hectares.yaml", @@ -4237,11 +4252,6 @@ "path": "modules/slots/asserted_by.yaml", "category": "slot" }, - { - "name": "associated_taxa", - "path": "modules/slots/associated_taxa.yaml", - "category": "slot" - }, { "name": "audio_event_segments", "path": "modules/slots/audio_event_segments.yaml", @@ -4252,11 +4262,6 @@ "path": "modules/slots/authors.yaml", "category": "slot" }, - { - "name": "auto_generated", - "path": "modules/slots/auto_generated.yaml", - "category": "slot" - }, { "name": "auxiliary_places", "path": "modules/slots/auxiliary_places.yaml", @@ -4322,16 +4327,6 @@ "path": "modules/slots/birth_place.yaml", "category": "slot" }, - { - "name": "bold_id", - "path": "modules/slots/bold_id.yaml", - "category": "slot" - }, - { - "name": "bookplate", - "path": "modules/slots/bookplate.yaml", - "category": "slot" - }, { "name": "borrower", "path": "modules/slots/borrower.yaml", @@ -9362,11 +9357,6 @@ "path": "modules/slots/is_approximate.yaml", "category": "slot" }, - { - "name": "is_auto_generated", - "path": "modules/slots/is_auto_generated.yaml", - "category": "slot" - }, { "name": "is_auxiliary_of_place", "path": "modules/slots/is_auxiliary_of_place.yaml", @@ -9502,11 +9492,21 @@ "path": "modules/slots/is_or_was_also_allocation_agency.yaml", "category": "slot" }, + { + "name": "is_or_was_approved_by", + "path": "modules/slots/is_or_was_approved_by.yaml", + "category": "slot" + }, { "name": "is_or_was_archive_department_of", "path": "modules/slots/is_or_was_archive_department_of.yaml", "category": "slot" }, + { + "name": "is_or_was_archived_at", + "path": "modules/slots/is_or_was_archived_at.yaml", + "category": "slot" + }, { "name": "is_or_was_archived_in", "path": "modules/slots/is_or_was_archived_in.yaml", diff --git a/schemas/20251121/linkml/modules/classes/Budget.yaml b/schemas/20251121/linkml/modules/classes/Budget.yaml index e9811238ef..6ce70c552b 100644 --- a/schemas/20251121/linkml/modules/classes/Budget.yaml +++ b/schemas/20251121/linkml/modules/classes/Budget.yaml @@ -12,7 +12,7 @@ imports: - ../slots/revision_date - ../slots/has_approval_date - ../slots/has_or_had_acquisition_budget -- ../slots/approved_by +- ../slots/is_or_was_approved_by # MIGRATED: was ../slots/approved_by (2026-01-15) - ../slots/budget_currency - ../slots/has_or_had_description - ../slots/has_or_had_label @@ -44,7 +44,8 @@ imports: - ../slots/was_generated_by - ./SpecificityAnnotation - ./TemplateSpecificityScores -- ../slots/was_approved_by +- ./Approver # Added for is_or_was_approved_by migration (2026-01-15) +# REMOVED: ../slots/was_approved_by - migrated to is_or_was_approved_by (2026-01-15) prefixes: linkml: https://w3id.org/linkml/ hc: https://nde.nl/ontology/hc/ @@ -92,7 +93,7 @@ classes: slots: - has_or_had_acquisition_budget - has_approval_date - - approved_by + - is_or_was_approved_by # MIGRATED: was approved_by (2026-01-15) - budget_currency - has_or_had_description - has_or_had_label @@ -244,7 +245,8 @@ classes: has_approval_date: range: date required: false - was_approved_by: + is_or_was_is_or_was_approved_by: # MIGRATED: was was_approved_by (2026-01-15) + description: Agent (person/organization) that approved this budget range: string required: false budget_status: @@ -316,7 +318,7 @@ classes: internal_funding: 25000000.0 endowment_draw: 5000000.0 approval_date: '2023-11-15' - approved_by: Board of Directors + is_or_was_approved_by: Board of Directors budget_status: ACTIVE refers_to_custodian: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804 description: Major museum annual operating budget @@ -338,7 +340,7 @@ classes: external_funding: 6000000.0 internal_funding: 2500000.0 approval_date: '2024-03-01' - approved_by: Province of Noord-Holland + is_or_was_approved_by: Province of Noord-Holland budget_status: ACTIVE refers_to_custodian: https://nde.nl/ontology/hc/nl-nh-haa-a-nha description: Regional archive government-funded budget diff --git a/schemas/20251121/linkml/modules/classes/InformationCarrier.yaml b/schemas/20251121/linkml/modules/classes/InformationCarrier.yaml index 1c506e9158..94262cdcab 100644 --- a/schemas/20251121/linkml/modules/classes/InformationCarrier.yaml +++ b/schemas/20251121/linkml/modules/classes/InformationCarrier.yaml @@ -347,12 +347,20 @@ classes: examples: - value: John Dee - value: Unknown 17th-century reader - bookplate: + includes_or_included: + description: >- + MIGRATED from bookplate (Rule 53). + Bookplate(s) present in the volume, indicating ownership. + Range narrowed to Bookplate class. required: false - range: string + range: Bookplate multivalued: true + inlined_as_list: true examples: - - value: Armorial bookplate of the Earl of Pembroke + - value: + id: https://nde.nl/ontology/hc/bookplate/pembroke-001 + has_or_had_label: "Ex Libris Earl of Pembroke" + description: Armorial bookplate of the Earl of Pembroke ownership_stamp: required: false range: string diff --git a/schemas/20251121/linkml/modules/classes/StorageConditionPolicy.yaml b/schemas/20251121/linkml/modules/classes/StorageConditionPolicy.yaml index badc553fcd..c9d0cb6654 100644 --- a/schemas/20251121/linkml/modules/classes/StorageConditionPolicy.yaml +++ b/schemas/20251121/linkml/modules/classes/StorageConditionPolicy.yaml @@ -31,7 +31,7 @@ imports: - ../slots/light_max_lux - ../slots/particulate_max - ../slots/pest_management_required -- ../slots/policy_approved_by +- ../slots/is_or_was_approved_by # MIGRATED: was ../slots/policy_approved_by (2026-01-15) - ../slots/policy_description - ../slots/policy_effective_from - ../slots/policy_effective_to @@ -46,6 +46,7 @@ imports: - ../slots/uv_filtered_required - ./SpecificityAnnotation - ./TemplateSpecificityScores +- ./Approver # Added for is_or_was_approved_by migration (2026-01-15) classes: StorageConditionPolicy: class_uri: odrl:Policy @@ -91,7 +92,7 @@ classes: - note - particulate_max - pest_management_required - - policy_approved_by + - is_or_was_approved_by # MIGRATED: was policy_approved_by (2026-01-15) - policy_description - policy_effective_from - policy_effective_to diff --git a/schemas/20251121/linkml/modules/slots/bookplate.yaml b/schemas/20251121/linkml/modules/slots/archive/bookplate_archived_20260114.yaml similarity index 100% rename from schemas/20251121/linkml/modules/slots/bookplate.yaml rename to schemas/20251121/linkml/modules/slots/archive/bookplate_archived_20260114.yaml diff --git a/schemas/20251121/linkml/modules/slots/manifest.json b/schemas/20251121/linkml/modules/slots/manifest.json index 49becf2858..23c7b33e2d 100644 --- a/schemas/20251121/linkml/modules/slots/manifest.json +++ b/schemas/20251121/linkml/modules/slots/manifest.json @@ -45,7 +45,6 @@ "birth_date.yaml", "birth_place.yaml", "booking_required.yaml", - "bookplate.yaml", "borrower.yaml", "borrower_contact.yaml", "bounding_box.yaml", diff --git a/schemas/20251121/linkml/modules/slots/slot_fixes.yaml b/schemas/20251121/linkml/modules/slots/slot_fixes.yaml index 7206105005..32539a7d11 100644 --- a/schemas/20251121/linkml/modules/slots/slot_fixes.yaml +++ b/schemas/20251121/linkml/modules/slots/slot_fixes.yaml @@ -887,10 +887,14 @@ fixes: - original_slot_id: https://nde.nl/ontology/hc/slot/bookplate processed: - status: false - timestamp: null - session: null - notes: "Requires Bookplate class creation" + status: true + timestamp: '2026-01-14T23:15:00Z' + session: "session-2026-01-14-bookplate-migration" + notes: >- + FULLY MIGRATED: InformationCarrier - bookplate REMOVED. + Created Bookplate class (bf:Bookplate alignment) for provenance/ownership marks. + Replaced with includes_or_included slot with range Bookplate. + Slot archived to modules/slots/archive/bookplate_archived_20260114.yaml (Rule 53). revision: - label: includes_or_included type: slot diff --git a/src/glam_extractor/api/entity_review.py b/src/glam_extractor/api/entity_review.py index 2090f438c8..ac8a26b832 100644 --- a/src/glam_extractor/api/entity_review.py +++ b/src/glam_extractor/api/entity_review.py @@ -1456,25 +1456,26 @@ async def add_manual_candidate(request: AddCandidateRequest): message=f"Candidate {linkedin_slug} already exists for this profile" ) - # Fetch LinkedIn profile using Exa API (if available) + # Fetch LinkedIn profile using configured providers (exa, linkup, or both) linkedin_url = f"https://www.linkedin.com/in/{linkedin_slug}" profile_data = None entity_filepath = None - exa_response = None + fetch_response = None + provider_used = None - if EXA_API_KEY: - exa_response = await fetch_linkedin_profile_exa(linkedin_url) - if exa_response: - profile_data = parse_linkedin_profile_from_exa(exa_response) - # Save entity profile file - source_info = { - 'linkedin_url': linkedin_url, - 'wcms_name': wcms_data.get('wcms_name', ''), - 'wcms_institution': wcms_data.get('wcms_email_domain', '') - } - entity_filepath = await save_entity_profile( - linkedin_slug, profile_data, exa_response, source_info - ) + fetch_response = await fetch_linkedin_profile(linkedin_url) + if fetch_response: + provider_used = fetch_response.get('provider', 'unknown') + profile_data = parse_linkedin_profile_from_exa(fetch_response) # Parser works for both providers + # Save entity profile file + source_info = { + 'linkedin_url': linkedin_url, + 'wcms_name': wcms_data.get('wcms_name', ''), + 'wcms_institution': wcms_data.get('wcms_email_domain', '') + } + entity_filepath = await save_entity_profile( + linkedin_slug, profile_data, fetch_response, source_info + ) # Generate a PPID for the LinkedIn candidate # Format: ID_XX-XX-XXX_XXXX_XX-XX-XXX_XXXX_NAME-SLUG @@ -1516,7 +1517,7 @@ async def add_manual_candidate(request: AddCandidateRequest): "display_name": display_name, "name_romanized": None, "name_tokens": [t.upper() for t in display_name.split()], - "source": "exa_extraction" if profile_data else "manual_entry" + "source": f"{provider_used}_extraction" if profile_data else "manual_entry" }, "linkedin_slug": linkedin_slug, "linkedin_headline": headline, @@ -1527,7 +1528,7 @@ async def add_manual_candidate(request: AddCandidateRequest): "email_domain_matches_employer": False, "employer_name_overlap": [], "confidence_score": 0.6 if profile_data else 0.5, # Higher if we got profile data - "match_signals": ["manual_entry", "exa_profile_fetched"] if profile_data else ["manual_entry"], + "match_signals": ["manual_entry", f"{provider_used}_profile_fetched"] if profile_data else ["manual_entry"], "requires_review": True, "reviewed": False, "review_decision": None,