glam/scripts/update_slot_mappings.py
kempersc 0845d9f30e feat(scripts): add person enrichment and slot mapping utilities
Person Enrichment Scripts:
- enrich_person_comprehensive.py: Full-featured web search enrichment via Linkup
  with Rule 6/21/26/34/35 compliance (dual timestamps, no fabrication)
- enrich_ppids_linkup.py: Batch PPID enrichment pipeline
- extract_persons_with_provenance.py: Extract person data from LinkedIn HTML
  with XPath provenance tracking

LinkML Slot Management:
- update_slot_mappings.py: Update slots for RiC-O naming (Rule 39) and
  semantic URI requirements (Rule 38)
- update_class_slot_references.py: Update class files referencing renamed slots
- validate_slot_mappings.py: Validate slot definitions against ontology rules

All scripts follow established project conventions for provenance and
ontology alignment.
2026-01-10 13:32:32 +01:00

1955 lines
73 KiB
Python

#!/usr/bin/env python3
"""
Update LinkML slot files with proper RiC-O style naming and comprehensive ontology mappings.
This script updates slot files to comply with:
- Rule 39: Slot Naming Convention (RiC-O Style)
- Rule 38: Slot Centralization and Semantic URI Requirements
- Rule 42: No Ontology Prefixes in Slot Names
- Rule 43: Slot Nouns Must Be Singular
Usage:
python scripts/update_slot_mappings.py --dry-run # Preview changes
python scripts/update_slot_mappings.py # Apply changes
"""
import os
import re
import yaml
from pathlib import Path
from typing import Dict, List, Optional, Tuple
from dataclasses import dataclass, field
# Slot definitions with proper naming and mappings
# Format: old_name -> (new_name, slot_uri, exact_mappings, close_mappings, related_mappings, narrow_mappings, broad_mappings, description)
@dataclass
class SlotDefinition:
"""Definition for a slot with all mapping types."""
new_name: str
slot_uri: str
description: str
range_type: str = "string"
multivalued: bool = False
exact_mappings: List[str] = field(default_factory=list)
close_mappings: List[str] = field(default_factory=list)
related_mappings: List[str] = field(default_factory=list)
narrow_mappings: List[str] = field(default_factory=list)
broad_mappings: List[str] = field(default_factory=list)
custodian_types: str = '["*"]'
custodian_types_rationale: str = "Applicable to all heritage custodian types."
custodian_types_primary: str = "M"
specificity_score: float = 0.50
specificity_rationale: str = "Moderately specific slot."
# Comprehensive slot definitions
SLOT_DEFINITIONS: Dict[str, SlotDefinition] = {
# ===== A =====
"abbreviation": SlotDefinition(
new_name="has_or_had_abbreviation",
slot_uri="gleif-base:hasAbbreviation",
description="""Short form or acronym of an organization's name. Uses RiC-O style temporal
naming because abbreviations can change over time (e.g., rebranding).
The slot_uri gleif-base:hasAbbreviation from GLEIF Base ontology indicates an abbreviated
form of a legal entity's name.""",
multivalued=True,
exact_mappings=["gleif-base:hasAbbreviation"],
close_mappings=["skos:altLabel", "schema:alternateName"],
related_mappings=["dbp:abbreviation", "gn:alternateName"],
broad_mappings=["rdfs:label"],
),
"about_digital_presence": SlotDefinition(
new_name="is_or_was_about_digital_presence",
slot_uri="rico:isOrWasSubjectOf",
description="""Indicates that this entity is the subject of a digital presence record.
Uses RiC-O isOrWasSubjectOf to express that the custodian is what the digital presence describes.""",
exact_mappings=["rico:isOrWasSubjectOf"],
close_mappings=["dcterms:subject", "schema:about"],
related_mappings=["foaf:isPrimaryTopicOf"],
),
"about_text": SlotDefinition(
new_name="has_or_had_about_text",
slot_uri="dcterms:abstract",
description="""Descriptive 'about' text for an institution, typically from their website.
Uses dcterms:abstract as the primary predicate for summary/descriptive content.""",
exact_mappings=["dcterms:abstract"],
close_mappings=["dcterms:description", "schema:description", "schema:abstract"],
related_mappings=["tooi:onderwerp", "skos:note"],
broad_mappings=["rdfs:comment"],
),
"academic_affiliation": SlotDefinition(
new_name="has_or_had_academic_affiliation",
slot_uri="schema:affiliation",
description="""Academic institution(s) with which a person or organization is affiliated.
Uses schema:affiliation as the primary predicate for organizational relationships.""",
multivalued=True,
exact_mappings=["schema:affiliation"],
close_mappings=["org:memberOf", "rico:isOrWasMemberOf", "pico:hasAffiliation"],
related_mappings=["foaf:member", "schema:alumniOf"],
broad_mappings=["schema:organization"],
),
"academic_programs": SlotDefinition(
new_name="has_or_had_academic_program",
slot_uri="schema:hasCourse",
description="""Academic programs offered by a heritage institution, such as museum studies,
archival science, conservation, or library science programs.""",
multivalued=True,
exact_mappings=["schema:hasCourse"],
close_mappings=["schema:educationalProgram"],
related_mappings=["dbp:programCost", "schema:courseCode"],
broad_mappings=["schema:hasPart"],
custodian_types='["E", "R", "M", "L", "A"]',
custodian_types_primary="E",
specificity_score=0.65,
),
"accepts_external_work": SlotDefinition(
new_name="accepts_or_accepted_external_work",
slot_uri="hc:acceptsOrAcceptedExternalWork",
description="""Indicates whether a conservation lab accepts external work from other
institutions or private clients. Temporal naming reflects that policies can change.""",
range_type="boolean",
close_mappings=["gr:eligibleCustomerTypes", "schema:areaServed"],
related_mappings=["schema:serviceType", "schema:availableChannel"],
custodian_types='["M", "A", "L", "R"]',
specificity_score=0.80,
),
"accepts_payment_methods": SlotDefinition(
new_name="accepts_or_accepted_payment_method",
slot_uri="schema:paymentAccepted",
description="""Payment methods accepted by the institution for fees, purchases, or donations.
From Schema.org: 'Cash, Credit Card, Cryptocurrency, etc.'""",
multivalued=True,
exact_mappings=["schema:paymentAccepted"],
close_mappings=["schema:acceptedPaymentMethod", "gr:acceptedPaymentMethods"],
specificity_score=0.40,
),
"accepts_visiting_scholars": SlotDefinition(
new_name="accepts_or_accepted_visiting_scholar",
slot_uri="hc:acceptsOrAcceptedVisitingScholar",
description="""Indicates whether the institution accepts visiting scholars or researchers.
Temporal naming reflects that policies can change over time.""",
range_type="boolean",
close_mappings=["schema:amenityFeature"],
related_mappings=["schema:hasOfferCatalog"],
custodian_types='["R", "A", "L", "M", "E"]',
custodian_types_primary="R",
specificity_score=0.70,
),
"access": SlotDefinition(
new_name="has_or_had_access_condition",
slot_uri="dcterms:accessRights",
description="""General access conditions or restrictions for a resource or institution.
Uses dcterms:accessRights from Dublin Core Terms.""",
exact_mappings=["dcterms:accessRights"],
close_mappings=["rico:hasOrHadAllMembersWithContentType", "schema:conditionsOfAccess"],
related_mappings=["premis:hasRightsStatement"],
broad_mappings=["dcterms:rights"],
),
"access_application_url": SlotDefinition(
new_name="has_access_application_url",
slot_uri="schema:url",
description="""URL where users can apply for access to restricted materials or services.
Permanent fact (URL location), not temporal.""",
range_type="uri",
exact_mappings=["schema:url"],
close_mappings=["schema:potentialAction"],
related_mappings=["dcterms:accessRights"],
narrow_mappings=["schema:applicationContact"],
),
"access_control": SlotDefinition(
new_name="has_or_had_access_control",
slot_uri="premis:hasRightsStatement",
description="""Access control mechanisms or policies in place for resources.
Uses PREMIS for preservation/access rights context.""",
exact_mappings=["premis:hasRightsStatement"],
close_mappings=["dcterms:accessRights", "rico:hasOrHadAllMembersWithContentType"],
related_mappings=["schema:conditionsOfAccess"],
),
"access_description": SlotDefinition(
new_name="has_or_had_access_description",
slot_uri="rico:scopeAndContent",
description="""Textual description of access conditions, requirements, or procedures.""",
exact_mappings=["rico:scopeAndContent"],
close_mappings=["dcterms:description", "schema:description"],
narrow_mappings=["dcterms:accessRights"],
),
"access_frequency": SlotDefinition(
new_name="has_or_had_access_frequency",
slot_uri="dcat:accessFrequency",
description="""Frequency with which a resource is accessed or updated.
From DCAT vocabulary for dataset descriptions.""",
close_mappings=["dcterms:accrualPeriodicity"],
related_mappings=["schema:temporalCoverage"],
),
"access_interface_url": SlotDefinition(
new_name="has_access_interface_url",
slot_uri="dcat:accessURL",
description="""URL providing access to a resource or interface.
From DCAT: 'A URL of the resource that gives access to a distribution.'""",
range_type="uri",
exact_mappings=["dcat:accessURL"],
close_mappings=["schema:url", "dcat:downloadURL"],
related_mappings=["schema:WebAPI"],
),
"access_level": SlotDefinition(
new_name="has_or_had_access_level",
slot_uri="dcterms:accessRights",
description="""Level of access granted (e.g., public, restricted, confidential).
Temporal as access levels can change.""",
exact_mappings=["dcterms:accessRights"],
close_mappings=["schema:conditionsOfAccess"],
related_mappings=["premis:hasRightsStatement"],
),
"access_management": SlotDefinition(
new_name="has_or_had_access_management",
slot_uri="rico:hasOrHadManager",
description="""Entity or system responsible for managing access to resources.""",
close_mappings=["rico:hasOrHadManager", "prov:wasAttributedTo"],
related_mappings=["dcterms:rightsHolder"],
),
"access_policy": SlotDefinition(
new_name="has_or_had_access_policy",
slot_uri="dcterms:accessRights",
description="""Formal policy governing access to collections or services.""",
exact_mappings=["dcterms:accessRights"],
close_mappings=["schema:publishingPrinciples", "rico:hasOrHadRegulation"],
related_mappings=["premis:hasRightsStatement"],
),
"access_policy_ref": SlotDefinition(
new_name="has_access_policy_reference",
slot_uri="dcterms:references",
description="""Reference (URL or citation) to an access policy document.""",
range_type="uri",
exact_mappings=["dcterms:references"],
close_mappings=["schema:citation", "dcterms:source"],
),
"access_restricted": SlotDefinition(
new_name="is_or_was_access_restricted",
slot_uri="rico:hasOrHadAllMembersWithContentType",
description="""Boolean indicating whether access is restricted. Temporal as
restrictions can be lifted or imposed over time.""",
range_type="boolean",
close_mappings=["dcterms:accessRights"],
related_mappings=["schema:conditionsOfAccess"],
),
"access_restriction": SlotDefinition(
new_name="has_or_had_access_restriction",
slot_uri="rico:hasOrHadAllMembersWithContentType",
description="""Specific access restriction applied to resources.""",
exact_mappings=["rico:hasOrHadAllMembersWithContentType"],
close_mappings=["dcterms:accessRights", "premis:hasRightsStatement"],
),
"access_restrictions": SlotDefinition(
new_name="has_or_had_access_restriction",
slot_uri="rico:hasOrHadAllMembersWithContentType",
description="""Access restrictions applied to resources (singular per Rule 43).""",
multivalued=True,
exact_mappings=["rico:hasOrHadAllMembersWithContentType"],
close_mappings=["dcterms:accessRights", "premis:hasRightsStatement"],
),
"access_rights": SlotDefinition(
new_name="has_or_had_access_right",
slot_uri="dcterms:accessRights",
description="""Rights statement regarding access to the resource.
From Dublin Core Terms: 'Information about who access the resource or an indication
of its security status.'""",
exact_mappings=["dcterms:accessRights"],
close_mappings=["schema:conditionsOfAccess", "rico:hasOrHadAllMembersWithContentType"],
related_mappings=["premis:hasRightsStatement", "edm:rights"],
broad_mappings=["dcterms:rights"],
),
"access_trigger_events": SlotDefinition(
new_name="has_or_had_access_trigger_event",
slot_uri="rico:isTriggeredByEvent",
description="""Events that trigger changes in access status (e.g., embargo expiry).""",
multivalued=True,
exact_mappings=["rico:isTriggeredByEvent"],
close_mappings=["prov:wasGeneratedBy"],
related_mappings=["schema:potentialAction"],
),
"accessibility_features": SlotDefinition(
new_name="has_or_had_accessibility_feature",
slot_uri="schema:accessibilityFeature",
description="""Accessibility features provided by the institution or resource.
From Schema.org accessibility vocabulary.""",
multivalued=True,
exact_mappings=["schema:accessibilityFeature"],
close_mappings=["schema:accessMode", "schema:accessModeSufficient"],
related_mappings=["schema:accessibilityHazard", "schema:accessibilitySummary"],
),
"accession_date": SlotDefinition(
new_name="has_accession_date",
slot_uri="rico:hasAccessionDate",
description="""Date when materials were formally accessioned into a collection.
Permanent fact - the accession date doesn't change.""",
range_type="date",
exact_mappings=["rico:hasAccessionDate"],
close_mappings=["dcterms:date", "schema:dateCreated"],
related_mappings=["prov:generatedAtTime"],
narrow_mappings=["dcterms:dateAccepted"],
),
"accession_number": SlotDefinition(
new_name="has_accession_number",
slot_uri="rico:identifier",
description="""Unique identifier assigned when materials are accessioned.
Permanent identifier - doesn't change once assigned.""",
exact_mappings=["rico:identifier"],
close_mappings=["dcterms:identifier", "schema:identifier"],
narrow_mappings=["rico:hasAccessionNumber"],
),
"account_id": SlotDefinition(
new_name="has_account_identifier",
slot_uri="schema:identifier",
description="""Identifier for an account (e.g., social media, platform account).""",
exact_mappings=["schema:identifier"],
close_mappings=["dcterms:identifier"],
related_mappings=["foaf:accountName"],
),
"account_name": SlotDefinition(
new_name="has_or_had_account_name",
slot_uri="foaf:accountName",
description="""Name or handle of an account. Temporal as account names can change.""",
exact_mappings=["foaf:accountName"],
close_mappings=["schema:alternateName"],
related_mappings=["foaf:nick"],
),
"account_status": SlotDefinition(
new_name="has_or_had_account_status",
slot_uri="schema:status",
description="""Current status of an account (active, suspended, deleted, etc.).""",
exact_mappings=["schema:status"],
close_mappings=["rico:hasRecordState"],
related_mappings=["schema:eventStatus"],
),
"accreditation": SlotDefinition(
new_name="has_or_had_accreditation",
slot_uri="schema:hasCredential",
description="""Accreditation status or credential held by the institution.
Temporal as accreditations can expire or be revoked.""",
exact_mappings=["schema:hasCredential"],
close_mappings=["org:classification"],
related_mappings=["schema:award", "schema:memberOf"],
),
"accreditation_body": SlotDefinition(
new_name="has_or_had_accreditation_body",
slot_uri="schema:recognizedBy",
description="""Organization that granted the accreditation.""",
exact_mappings=["schema:recognizedBy"],
close_mappings=["prov:wasAttributedTo"],
related_mappings=["schema:issuedBy", "dcterms:publisher"],
),
"accumulation_date_end": SlotDefinition(
new_name="has_accumulation_end_date",
slot_uri="rico:hasEndDate",
description="""End date of the accumulation period for archival materials.
From RiC-O for archival date ranges.""",
range_type="date",
exact_mappings=["rico:hasEndDate"],
close_mappings=["schema:endDate", "dcterms:date"],
broad_mappings=["prov:endedAtTime"],
),
"accumulation_date_start": SlotDefinition(
new_name="has_accumulation_start_date",
slot_uri="rico:hasBeginningDate",
description="""Start date of the accumulation period for archival materials.""",
range_type="date",
exact_mappings=["rico:hasBeginningDate"],
close_mappings=["schema:startDate", "dcterms:date"],
broad_mappings=["prov:startedAtTime"],
),
"accuracy_meters": SlotDefinition(
new_name="has_accuracy_in_meters",
slot_uri="geo:hasGeometry",
description="""Accuracy of geographic coordinates in meters.""",
range_type="float",
close_mappings=["geo:hasGeometry"],
related_mappings=["schema:geo", "gn:locationMap"],
),
"acquisition_budget": SlotDefinition(
new_name="has_or_had_acquisition_budget",
slot_uri="schema:price",
description="""Budget allocated for acquisitions. Temporal as budgets change annually.""",
close_mappings=["schema:price", "schema:priceRange"],
related_mappings=["schema:funding"],
),
"acquisition_date": SlotDefinition(
new_name="has_acquisition_date",
slot_uri="schema:dateCreated",
description="""Date when an item was acquired. Permanent historical fact.""",
range_type="date",
exact_mappings=["schema:dateCreated"],
close_mappings=["dcterms:date", "prov:generatedAtTime"],
narrow_mappings=["rico:hasAccessionDate"],
),
"acquisition_history": SlotDefinition(
new_name="has_acquisition_history",
slot_uri="dcterms:provenance",
description="""History of how materials were acquired. Permanent historical record.""",
exact_mappings=["dcterms:provenance"],
close_mappings=["rico:history", "schema:description"],
related_mappings=["prov:wasGeneratedBy"],
),
"acquisition_method": SlotDefinition(
new_name="has_acquisition_method",
slot_uri="rico:hasOrHadActivityType",
description="""Method by which materials were acquired (purchase, donation, transfer, etc.).""",
exact_mappings=["rico:hasOrHadActivityType"],
close_mappings=["schema:acquiredFrom"],
related_mappings=["prov:wasGeneratedBy"],
),
"acquisition_source": SlotDefinition(
new_name="has_acquisition_source",
slot_uri="schema:acquiredFrom",
description="""Source from which materials were acquired.""",
exact_mappings=["schema:acquiredFrom"],
close_mappings=["prov:wasAttributedTo", "dcterms:source"],
related_mappings=["rico:hasOrHadAgent"],
),
"active_since": SlotDefinition(
new_name="has_active_since_date",
slot_uri="schema:foundingDate",
description="""Date from which an entity has been active.""",
range_type="date",
exact_mappings=["schema:foundingDate"],
close_mappings=["rico:hasBeginningDate", "prov:startedAtTime"],
broad_mappings=["dcterms:date"],
),
"activities_societies": SlotDefinition(
new_name="has_or_had_activity_or_society_membership",
slot_uri="org:memberOf",
description="""Professional activities and society memberships.""",
multivalued=True,
exact_mappings=["org:memberOf"],
close_mappings=["schema:memberOf", "foaf:member"],
related_mappings=["rico:isOrWasMemberOf"],
),
"activity_description": SlotDefinition(
new_name="has_activity_description",
slot_uri="schema:description",
description="""Description of an activity or event.""",
exact_mappings=["schema:description"],
close_mappings=["dcterms:description", "rico:scopeAndContent"],
),
"activity_id": SlotDefinition(
new_name="has_activity_identifier",
slot_uri="schema:identifier",
description="""Unique identifier for an activity.""",
exact_mappings=["schema:identifier"],
close_mappings=["dcterms:identifier"],
),
"activity_name": SlotDefinition(
new_name="has_activity_name",
slot_uri="schema:name",
description="""Name of an activity.""",
exact_mappings=["schema:name"],
close_mappings=["rdfs:label", "skos:prefLabel"],
),
"activity_timespan": SlotDefinition(
new_name="has_activity_timespan",
slot_uri="crm:P4_has_time-span",
description="""Time span during which an activity occurred.""",
exact_mappings=["crm:P4_has_time-span"],
close_mappings=["schema:duration", "rico:hasDateRange"],
related_mappings=["prov:startedAtTime", "prov:endedAtTime"],
),
"activity_type": SlotDefinition(
new_name="has_activity_type",
slot_uri="rico:hasOrHadActivityType",
description="""Type or category of activity.""",
exact_mappings=["rico:hasOrHadActivityType"],
close_mappings=["schema:additionalType", "dcterms:type"],
),
"actual_end": SlotDefinition(
new_name="has_actual_end_date",
slot_uri="schema:endDate",
description="""Actual end date of an activity or event (vs. planned).""",
range_type="datetime",
exact_mappings=["schema:endDate"],
close_mappings=["prov:endedAtTime", "rico:hasEndDate"],
),
"actual_return_date": SlotDefinition(
new_name="has_actual_return_date",
slot_uri="schema:endDate",
description="""Actual date of return for loaned items.""",
range_type="date",
exact_mappings=["schema:endDate"],
close_mappings=["rico:hasEndDate"],
narrow_mappings=["hc:hasReturnDate"],
),
"actual_start": SlotDefinition(
new_name="has_actual_start_date",
slot_uri="schema:startDate",
description="""Actual start date of an activity or event (vs. planned).""",
range_type="datetime",
exact_mappings=["schema:startDate"],
close_mappings=["prov:startedAtTime", "rico:hasBeginningDate"],
),
"admin_office_description": SlotDefinition(
new_name="has_admin_office_description",
slot_uri="schema:description",
description="""Description of an administrative office.""",
exact_mappings=["schema:description"],
close_mappings=["dcterms:description"],
),
"admin_office_id": SlotDefinition(
new_name="has_admin_office_identifier",
slot_uri="schema:identifier",
description="""Identifier for an administrative office.""",
exact_mappings=["schema:identifier"],
close_mappings=["dcterms:identifier"],
),
"admin_office_name": SlotDefinition(
new_name="has_admin_office_name",
slot_uri="schema:name",
description="""Name of an administrative office.""",
exact_mappings=["schema:name"],
close_mappings=["rdfs:label"],
),
"admin_staff_count": SlotDefinition(
new_name="has_or_had_admin_staff_count",
slot_uri="schema:numberOfEmployees",
description="""Number of administrative staff. Temporal as staffing changes.""",
range_type="integer",
exact_mappings=["schema:numberOfEmployees"],
close_mappings=["org:headcount"],
),
"administration_description": SlotDefinition(
new_name="has_administration_description",
slot_uri="schema:description",
description="""Description of administrative structure or functions.""",
exact_mappings=["schema:description"],
close_mappings=["dcterms:description", "rico:scopeAndContent"],
),
"administration_name": SlotDefinition(
new_name="has_administration_name",
slot_uri="schema:name",
description="""Name of an administrative unit or body.""",
exact_mappings=["schema:name"],
close_mappings=["rdfs:label", "org:name"],
),
"administrative_expenses": SlotDefinition(
new_name="has_or_had_administrative_expense",
slot_uri="schema:expense",
description="""Administrative expenses incurred. Temporal as these change over time.""",
multivalued=True,
close_mappings=["schema:price"],
related_mappings=["schema:funding"],
),
"administrative_functions": SlotDefinition(
new_name="has_or_had_administrative_function",
slot_uri="org:purpose",
description="""Administrative functions performed by an organizational unit.""",
multivalued=True,
exact_mappings=["org:purpose"],
close_mappings=["rico:hasOrHadActivityType"],
related_mappings=["schema:knowsAbout"],
),
"administrative_level": SlotDefinition(
new_name="has_administrative_level",
slot_uri="schema:isPartOf",
description="""Administrative level in a hierarchy (national, regional, local, etc.).""",
close_mappings=["schema:isPartOf", "org:subOrganizationOf"],
related_mappings=["rico:isOrWasIncludedIn"],
),
"admission_fee": SlotDefinition(
new_name="has_or_had_admission_fee",
slot_uri="schema:offers",
description="""Admission fee charged by the institution. Temporal as fees change.""",
exact_mappings=["schema:offers"],
close_mappings=["schema:price", "schema:priceRange"],
related_mappings=["gr:hasPriceSpecification"],
),
"adoption_context": SlotDefinition(
new_name="has_adoption_context",
slot_uri="dcterms:description",
description="""Context or circumstances of adoption of a standard, practice, or policy.""",
close_mappings=["dcterms:description", "prov:wasGeneratedBy"],
),
"affected_by_event": SlotDefinition(
new_name="is_or_was_affected_by_event",
slot_uri="rico:isOrWasAffectedBy",
description="""Events that have affected this entity. From RiC-O for organizational changes.""",
multivalued=True,
exact_mappings=["rico:isOrWasAffectedBy"],
close_mappings=["prov:wasInfluencedBy"],
related_mappings=["crm:P12_occurred_in_the_presence_of"],
),
"affected_territory": SlotDefinition(
new_name="has_or_had_affected_territory",
slot_uri="schema:areaServed",
description="""Geographic territory affected by an event or policy.""",
exact_mappings=["schema:areaServed"],
close_mappings=["dcterms:spatial", "gn:locatedIn"],
),
"affected_units": SlotDefinition(
new_name="has_or_had_affected_unit",
slot_uri="rico:isOrWasAffectedBy",
description="""Organizational units affected by a change or event.""",
multivalued=True,
close_mappings=["rico:isOrWasAffectedBy", "org:hasUnit"],
),
"affects_organization": SlotDefinition(
new_name="affects_or_affected_organization",
slot_uri="rico:affects",
description="""Organization(s) affected by this event or change.""",
multivalued=True,
exact_mappings=["rico:affects"],
close_mappings=["prov:influenced"],
),
"affiliated_universities": SlotDefinition(
new_name="has_or_had_affiliated_university",
slot_uri="schema:affiliation",
description="""Universities with which the institution is affiliated.""",
multivalued=True,
exact_mappings=["schema:affiliation"],
close_mappings=["org:linkedTo", "rico:isOrWasAssociatedWith"],
narrow_mappings=["schema:alumniOf"],
),
"affiliation": SlotDefinition(
new_name="has_or_had_affiliation",
slot_uri="schema:affiliation",
description="""Organizational affiliation of a person or entity.""",
multivalued=True,
exact_mappings=["schema:affiliation"],
close_mappings=["org:memberOf", "foaf:member"],
related_mappings=["pico:hasAffiliation"],
),
"age": SlotDefinition(
new_name="has_age",
slot_uri="schema:age",
description="""Age of a person or entity. For persons, typically calculated from birth date.""",
range_type="integer",
exact_mappings=["schema:age"],
related_mappings=["foaf:age"],
),
"agenda_description": SlotDefinition(
new_name="has_agenda_description",
slot_uri="schema:description",
description="""Description of an agenda or meeting schedule.""",
exact_mappings=["schema:description"],
close_mappings=["dcterms:description"],
),
"agenda_document_url": SlotDefinition(
new_name="has_agenda_document_url",
slot_uri="schema:url",
description="""URL of an agenda document.""",
range_type="uri",
exact_mappings=["schema:url"],
close_mappings=["dcterms:source"],
),
"agenda_id": SlotDefinition(
new_name="has_agenda_identifier",
slot_uri="schema:identifier",
description="""Identifier for an agenda.""",
exact_mappings=["schema:identifier"],
close_mappings=["dcterms:identifier"],
),
"agenda_short_name": SlotDefinition(
new_name="has_agenda_short_name",
slot_uri="skos:altLabel",
description="""Short name or abbreviation for an agenda.""",
exact_mappings=["skos:altLabel"],
close_mappings=["schema:alternateName"],
),
"agenda_title": SlotDefinition(
new_name="has_agenda_title",
slot_uri="dcterms:title",
description="""Title of an agenda.""",
exact_mappings=["dcterms:title"],
close_mappings=["schema:name", "rdfs:label"],
),
"agenda_url": SlotDefinition(
new_name="has_agenda_url",
slot_uri="schema:url",
description="""URL where the agenda can be accessed.""",
range_type="uri",
exact_mappings=["schema:url"],
close_mappings=["foaf:page"],
),
"agent_name": SlotDefinition(
new_name="has_agent_name",
slot_uri="foaf:name",
description="""Name of an agent (person, organization, or software).""",
exact_mappings=["foaf:name"],
close_mappings=["schema:name", "rdfs:label"],
broad_mappings=["prov:Agent"],
),
"agent_type": SlotDefinition(
new_name="has_agent_type",
slot_uri="dcterms:type",
description="""Type of agent (person, organization, software, etc.).""",
exact_mappings=["dcterms:type"],
close_mappings=["rdf:type", "schema:additionalType"],
),
"aggregated_by": SlotDefinition(
new_name="is_or_was_aggregated_by",
slot_uri="dcterms:isPartOf",
description="""Aggregator or collection that includes this resource.""",
multivalued=True,
exact_mappings=["dcterms:isPartOf"],
close_mappings=["edm:isShownAt", "schema:includedInDataCatalog"],
related_mappings=["ore:isAggregatedBy"],
),
"aggregates_from": SlotDefinition(
new_name="aggregates_or_aggregated_from",
slot_uri="dcterms:source",
description="""Sources from which this aggregator collects data.""",
multivalued=True,
exact_mappings=["dcterms:source"],
close_mappings=["prov:wasDerivedFrom"],
related_mappings=["ore:aggregates"],
),
"agreement_signed_date": SlotDefinition(
new_name="has_agreement_signed_date",
slot_uri="schema:dateCreated",
description="""Date when an agreement was signed. Permanent historical fact.""",
range_type="date",
exact_mappings=["schema:dateCreated"],
close_mappings=["dcterms:date", "prov:generatedAtTime"],
),
"air_changes_per_hour": SlotDefinition(
new_name="has_air_changes_per_hour",
slot_uri="hc:hasAirChangesPerHour",
description="""Air exchange rate for climate control in storage/exhibition spaces.""",
range_type="float",
related_mappings=["schema:amenityFeature"],
custodian_types='["M", "A", "L"]',
specificity_score=0.85,
),
"all_data_real": SlotDefinition(
new_name="has_all_data_real_flag",
slot_uri="hc:hasAllDataRealFlag",
description="""Flag indicating whether all data in the record is real (not synthetic/test).""",
range_type="boolean",
),
"all_links": SlotDefinition(
new_name="has_link",
slot_uri="schema:url",
description="""Collection of all links/URLs associated with an entity.""",
multivalued=True,
exact_mappings=["schema:url"],
close_mappings=["foaf:page", "rdfs:seeAlso"],
),
"allocated_by": SlotDefinition(
new_name="is_or_was_allocated_by",
slot_uri="prov:wasAttributedTo",
description="""Entity that performed the allocation.""",
exact_mappings=["prov:wasAttributedTo"],
close_mappings=["dcterms:creator"],
),
"allocates": SlotDefinition(
new_name="allocates_or_allocated",
slot_uri="prov:generated",
description="""Resources or identifiers allocated by this entity.""",
multivalued=True,
close_mappings=["prov:generated"],
),
"allocation_date": SlotDefinition(
new_name="has_allocation_date",
slot_uri="prov:generatedAtTime",
description="""Date when an allocation was made. Permanent historical fact.""",
range_type="date",
exact_mappings=["prov:generatedAtTime"],
close_mappings=["dcterms:date", "schema:dateCreated"],
),
"allows_laptops": SlotDefinition(
new_name="allows_or_allowed_laptop",
slot_uri="schema:amenityFeature",
description="""Whether laptops are permitted in reading rooms/study areas.""",
range_type="boolean",
close_mappings=["schema:amenityFeature"],
custodian_types='["A", "L", "R"]',
specificity_score=0.75,
),
"allows_photography": SlotDefinition(
new_name="allows_or_allowed_photography",
slot_uri="schema:amenityFeature",
description="""Whether photography is permitted. Policies can change.""",
range_type="boolean",
close_mappings=["schema:amenityFeature"],
related_mappings=["dcterms:accessRights"],
),
"alpha_2": SlotDefinition(
new_name="has_alpha_2_code",
slot_uri="lcc-lr:hasTag",
description="""ISO 3166-1 alpha-2 country code (2 letters).""",
exact_mappings=["lcc-lr:hasTag"],
close_mappings=["schema:addressCountry"],
related_mappings=["gn:countryCode"],
),
"alpha_3": SlotDefinition(
new_name="has_alpha_3_code",
slot_uri="lcc-lr:hasTag",
description="""ISO 3166-1 alpha-3 country code (3 letters).""",
exact_mappings=["lcc-lr:hasTag"],
close_mappings=["schema:addressCountry"],
),
"also_allocation_agency": SlotDefinition(
new_name="is_or_was_also_allocation_agency",
slot_uri="org:purpose",
description="""Indicates entity also serves as an allocation agency (e.g., ISIL).""",
range_type="boolean",
close_mappings=["org:purpose"],
),
"also_identifies_name": SlotDefinition(
new_name="also_identifies_name",
slot_uri="skos:altLabel",
description="""Additional names by which an entity may be identified.""",
multivalued=True,
exact_mappings=["skos:altLabel"],
close_mappings=["schema:alternateName"],
),
"alternative_names": SlotDefinition(
new_name="has_or_had_alternative_name",
slot_uri="skos:altLabel",
description="""Alternative names for an entity. Temporal as names can change.""",
multivalued=True,
exact_mappings=["skos:altLabel"],
close_mappings=["schema:alternateName", "foaf:nick"],
related_mappings=["rico:hasOrHadName"],
broad_mappings=["rdfs:label"],
),
"alternative_observed_names": SlotDefinition(
new_name="has_or_had_alternative_observed_name",
slot_uri="pico:observedName",
description="""Alternative names observed in source documents (emic preservation).""",
multivalued=True,
exact_mappings=["pico:observedName"],
close_mappings=["skos:altLabel"],
related_mappings=["rico:hasOrHadName"],
),
"altitude": SlotDefinition(
new_name="has_altitude",
slot_uri="geo:alt",
description="""Altitude/elevation above sea level. Permanent geographic fact.""",
range_type="float",
exact_mappings=["geo:alt"],
close_mappings=["schema:elevation", "wgs84:alt"],
),
"amendment_history": SlotDefinition(
new_name="has_amendment_history",
slot_uri="prov:wasRevisionOf",
description="""History of amendments to a document or policy.""",
multivalued=True,
exact_mappings=["prov:wasRevisionOf"],
close_mappings=["dcterms:replaces"],
related_mappings=["schema:version"],
),
"animal_species_count": SlotDefinition(
new_name="has_or_had_animal_species_count",
slot_uri="schema:numberOfItems",
description="""Number of animal species in a collection (zoo, natural history museum).""",
range_type="integer",
close_mappings=["schema:numberOfItems"],
custodian_types='["B", "M"]',
custodian_types_primary="B",
specificity_score=0.85,
),
"annex_description": SlotDefinition(
new_name="has_annex_description",
slot_uri="schema:description",
description="""Description of an annex or supplementary document.""",
exact_mappings=["schema:description"],
close_mappings=["dcterms:description"],
),
"annex_id": SlotDefinition(
new_name="has_annex_identifier",
slot_uri="schema:identifier",
description="""Identifier for an annex.""",
exact_mappings=["schema:identifier"],
close_mappings=["dcterms:identifier"],
),
"annex_name": SlotDefinition(
new_name="has_annex_name",
slot_uri="schema:name",
description="""Name of an annex.""",
exact_mappings=["schema:name"],
close_mappings=["rdfs:label"],
),
"annex_reason": SlotDefinition(
new_name="has_annex_reason",
slot_uri="dcterms:description",
description="""Reason for creating an annex.""",
close_mappings=["dcterms:description", "skos:note"],
),
"annotation_motivation": SlotDefinition(
new_name="has_annotation_motivation",
slot_uri="oa:motivatedBy",
description="""Motivation for creating an annotation (Web Annotation vocabulary).""",
exact_mappings=["oa:motivatedBy"],
close_mappings=["dcterms:type"],
),
"annotation_segments": SlotDefinition(
new_name="has_annotation_segment",
slot_uri="oa:hasTarget",
description="""Segments or portions targeted by an annotation.""",
multivalued=True,
exact_mappings=["oa:hasTarget"],
close_mappings=["oa:hasSelector"],
),
"annotation_type": SlotDefinition(
new_name="has_annotation_type",
slot_uri="dcterms:type",
description="""Type or category of annotation.""",
exact_mappings=["dcterms:type"],
close_mappings=["oa:motivatedBy", "schema:additionalType"],
),
"annotations_by": SlotDefinition(
new_name="has_annotation_by",
slot_uri="oa:annotatedBy",
description="""Agent that created the annotation.""",
multivalued=True,
exact_mappings=["oa:annotatedBy"],
close_mappings=["prov:wasAttributedTo", "dcterms:creator"],
),
"annual_participants": SlotDefinition(
new_name="has_or_had_annual_participant_count",
slot_uri="schema:attendeeCount",
description="""Number of annual participants or visitors. Temporal metric.""",
range_type="integer",
close_mappings=["schema:attendeeCount"],
related_mappings=["schema:numberOfEmployees"],
),
"annual_revenue": SlotDefinition(
new_name="has_or_had_annual_revenue",
slot_uri="schema:annualRevenue",
description="""Annual revenue of the organization. Changes yearly.""",
exact_mappings=["schema:annualRevenue"],
close_mappings=["schema:funding"],
),
"api_available": SlotDefinition(
new_name="has_api_available_flag",
slot_uri="schema:availableOnDevice",
description="""Whether an API is available for data access.""",
range_type="boolean",
close_mappings=["schema:availableOnDevice"],
related_mappings=["dcat:accessService"],
),
"api_documentation": SlotDefinition(
new_name="has_api_documentation_url",
slot_uri="schema:documentation",
description="""URL to API documentation.""",
range_type="uri",
exact_mappings=["schema:documentation"],
close_mappings=["dcat:landingPage"],
),
"api_endpoint": SlotDefinition(
new_name="has_api_endpoint",
slot_uri="dcat:endpointURL",
description="""URL of the API endpoint.""",
range_type="uri",
exact_mappings=["dcat:endpointURL"],
close_mappings=["schema:url", "hydra:entrypoint"],
),
"api_version": SlotDefinition(
new_name="has_api_version",
slot_uri="schema:version",
description="""Version of the API.""",
exact_mappings=["schema:version"],
close_mappings=["dcat:version", "pav:version"],
),
"appellation_language": SlotDefinition(
new_name="has_appellation_language",
slot_uri="dcterms:language",
description="""Language of a name or appellation.""",
exact_mappings=["dcterms:language"],
close_mappings=["schema:inLanguage"],
),
"appellation_type": SlotDefinition(
new_name="has_appellation_type",
slot_uri="crm:P2_has_type",
description="""Type of appellation (official, vernacular, historical, etc.).""",
exact_mappings=["crm:P2_has_type"],
close_mappings=["dcterms:type"],
),
"appellation_value": SlotDefinition(
new_name="has_appellation_value",
slot_uri="rdfs:label",
description="""The actual string value of an appellation.""",
exact_mappings=["rdfs:label"],
close_mappings=["skos:prefLabel", "schema:name"],
),
"appellations": SlotDefinition(
new_name="has_or_had_appellation",
slot_uri="crm:P1_is_identified_by",
description="""Names or appellations by which an entity is known.""",
multivalued=True,
exact_mappings=["crm:P1_is_identified_by"],
close_mappings=["rico:hasOrHadName", "schema:name"],
broad_mappings=["rdfs:label"],
),
"applicable_countries": SlotDefinition(
new_name="has_applicable_country",
slot_uri="schema:areaServed",
description="""Countries where something is applicable.""",
multivalued=True,
exact_mappings=["schema:areaServed"],
close_mappings=["dcterms:spatial", "schema:eligibleRegion"],
),
"application_deadline": SlotDefinition(
new_name="has_application_deadline",
slot_uri="schema:applicationDeadline",
description="""Deadline for applications.""",
range_type="date",
exact_mappings=["schema:applicationDeadline"],
close_mappings=["schema:endDate"],
),
"application_opening_date": SlotDefinition(
new_name="has_application_opening_date",
slot_uri="schema:startDate",
description="""Date when applications open.""",
range_type="date",
exact_mappings=["schema:startDate"],
close_mappings=["schema:validFrom"],
),
"applies_to_call": SlotDefinition(
new_name="applies_to_call",
slot_uri="schema:isRelatedTo",
description="""Call or announcement that something applies to.""",
close_mappings=["schema:isRelatedTo", "dcterms:relation"],
),
"appointment_required": SlotDefinition(
new_name="has_appointment_required_flag",
slot_uri="schema:reservationRequired",
description="""Whether an appointment is required for access.""",
range_type="boolean",
exact_mappings=["schema:reservationRequired"],
close_mappings=["schema:publicAccess"],
),
"appraisal_notes": SlotDefinition(
new_name="has_appraisal_note",
slot_uri="rico:scopeAndContent",
description="""Notes from archival appraisal process.""",
multivalued=True,
close_mappings=["rico:scopeAndContent", "skos:note"],
custodian_types='["A"]',
custodian_types_primary="A",
specificity_score=0.90,
),
"appraisal_policy": SlotDefinition(
new_name="has_or_had_appraisal_policy",
slot_uri="rico:hasOrHadRegulation",
description="""Policy governing archival appraisal. Can change over time.""",
exact_mappings=["rico:hasOrHadRegulation"],
close_mappings=["schema:publishingPrinciples"],
custodian_types='["A"]',
specificity_score=0.90,
),
"approval_date": SlotDefinition(
new_name="has_approval_date",
slot_uri="dcterms:dateAccepted",
description="""Date of approval. Permanent historical fact.""",
range_type="date",
exact_mappings=["dcterms:dateAccepted"],
close_mappings=["schema:dateCreated", "prov:generatedAtTime"],
),
"approved_by": SlotDefinition(
new_name="was_approved_by",
slot_uri="prov:wasAttributedTo",
description="""Entity that approved something.""",
exact_mappings=["prov:wasAttributedTo"],
close_mappings=["dcterms:creator", "schema:endorsedBy"],
),
"approximate": SlotDefinition(
new_name="is_approximate",
slot_uri="hc:isApproximate",
description="""Whether a value is approximate rather than exact.""",
range_type="boolean",
related_mappings=["schema:approximateValue"],
),
"archdiocese_name": SlotDefinition(
new_name="has_archdiocese_name",
slot_uri="schema:name",
description="""Name of the archdiocese (for religious heritage institutions).""",
close_mappings=["schema:name", "rdfs:label"],
custodian_types='["H"]',
custodian_types_primary="H",
specificity_score=0.90,
),
"architect": SlotDefinition(
new_name="has_or_had_architect",
slot_uri="schema:architect",
description="""Architect of a building or structure.""",
multivalued=True,
exact_mappings=["schema:architect"],
close_mappings=["dcterms:creator", "crm:P14_carried_out_by"],
),
"architectural_style": SlotDefinition(
new_name="has_architectural_style",
slot_uri="dbp:architecturalStyle",
description="""Architectural style of a building.""",
multivalued=True,
exact_mappings=["dbp:architecturalStyle"],
close_mappings=["schema:genre"],
),
"archival_reference": SlotDefinition(
new_name="has_archival_reference",
slot_uri="rico:identifier",
description="""Archival reference code or call number.""",
exact_mappings=["rico:identifier"],
close_mappings=["dcterms:identifier", "schema:identifier"],
custodian_types='["A"]',
specificity_score=0.85,
),
"archival_status": SlotDefinition(
new_name="has_or_had_archival_status",
slot_uri="rico:hasRecordState",
description="""Current archival status (open, closed, processing, etc.).""",
exact_mappings=["rico:hasRecordState"],
close_mappings=["schema:status"],
custodian_types='["A"]',
specificity_score=0.85,
),
"archive_branches": SlotDefinition(
new_name="has_or_had_archive_branch",
slot_uri="org:hasUnit",
description="""Branch locations of an archive.""",
multivalued=True,
exact_mappings=["org:hasUnit"],
close_mappings=["schema:department", "rico:hasOrHadSubordinate"],
custodian_types='["A"]',
specificity_score=0.85,
),
"archive_department_of": SlotDefinition(
new_name="is_or_was_archive_department_of",
slot_uri="org:subOrganizationOf",
description="""Parent organization of which this archive is a department.""",
exact_mappings=["org:subOrganizationOf"],
close_mappings=["rico:isOrWasSubordinateTo", "schema:parentOrganization"],
custodian_types='["A"]',
specificity_score=0.85,
),
"archive_description": SlotDefinition(
new_name="has_archive_description",
slot_uri="rico:scopeAndContent",
description="""Description of an archive or archival collection.""",
exact_mappings=["rico:scopeAndContent"],
close_mappings=["dcterms:description", "schema:description"],
custodian_types='["A"]',
specificity_score=0.80,
),
"archive_memento_uri": SlotDefinition(
new_name="has_archive_memento_uri",
slot_uri="schema:archivedAt",
description="""URI of archived/memento version (Web Archive).""",
range_type="uri",
exact_mappings=["schema:archivedAt"],
close_mappings=["prov:alternateOf"],
),
"archive_name": SlotDefinition(
new_name="has_archive_name",
slot_uri="schema:name",
description="""Name of an archive.""",
exact_mappings=["schema:name"],
close_mappings=["rdfs:label", "rico:name"],
custodian_types='["A"]',
specificity_score=0.80,
),
"archive_path": SlotDefinition(
new_name="has_archive_path",
slot_uri="schema:contentUrl",
description="""File path to archived content.""",
range_type="string",
close_mappings=["schema:contentUrl"],
),
"archive_scope": SlotDefinition(
new_name="has_or_had_archive_scope",
slot_uri="rico:scopeAndContent",
description="""Scope of an archive's collections or mandate.""",
exact_mappings=["rico:scopeAndContent"],
close_mappings=["dcterms:description"],
custodian_types='["A"]',
specificity_score=0.85,
),
"archive_search_score": SlotDefinition(
new_name="has_archive_search_score",
slot_uri="hc:hasSearchScore",
description="""Search relevance score from archive search.""",
range_type="float",
),
"archive_series": SlotDefinition(
new_name="is_or_was_part_of_archive_series",
slot_uri="rico:isOrWasIncludedIn",
description="""Archive series containing this item.""",
exact_mappings=["rico:isOrWasIncludedIn"],
close_mappings=["dcterms:isPartOf"],
custodian_types='["A"]',
specificity_score=0.85,
),
"archive_subtype": SlotDefinition(
new_name="has_archive_subtype",
slot_uri="dcterms:type",
description="""Subtype of archive (national, regional, corporate, etc.).""",
exact_mappings=["dcterms:type"],
close_mappings=["schema:additionalType"],
custodian_types='["A"]',
specificity_score=0.85,
),
"archived_at": SlotDefinition(
new_name="was_archived_at",
slot_uri="schema:archivedAt",
description="""Location where something was archived.""",
exact_mappings=["schema:archivedAt"],
close_mappings=["prov:atLocation"],
),
"archived_in": SlotDefinition(
new_name="is_or_was_archived_in",
slot_uri="rico:isOrWasIncludedIn",
description="""Archive or repository where materials are held.""",
exact_mappings=["rico:isOrWasIncludedIn"],
close_mappings=["dcterms:isPartOf", "schema:holdingArchive"],
),
"area_hectares": SlotDefinition(
new_name="has_area_in_hectares",
slot_uri="schema:size",
description="""Area in hectares.""",
range_type="float",
close_mappings=["schema:size"],
related_mappings=["geo:hasGeometry"],
),
"area_served": SlotDefinition(
new_name="has_or_had_area_served",
slot_uri="schema:areaServed",
description="""Geographic area served by the organization.""",
exact_mappings=["schema:areaServed"],
close_mappings=["dcterms:spatial", "gn:locatedIn"],
),
"arrangement": SlotDefinition(
new_name="has_arrangement",
slot_uri="rico:hasOrHadArrangement",
description="""Arrangement of archival materials.""",
exact_mappings=["rico:hasOrHadArrangement"],
close_mappings=["dcterms:description"],
custodian_types='["A"]',
specificity_score=0.90,
),
"arrangement_level": SlotDefinition(
new_name="has_arrangement_level",
slot_uri="rico:hasRecordSetType",
description="""Level of arrangement (fonds, series, file, item).""",
exact_mappings=["rico:hasRecordSetType"],
custodian_types='["A"]',
specificity_score=0.90,
),
"arrangement_notes": SlotDefinition(
new_name="has_arrangement_note",
slot_uri="skos:note",
description="""Notes about arrangement of materials.""",
multivalued=True,
exact_mappings=["skos:note"],
close_mappings=["rico:scopeAndContent"],
custodian_types='["A"]',
specificity_score=0.90,
),
"arrangement_system": SlotDefinition(
new_name="has_or_had_arrangement_system",
slot_uri="rico:hasOrHadArrangement",
description="""System used for arranging materials.""",
exact_mappings=["rico:hasOrHadArrangement"],
custodian_types='["A"]',
specificity_score=0.90,
),
"articles_archival_stage": SlotDefinition(
new_name="has_articles_archival_stage",
slot_uri="rico:hasRecordState",
description="""Archival processing stage for articles.""",
close_mappings=["rico:hasRecordState"],
),
"articles_document_format": SlotDefinition(
new_name="has_articles_document_format",
slot_uri="dcterms:format",
description="""Format of article documents.""",
exact_mappings=["dcterms:format"],
close_mappings=["schema:encodingFormat"],
),
"articles_document_url": SlotDefinition(
new_name="has_articles_document_url",
slot_uri="schema:url",
description="""URL of article document.""",
range_type="uri",
exact_mappings=["schema:url"],
close_mappings=["schema:contentUrl"],
),
"artist_representation": SlotDefinition(
new_name="has_or_had_artist_representation",
slot_uri="schema:represents",
description="""Artists represented by a gallery.""",
multivalued=True,
close_mappings=["schema:represents"],
custodian_types='["G"]',
custodian_types_primary="G",
specificity_score=0.90,
),
"artwork_count": SlotDefinition(
new_name="has_or_had_artwork_count",
slot_uri="schema:numberOfItems",
description="""Number of artworks in collection. Temporal as collections change.""",
range_type="integer",
close_mappings=["schema:numberOfItems"],
custodian_types='["G", "M"]',
specificity_score=0.80,
),
"aspect_ratio": SlotDefinition(
new_name="has_aspect_ratio",
slot_uri="schema:videoFrameSize",
description="""Aspect ratio of a video or image.""",
close_mappings=["schema:videoFrameSize"],
related_mappings=["schema:width", "schema:height"],
),
"asserted_by": SlotDefinition(
new_name="was_asserted_by",
slot_uri="prov:wasAttributedTo",
description="""Agent that made an assertion.""",
exact_mappings=["prov:wasAttributedTo"],
close_mappings=["dcterms:creator"],
),
"assertion_date": SlotDefinition(
new_name="has_assertion_date",
slot_uri="prov:generatedAtTime",
description="""Date when an assertion was made.""",
range_type="datetime",
exact_mappings=["prov:generatedAtTime"],
close_mappings=["dcterms:date"],
),
"assertion_id": SlotDefinition(
new_name="has_assertion_identifier",
slot_uri="schema:identifier",
description="""Identifier for an assertion.""",
exact_mappings=["schema:identifier"],
close_mappings=["dcterms:identifier"],
),
"assertion_rationale": SlotDefinition(
new_name="has_assertion_rationale",
slot_uri="skos:note",
description="""Rationale for an assertion.""",
exact_mappings=["skos:note"],
close_mappings=["dcterms:description"],
),
"assertion_value": SlotDefinition(
new_name="has_assertion_value",
slot_uri="rdf:value",
description="""Value of an assertion.""",
exact_mappings=["rdf:value"],
),
"assessment_category": SlotDefinition(
new_name="has_assessment_category",
slot_uri="dcterms:type",
description="""Category of assessment.""",
exact_mappings=["dcterms:type"],
close_mappings=["schema:additionalType"],
),
"assessment_date": SlotDefinition(
new_name="has_assessment_date",
slot_uri="dcterms:date",
description="""Date of assessment.""",
range_type="date",
exact_mappings=["dcterms:date"],
),
"assigned_processor": SlotDefinition(
new_name="has_or_had_assigned_processor",
slot_uri="prov:wasAttributedTo",
description="""Person or system assigned to process something.""",
close_mappings=["prov:wasAttributedTo", "dcterms:contributor"],
),
"associated_auxiliary_platform": SlotDefinition(
new_name="has_or_had_associated_auxiliary_platform",
slot_uri="schema:isRelatedTo",
description="""Associated auxiliary digital platform.""",
multivalued=True,
close_mappings=["schema:isRelatedTo", "dcterms:relation"],
),
"associated_custodian": SlotDefinition(
new_name="has_or_had_associated_custodian",
slot_uri="rico:isOrWasAssociatedWith",
description="""Associated heritage custodian institution.""",
multivalued=True,
exact_mappings=["rico:isOrWasAssociatedWith"],
close_mappings=["schema:affiliation", "org:linkedTo"],
),
"associated_digital_platform": SlotDefinition(
new_name="has_or_had_associated_digital_platform",
slot_uri="schema:isRelatedTo",
description="""Associated digital platform.""",
multivalued=True,
close_mappings=["schema:isRelatedTo", "dcat:accessService"],
),
"associated_encompassing_bodies": SlotDefinition(
new_name="has_or_had_associated_encompassing_body",
slot_uri="org:memberOf",
description="""Larger bodies or networks the institution is part of.""",
multivalued=True,
exact_mappings=["org:memberOf"],
close_mappings=["rico:isOrWasMemberOf"],
),
"associated_taxa": SlotDefinition(
new_name="has_associated_taxon",
slot_uri="dwc:associatedTaxa",
description="""Associated biological taxa (Darwin Core).""",
multivalued=True,
exact_mappings=["dwc:associatedTaxa"],
custodian_types='["B", "M"]',
specificity_score=0.90,
),
"auction_house": SlotDefinition(
new_name="has_auction_house",
slot_uri="schema:seller",
description="""Auction house that sold an item.""",
close_mappings=["schema:seller"],
related_mappings=["dcterms:provenance"],
),
"auction_sale_name": SlotDefinition(
new_name="has_auction_sale_name",
slot_uri="schema:name",
description="""Name of an auction sale.""",
exact_mappings=["schema:name"],
close_mappings=["rdfs:label"],
),
"audience_size": SlotDefinition(
new_name="has_or_had_audience_size",
slot_uri="schema:audienceSize",
description="""Size of the target or actual audience. Temporal metric.""",
range_type="integer",
exact_mappings=["schema:audienceSize"],
),
"audience_type": SlotDefinition(
new_name="has_audience_type",
slot_uri="schema:audienceType",
description="""Type of target audience.""",
multivalued=True,
exact_mappings=["schema:audienceType"],
close_mappings=["dcterms:audience"],
),
"audio_event_segments": SlotDefinition(
new_name="has_audio_event_segment",
slot_uri="schema:hasPart",
description="""Audio event segments within a recording.""",
multivalued=True,
close_mappings=["schema:hasPart"],
related_mappings=["oa:hasTarget"],
),
"audio_quality_score": SlotDefinition(
new_name="has_audio_quality_score",
slot_uri="schema:ratingValue",
description="""Quality score for audio content.""",
range_type="float",
close_mappings=["schema:ratingValue"],
),
"audit_date": SlotDefinition(
new_name="has_audit_date",
slot_uri="dcterms:date",
description="""Date of an audit.""",
range_type="date",
exact_mappings=["dcterms:date"],
),
"audit_opinion": SlotDefinition(
new_name="has_audit_opinion",
slot_uri="schema:review",
description="""Opinion from an audit.""",
close_mappings=["schema:review"],
),
"audit_status": SlotDefinition(
new_name="has_or_had_audit_status",
slot_uri="schema:status",
description="""Status of an audit. Temporal as audits progress.""",
close_mappings=["schema:status"],
),
"auditor_name": SlotDefinition(
new_name="has_auditor_name",
slot_uri="schema:name",
description="""Name of the auditor.""",
exact_mappings=["schema:name"],
close_mappings=["foaf:name"],
),
"authentication_required": SlotDefinition(
new_name="has_authentication_required_flag",
slot_uri="schema:isAccessibleForFree",
description="""Whether authentication is required for access.""",
range_type="boolean",
related_mappings=["schema:isAccessibleForFree"],
),
"authority_file_abbreviation": SlotDefinition(
new_name="has_authority_file_abbreviation",
slot_uri="skos:altLabel",
description="""Abbreviation for an authority file (e.g., VIAF, LCSH).""",
exact_mappings=["skos:altLabel"],
),
"authority_file_name": SlotDefinition(
new_name="has_authority_file_name",
slot_uri="skos:prefLabel",
description="""Name of an authority file.""",
exact_mappings=["skos:prefLabel"],
close_mappings=["schema:name"],
),
"authority_file_url": SlotDefinition(
new_name="has_authority_file_url",
slot_uri="schema:url",
description="""URL of an authority file.""",
range_type="uri",
exact_mappings=["schema:url"],
),
"authors": SlotDefinition(
new_name="has_author",
slot_uri="dcterms:creator",
description="""Authors of a work.""",
multivalued=True,
exact_mappings=["dcterms:creator"],
close_mappings=["schema:author", "schema:creator"],
related_mappings=["foaf:maker"],
),
"auto_generated": SlotDefinition(
new_name="is_auto_generated",
slot_uri="prov:wasGeneratedBy",
description="""Whether content was automatically generated.""",
range_type="boolean",
close_mappings=["prov:wasGeneratedBy"],
),
"auxiliary_place_id": SlotDefinition(
new_name="has_auxiliary_place_identifier",
slot_uri="schema:identifier",
description="""Identifier for an auxiliary place.""",
exact_mappings=["schema:identifier"],
),
"auxiliary_place_type": SlotDefinition(
new_name="has_auxiliary_place_type",
slot_uri="dcterms:type",
description="""Type of auxiliary place.""",
exact_mappings=["dcterms:type"],
),
"auxiliary_places": SlotDefinition(
new_name="has_auxiliary_place",
slot_uri="schema:containsPlace",
description="""Auxiliary places associated with an entity.""",
multivalued=True,
close_mappings=["schema:containsPlace"],
),
"auxiliary_platform_id": SlotDefinition(
new_name="has_auxiliary_platform_identifier",
slot_uri="schema:identifier",
description="""Identifier for an auxiliary digital platform.""",
exact_mappings=["schema:identifier"],
),
"auxiliary_platform_type": SlotDefinition(
new_name="has_auxiliary_platform_type",
slot_uri="dcterms:type",
description="""Type of auxiliary digital platform.""",
exact_mappings=["dcterms:type"],
),
"auxiliary_platforms": SlotDefinition(
new_name="has_auxiliary_platform",
slot_uri="schema:isRelatedTo",
description="""Auxiliary digital platforms.""",
multivalued=True,
close_mappings=["schema:isRelatedTo"],
),
"availability_timespan": SlotDefinition(
new_name="has_availability_timespan",
slot_uri="schema:availabilityStarts",
description="""Time span during which something is available.""",
close_mappings=["schema:availabilityStarts", "schema:availabilityEnds"],
),
"available_caption_languages": SlotDefinition(
new_name="has_available_caption_language",
slot_uri="schema:subtitleLanguage",
description="""Languages in which captions are available.""",
multivalued=True,
exact_mappings=["schema:subtitleLanguage"],
close_mappings=["dcterms:language"],
),
"average_entry_duration_seconds": SlotDefinition(
new_name="has_average_entry_duration_seconds",
slot_uri="schema:duration",
description="""Average duration of entries in seconds.""",
range_type="float",
close_mappings=["schema:duration"],
),
"average_scene_duration_seconds": SlotDefinition(
new_name="has_average_scene_duration_seconds",
slot_uri="schema:duration",
description="""Average duration of scenes in seconds.""",
range_type="float",
close_mappings=["schema:duration"],
),
}
def generate_prefixes(slot_def: SlotDefinition) -> Dict[str, str]:
"""Generate prefixes needed for the slot definition."""
prefixes = {
"linkml": "https://w3id.org/linkml/",
"hc": "https://nde.nl/ontology/hc/",
}
# Extract prefixes from slot_uri and mappings
all_uris = [slot_def.slot_uri] + slot_def.exact_mappings + slot_def.close_mappings + \
slot_def.related_mappings + slot_def.narrow_mappings + slot_def.broad_mappings
prefix_map = {
"schema:": ("schema", "https://schema.org/"),
"dcterms:": ("dcterms", "http://purl.org/dc/terms/"),
"skos:": ("skos", "http://www.w3.org/2004/02/skos/core#"),
"foaf:": ("foaf", "http://xmlns.com/foaf/0.1/"),
"rico:": ("rico", "https://www.ica.org/standards/RiC/ontology#"),
"org:": ("org", "http://www.w3.org/ns/org#"),
"prov:": ("prov", "http://www.w3.org/ns/prov#"),
"crm:": ("crm", "http://www.cidoc-crm.org/cidoc-crm/"),
"rdfs:": ("rdfs", "http://www.w3.org/2000/01/rdf-schema#"),
"rdf:": ("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#"),
"geo:": ("geo", "http://www.opengis.net/ont/geosparql#"),
"wgs84:": ("wgs84", "http://www.w3.org/2003/01/geo/wgs84_pos#"),
"gn:": ("gn", "http://www.geonames.org/ontology#"),
"dcat:": ("dcat", "http://www.w3.org/ns/dcat#"),
"premis:": ("premis", "http://www.loc.gov/premis/rdf/v3/"),
"edm:": ("edm", "http://www.europeana.eu/schemas/edm/"),
"ore:": ("ore", "http://www.openarchives.org/ore/terms/"),
"oa:": ("oa", "http://www.w3.org/ns/oa#"),
"pico:": ("pico", "https://personincontext.org/ontology/"),
"gr:": ("gr", "http://purl.org/goodrelations/v1#"),
"dbp:": ("dbp", "http://dbpedia.org/property/"),
"gleif-base:": ("gleif-base", "https://www.gleif.org/ontology/Base/"),
"tooi:": ("tooi", "https://identifier.overheid.nl/tooi/def/ont/"),
"pav:": ("pav", "http://purl.org/pav/"),
"hydra:": ("hydra", "http://www.w3.org/ns/hydra/core#"),
"lcc-lr:": ("lcc-lr", "https://www.omg.org/spec/LCC/Languages/LanguageRepresentation/"),
"dwc:": ("dwc", "http://rs.tdwg.org/dwc/terms/"),
}
for uri in all_uris:
for prefix_str, (prefix_name, prefix_uri) in prefix_map.items():
if uri.startswith(prefix_str):
prefixes[prefix_name] = prefix_uri
break
return prefixes
def generate_slot_yaml(old_name: str, slot_def: SlotDefinition) -> str:
"""Generate YAML content for a slot definition."""
prefixes = generate_prefixes(slot_def)
# Build YAML manually for proper formatting
lines = [
f"id: https://nde.nl/ontology/hc/slot/{slot_def.new_name}",
f"name: {slot_def.new_name}_slot",
f"title: {slot_def.new_name.replace('_', ' ').title()} Slot",
"prefixes:",
]
for prefix, uri in sorted(prefixes.items()):
lines.append(f" {prefix}: {uri}")
lines.extend([
"imports:",
"- linkml:types",
"default_prefix: hc",
"slots:",
f" {slot_def.new_name}:",
f" description: >-",
])
# Format description
desc_lines = slot_def.description.strip().split('\n')
for line in desc_lines:
lines.append(f" {line.strip()}")
lines.append(f" range: {slot_def.range_type}")
if slot_def.multivalued:
lines.append(" multivalued: true")
lines.append(f" slot_uri: {slot_def.slot_uri}")
# Add mappings if present
if slot_def.exact_mappings:
lines.append(" exact_mappings:")
for m in slot_def.exact_mappings:
lines.append(f" - {m}")
if slot_def.close_mappings:
lines.append(" close_mappings:")
for m in slot_def.close_mappings:
lines.append(f" - {m}")
if slot_def.related_mappings:
lines.append(" related_mappings:")
for m in slot_def.related_mappings:
lines.append(f" - {m}")
if slot_def.narrow_mappings:
lines.append(" narrow_mappings:")
for m in slot_def.narrow_mappings:
lines.append(f" - {m}")
if slot_def.broad_mappings:
lines.append(" broad_mappings:")
for m in slot_def.broad_mappings:
lines.append(f" - {m}")
# Add annotations
lines.append(" annotations:")
lines.append(f" custodian_types: '{slot_def.custodian_types}'")
lines.append(f" custodian_types_rationale: >-")
lines.append(f" {slot_def.custodian_types_rationale}")
lines.append(f" custodian_types_primary: {slot_def.custodian_types_primary}")
lines.append(f" specificity_score: {slot_def.specificity_score}")
lines.append(f" specificity_rationale: >-")
lines.append(f" {slot_def.specificity_rationale}")
return '\n'.join(lines) + '\n'
def update_slot_file(slots_dir: Path, old_name: str, slot_def: SlotDefinition, dry_run: bool = False) -> Tuple[bool, str]:
"""Update a single slot file."""
old_file = slots_dir / f"{old_name}.yaml"
new_file = slots_dir / f"{slot_def.new_name}.yaml"
if not old_file.exists():
return False, f"Source file not found: {old_file}"
yaml_content = generate_slot_yaml(old_name, slot_def)
if dry_run:
return True, f"Would update {old_name} -> {slot_def.new_name}"
# Write new file
with open(new_file, 'w') as f:
f.write(yaml_content)
# Remove old file if different name
if old_file != new_file:
old_file.unlink()
return True, f"Updated {old_name} -> {slot_def.new_name}"
def main():
import argparse
parser = argparse.ArgumentParser(description="Update LinkML slot files with RiC-O naming and mappings")
parser.add_argument("--dry-run", action="store_true", help="Preview changes without writing files")
parser.add_argument("--slots-dir", default="schemas/20251121/linkml/modules/slots", help="Path to slots directory")
args = parser.parse_args()
slots_dir = Path(args.slots_dir)
if not slots_dir.exists():
print(f"Slots directory not found: {slots_dir}")
return 1
print(f"Processing {len(SLOT_DEFINITIONS)} slot definitions...")
print(f"Slots directory: {slots_dir}")
print(f"Dry run: {args.dry_run}")
print()
success_count = 0
error_count = 0
for old_name, slot_def in sorted(SLOT_DEFINITIONS.items()):
success, message = update_slot_file(slots_dir, old_name, slot_def, args.dry_run)
if success:
print(f"{message}")
success_count += 1
else:
print(f"{message}")
error_count += 1
print()
print(f"Processed: {success_count + error_count}")
print(f"Success: {success_count}")
print(f"Errors: {error_count}")
return 0 if error_count == 0 else 1
if __name__ == "__main__":
exit(main())