# Heritage Custodian Hub Architecture - Complete Structure ## Bidirectional Linking Diagram ```mermaid graph TB Hub[Custodian Hub
E39_Actor
hc_id: https://nde.nl/ontology/hc/...] subgraph Appellations App1[CustodianAppellation
E41_Appellation
Name: Rijksmuseum
Type: OFFICIAL] App2[CustodianAppellation
E41_Appellation
Name: Rijks
Type: VERNACULAR] App3[CustodianAppellation
E41_Appellation
Name: The Rijksmuseum
Type: TRANSLATION] end subgraph Identifiers Id1[CustodianIdentifier
E42_Identifier
ISIL: NL-AmRMA] Id2[CustodianIdentifier
E42_Identifier
Wikidata: Q190804] Id3[CustodianIdentifier
E42_Identifier
VIAF: 148691498] end Hub -->|crm:P1_is_identified_by| App1 Hub -->|crm:P1_is_identified_by| App2 Hub -->|crm:P1_is_identified_by| App3 App1 -.->|crm:P1i_identifies| Hub App2 -.->|crm:P1i_identifies| Hub App3 -.->|crm:P1i_identifies| Hub Hub -->|crm:P48_has_preferred_identifier| Id1 Hub -->|crm:P48_has_preferred_identifier| Id2 Hub -->|crm:P48_has_preferred_identifier| Id3 Id1 -.->|crm:P48i_is_preferred_identifier_of| Hub Id2 -.->|crm:P48i_is_preferred_identifier_of| Hub Id3 -.->|crm:P48i_is_preferred_identifier_of| Hub style Hub fill:#e1f5ff,stroke:#0066cc,stroke-width:3px style App1 fill:#fff4e6,stroke:#ff9800,stroke-width:2px style App2 fill:#fff4e6,stroke:#ff9800,stroke-width:2px style App3 fill:#fff4e6,stroke:#ff9800,stroke-width:2px style Id1 fill:#e8f5e9,stroke:#4caf50,stroke-width:2px style Id2 fill:#e8f5e9,stroke:#4caf50,stroke-width:2px style Id3 fill:#e8f5e9,stroke:#4caf50,stroke-width:2px ``` ## LinkML Schema Structure ```yaml Custodian: class_uri: crm:E39_Actor abstract: true # Hub - minimal entity slots: - hc_id # Persistent identifier - appellations # crm:P1_is_identified_by (multivalued) - identifiers # crm:P48_has_preferred_identifier (multivalued) - created # Database record metadata - modified CustodianAppellation: class_uri: crm:E41_Appellation slots: - appellation_value # The actual name string - appellation_language # ISO 639-1 code - appellation_type # OFFICIAL, VERNACULAR, HISTORICAL, TRANSLATION - identifies_custodian # crm:P1i_identifies (inverse) CustodianIdentifier: class_uri: crm:E42_Identifier slots: - identifier_scheme # ISIL, Wikidata, VIAF, KvK, ROR - identifier_value # The actual identifier string - identifies_custodian # crm:P48i_is_preferred_identifier_of (inverse) ``` ## Example Instance (Rijksmuseum) ```yaml # Custodian hub - hc_id: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804 # Forward properties (Hub → Appellations/Identifiers) appellations: - appellation_value: "Rijksmuseum" appellation_language: "nl" appellation_type: OFFICIAL identifies_custodian: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804 - appellation_value: "Rijks" appellation_language: "nl" appellation_type: VERNACULAR identifies_custodian: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804 - appellation_value: "The Rijksmuseum" appellation_language: "en" appellation_type: TRANSLATION identifies_custodian: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804 identifiers: - identifier_scheme: "ISIL" identifier_value: "NL-AmRMA" identifies_custodian: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804 - identifier_scheme: "Wikidata" identifier_value: "Q190804" identifies_custodian: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804 - identifier_scheme: "VIAF" identifier_value: "148691498" identifies_custodian: https://nde.nl/ontology/hc/nl-nh-ams-m-rm-q190804 ``` ## RDF Serialization (Turtle) ```turtle @prefix crm: . @prefix hc: . @prefix rdf: . # Custodian hub hc:nl-nh-ams-m-rm-q190804 a crm:E39_Actor ; crm:P1_is_identified_by hc:appellation/rijksmuseum-official , hc:appellation/rijks-vernacular , hc:appellation/rijksmuseum-en ; crm:P48_has_preferred_identifier hc:identifier/nl-amrma , hc:identifier/q190804 , hc:identifier/viaf148691498 . # Appellations hc:appellation/rijksmuseum-official a crm:E41_Appellation ; rdf:value "Rijksmuseum" ; crm:P1i_identifies hc:nl-nh-ams-m-rm-q190804 . hc:appellation/rijks-vernacular a crm:E41_Appellation ; rdf:value "Rijks" ; crm:P1i_identifies hc:nl-nh-ams-m-rm-q190804 . hc:appellation/rijksmuseum-en a crm:E41_Appellation ; rdf:value "The Rijksmuseum" ; crm:P1i_identifies hc:nl-nh-ams-m-rm-q190804 . # Identifiers hc:identifier/nl-amrma a crm:E42_Identifier ; skos:inScheme "ISIL" ; skos:notation "NL-AmRMA" ; crm:P48i_is_preferred_identifier_of hc:nl-nh-ams-m-rm-q190804 . hc:identifier/q190804 a crm:E42_Identifier ; skos:inScheme "Wikidata" ; skos:notation "Q190804" ; crm:P48i_is_preferred_identifier_of hc:nl-nh-ams-m-rm-q190804 . hc:identifier/viaf148691498 a crm:E42_Identifier ; skos:inScheme "VIAF" ; skos:notation "148691498" ; crm:P48i_is_preferred_identifier_of hc:nl-nh-ams-m-rm-q190804 . ``` ## SPARQL Query Example ### Find all appellations for a custodian ```sparql PREFIX crm: PREFIX rdf: PREFIX hc: SELECT ?appellation ?value ?type WHERE { hc:nl-nh-ams-m-rm-q190804 crm:P1_is_identified_by ?appellation . ?appellation rdf:value ?value . OPTIONAL { ?appellation crm:P2_has_type ?type } } ``` ### Find custodian by ISIL code ```sparql PREFIX crm: PREFIX skos: SELECT ?custodian ?identifier WHERE { ?identifier a crm:E42_Identifier ; skos:inScheme "ISIL" ; skos:notation "NL-AmRMA" ; crm:P48i_is_preferred_identifier_of ?custodian . } ``` ## Design Principles ### 1. Bidirectionality Both forward and inverse properties are implemented for navigability in both directions: - **Forward**: Custodian → Appellation/Identifier (user queries "what are the names/IDs?") - **Inverse**: Appellation/Identifier → Custodian (system queries "which custodian does this name/ID identify?") ### 2. CIDOC-CRM Compliance Uses standard cultural heritage ontology properties: - **E41_Appellation**: Textual identifiers (names, labels, titles) - **E42_Identifier**: Formal reference codes (ISIL, Wikidata, VIAF) - **P1_is_identified_by / P1i_identifies**: Name-based identification - **P48_has_preferred_identifier / P48i_is_preferred_identifier_of**: Formal identifier assignment ### 3. Multivalued Relationships A custodian can have: - **Multiple appellations**: Official names, vernacular names, historical names, translations - **Multiple identifiers**: ISIL, Wikidata, VIAF, KvK, ROR, etc. ### 4. Optional Inverse The `identifies_custodian` slot is **not required** because: - Inverse can be computed from forward property - Allows flexibility in data entry - Inverse is primarily for system use (query optimization) ### 5. Type Safety Each component is strongly typed: - Appellations use `AppellationTypeEnum` (OFFICIAL, VERNACULAR, HISTORICAL, TRANSLATION) - Identifiers use structured `identifier_scheme` + `identifier_value` pairs - Language codes follow ISO 639-1 ## Benefits ✅ **Semantic Web Ready**: Full RDF/OWL serialization with CIDOC-CRM alignment ✅ **Bidirectional Navigation**: Query in both directions efficiently ✅ **Cultural Heritage Standards**: Uses CIDOC-CRM as lingua franca ✅ **Multilingual Support**: Language-tagged appellations ✅ **External Linking**: Multiple identifier schemes for cross-dataset references ✅ **Hub Pattern**: Keeps Custodian hub minimal and stable ## Files **Schema**: `/schemas/20251121/linkml/01_custodian_name_modular.yaml` **Classes**: - `/schemas/20251121/linkml/modules/classes/Custodian.yaml` - `/schemas/20251121/linkml/modules/classes/Appellation.yaml` (→ CustodianAppellation) - `/schemas/20251121/linkml/modules/classes/Identifier.yaml` (→ CustodianIdentifier) **Slots**: - `/schemas/20251121/linkml/modules/slots/appellations.yaml` (forward) - `/schemas/20251121/linkml/modules/slots/identifiers.yaml` (forward) - `/schemas/20251121/linkml/modules/slots/identifies_custodian.yaml` (inverse) **Documentation**: - `APPELLATION_IDENTIFIER_REFACTORING_20251122.md` (detailed changelog) - `QUICK_STATUS_APPELLATION_IDENTIFIER_COMPLETE.md` (quick summary) - `HUB_ARCHITECTURE_DIAGRAM.md` (this file) --- **Status**: ✅ Complete **Date**: 2025-11-22 **Next**: Regenerate RDF, update UML diagrams, create example instances