From 23b1d8ee5f02eed7881ef95031e7015de1295488 Mon Sep 17 00:00:00 2001 From: kempersc Date: Wed, 17 Dec 2025 11:58:40 +0100 Subject: [PATCH] clean up GHCID --- .gitignore | 1 + backend/rag/main.py | 130 +- ...VZWADEB.yaml => BE-VWV-OUD-A-VZWADEB.yaml} | 49 +- ...XX-XXX-M-MBP.yaml => ID-JT-PEK-M-MBP.yaml} | 51 +- ...XX-XXX-M-DAJ.yaml => ID-YO-BAN-A-DAJ.yaml} | 53 +- ...XX-XXX-M-MBV.yaml => ID-YO-YOG-M-MBV.yaml} | 48 +- ...-XXX-A-HAEU.yaml => IT-52-FIR-A-HAEU.yaml} | 49 +- ...aml => NL-DR-NIS-M-MJ-museum_janning.yaml} | 39 +- ...L-XX-XXX-M-JH.yaml => NL-FR-WOR-M-JH.yaml} | 40 +- ...XX-XXX-M-MGG.yaml => NL-GE-BAR-M-MGG.yaml} | 39 +- ...aml => NL-GE-HAR-M-M-museum_19391945.yaml} | 39 +- ...-XXX-M-MGHH.yaml => NL-GE-HEE-M-MGHH.yaml} | 40 +- ...XX-XXX-M-MBH.yaml => NL-GE-ZUT-M-MBH.yaml} | 39 +- ...-XXX-M-BTOM.yaml => NL-GR-NIE-M-BTOM.yaml} | 40 +- ...L-XX-XXX-M-FM.yaml => NL-LI-SIT-M-FM.yaml} | 40 +- ...-XXX-M-FMMV.yaml => NL-LI-VEN-M-FMMV.yaml} | 39 +- ...ml => NL-NB-BOX-M-MC-museum_canonije.yaml} | 39 +- ...L-XX-XXX-M-BM.yaml => NL-NB-BRE-M-BM.yaml} | 40 +- ...L-XX-XXX-M-MC.yaml => NL-NB-CUI-M-MC.yaml} | 39 +- ...yaml => NL-NB-EIN-M-CM-crypto_museum.yaml} | 39 +- ...-XXX-M-AZKM.yaml => NL-NB-ETL-M-AZKM.yaml} | 40 +- ...L-XX-XXX-M-EM.yaml => NL-NB-HEL-M-EM.yaml} | 40 +- ...{NL-XX-XXX-M-A.yaml => NL-NB-OOS-M-A.yaml} | 39 +- ...L-XX-XXX-L-HN.yaml => NL-NB-SHE-L-HN.yaml} | 39 +- ...-XXX-M-MBMP.yaml => NL-NB-SOR-M-MBMP.yaml} | 39 +- ... => NL-NB-WAA-M-MB-museum_buitenlust.yaml} | 39 +- data/custodian/NL-NH-ALK-M-HKM.yaml | 4027 +--------- data/custodian/NL-NH-AMS-M-AM.yaml | 3290 +------- ...L-NH-AMS-M-APM-allard_pierson_museum.yaml} | 39 +- ...um.yaml => NL-NH-AMS-M-CM-cow_museum.yaml} | 40 +- ...L-XX-XXX-M-CM.yaml => NL-NH-AMS-M-CM.yaml} | 40 +- ...-XXX-M-DDGD.yaml => NL-NH-AMS-M-DDGD.yaml} | 39 +- ...XX-XXX-M-EEM.yaml => NL-NH-AMS-M-EEM.yaml} | 40 +- ...ml => NL-NH-AMS-M-EM-erotisch_museum.yaml} | 40 +- ...XX-M-GMEBV.yaml => NL-NH-AMS-M-GMEBV.yaml} | 40 +- ...XX-XXX-M-MGR.yaml => NL-NH-DEB-M-MGR.yaml} | 39 +- ...-NH-ENK-M-FM-flessenscheepjes_museum.yaml} | 40 +- ....yaml => NL-OV-HEL-M-CM-c1000_museum.yaml} | 40 +- ...XX-XXX-M-MEH.yaml => NL-OV-HEL-M-MEH.yaml} | 39 +- ...-XXX-M-MAFS.yaml => NL-OV-SCK-M-MAFS.yaml} | 39 +- ...XX-XXX-M-MDH.yaml => NL-UT-SCH-M-MDH.yaml} | 39 +- data/custodian/NL-XX-XXX-M-AM.yaml | 64 - data/custodian/NL-XX-XXX-M-HKM.yaml | 64 - ...L-XX-XXX-M-KM.yaml => NL-ZH-BOD-M-KM.yaml} | 40 +- ...XX-E-APADD.yaml => NL-ZH-DHA-E-APADD.yaml} | 54 +- ...XX-XXX-E-IJV.yaml => NL-ZH-DHA-E-IJV.yaml} | 49 +- ...L-XX-XXX-E-RC.yaml => NL-ZH-DHA-E-RC.yaml} | 71 +- ...-codart.yaml => NL-ZH-DHA-M-C-codart.yaml} | 43 +- ...{NL-XX-XXX-M-C.yaml => NL-ZH-DHA-M-C.yaml} | 39 +- ...yaml => NL-ZH-GOU-M-KM-kresse_museum.yaml} | 40 +- ...> NL-ZH-NRW-M-AM-atlantikwall_museum.yaml} | 39 +- ...L-XX-XXX-A-MA.yaml => NL-ZH-ROT-A-MA.yaml} | 40 +- ...XX-XXX-M-DPM.yaml => NL-ZH-ROT-M-DPM.yaml} | 40 +- ...L-XX-XXX-M-MG.yaml => PS-GZ-GAZ-O-MG.yaml} | 52 +- ...m.yaml => US-MI-GRA-O-FM-ford_museum.yaml} | 52 +- .../non_heritage_removed}/NL-XX-XXX-M-DA.yaml | 0 .../non_heritage_removed}/NL-XX-XXX-M-HF.yaml | 0 .../non_heritage_removed}/NL-XX-XXX-M-MA.yaml | 0 .../schemas/20251121/linkml/manifest.json | 2 +- .../ConversationEmbeddingPanel.css | 4 + .../ConversationEmbeddingPanel.tsx | 34 +- .../database/EmbeddingProjector.tsx | 18 +- .../src/components/database/QdrantPanel.tsx | 63 +- .../components/mapping/MappingExplorer.css | 1 + .../components/mapping/MappingExplorer.tsx | 20 +- .../src/lib/linkml/custodian-data-mappings.ts | 3063 +++++++- frontend/src/pages/ConversationPage.tsx | 42 + frontend/src/pages/Visualize.css | 211 + frontend/src/pages/Visualize.tsx | 313 +- scripts/apply_verified_enrichments.py | 291 + scripts/enrich_xxx_via_web_search.py | 297 + scripts/fix_non_dutch_institutions.py | 299 + scripts/index_institutions_qdrant.py | 79 +- scripts/sync/mappings.py | 6643 +++++++++++++++++ scripts/sync/qdrant_sync.py | 10 +- 75 files changed, 13132 insertions(+), 7905 deletions(-) rename data/custodian/{NL-XX-XXX-A-VZWADEB.yaml => BE-VWV-OUD-A-VZWADEB.yaml} (58%) rename data/custodian/{NL-XX-XXX-M-MBP.yaml => ID-JT-PEK-M-MBP.yaml} (54%) rename data/custodian/{NL-XX-XXX-M-DAJ.yaml => ID-YO-BAN-A-DAJ.yaml} (55%) rename data/custodian/{NL-XX-XXX-M-MBV.yaml => ID-YO-YOG-M-MBV.yaml} (74%) rename data/custodian/{NL-XX-XXX-A-HAEU.yaml => IT-52-FIR-A-HAEU.yaml} (57%) rename data/custodian/{NL-XX-XXX-M-MJ-museum_janning.yaml => NL-DR-NIS-M-MJ-museum_janning.yaml} (61%) rename data/custodian/{NL-XX-XXX-M-JH.yaml => NL-FR-WOR-M-JH.yaml} (61%) rename data/custodian/{NL-XX-XXX-M-MGG.yaml => NL-GE-BAR-M-MGG.yaml} (60%) rename data/custodian/{NL-XX-XXX-M-M-museum_19391945.yaml => NL-GE-HAR-M-M-museum_19391945.yaml} (58%) rename data/custodian/{NL-XX-XXX-M-MGHH.yaml => NL-GE-HEE-M-MGHH.yaml} (64%) rename data/custodian/{NL-XX-XXX-M-MBH.yaml => NL-GE-ZUT-M-MBH.yaml} (63%) rename data/custodian/{NL-XX-XXX-M-BTOM.yaml => NL-GR-NIE-M-BTOM.yaml} (61%) rename data/custodian/{NL-XX-XXX-M-FM.yaml => NL-LI-SIT-M-FM.yaml} (61%) rename data/custodian/{NL-XX-XXX-M-FMMV.yaml => NL-LI-VEN-M-FMMV.yaml} (62%) rename data/custodian/{NL-XX-XXX-M-MC-museum_canonije.yaml => NL-NB-BOX-M-MC-museum_canonije.yaml} (60%) rename data/custodian/{NL-XX-XXX-M-BM.yaml => NL-NB-BRE-M-BM.yaml} (62%) rename data/custodian/{NL-XX-XXX-M-MC.yaml => NL-NB-CUI-M-MC.yaml} (60%) rename data/custodian/{NL-XX-XXX-M-CM-crypto_museum.yaml => NL-NB-EIN-M-CM-crypto_museum.yaml} (62%) rename data/custodian/{NL-XX-XXX-M-AZKM.yaml => NL-NB-ETL-M-AZKM.yaml} (62%) rename data/custodian/{NL-XX-XXX-M-EM.yaml => NL-NB-HEL-M-EM.yaml} (61%) rename data/custodian/{NL-XX-XXX-M-A.yaml => NL-NB-OOS-M-A.yaml} (60%) rename data/custodian/{NL-XX-XXX-L-HN.yaml => NL-NB-SHE-L-HN.yaml} (89%) rename data/custodian/{NL-XX-XXX-M-MBMP.yaml => NL-NB-SOR-M-MBMP.yaml} (63%) rename data/custodian/{NL-XX-XXX-M-MB-museum_buitenlust.yaml => NL-NB-WAA-M-MB-museum_buitenlust.yaml} (60%) rename data/custodian/{NL-XX-XXX-M-APM-allard_pierson_museum.yaml => NL-NH-AMS-M-APM-allard_pierson_museum.yaml} (60%) rename data/custodian/{NL-XX-XXX-M-CM-cow_museum.yaml => NL-NH-AMS-M-CM-cow_museum.yaml} (60%) rename data/custodian/{NL-XX-XXX-M-CM.yaml => NL-NH-AMS-M-CM.yaml} (60%) rename data/custodian/{NL-XX-XXX-M-DDGD.yaml => NL-NH-AMS-M-DDGD.yaml} (61%) rename data/custodian/{NL-XX-XXX-M-EEM.yaml => NL-NH-AMS-M-EEM.yaml} (60%) rename data/custodian/{NL-XX-XXX-M-EM-erotisch_museum.yaml => NL-NH-AMS-M-EM-erotisch_museum.yaml} (59%) rename data/custodian/{NL-XX-XXX-M-GMEBV.yaml => NL-NH-AMS-M-GMEBV.yaml} (60%) rename data/custodian/{NL-XX-XXX-M-MGR.yaml => NL-NH-DEB-M-MGR.yaml} (62%) rename data/custodian/{NL-XX-XXX-M-FM-flessenscheepjes_museum.yaml => NL-NH-ENK-M-FM-flessenscheepjes_museum.yaml} (59%) rename data/custodian/{NL-XX-XXX-M-CM-c1000_museum.yaml => NL-OV-HEL-M-CM-c1000_museum.yaml} (60%) rename data/custodian/{NL-XX-XXX-M-MEH.yaml => NL-OV-HEL-M-MEH.yaml} (61%) rename data/custodian/{NL-XX-XXX-M-MAFS.yaml => NL-OV-SCK-M-MAFS.yaml} (63%) rename data/custodian/{NL-XX-XXX-M-MDH.yaml => NL-UT-SCH-M-MDH.yaml} (62%) delete mode 100644 data/custodian/NL-XX-XXX-M-AM.yaml delete mode 100644 data/custodian/NL-XX-XXX-M-HKM.yaml rename data/custodian/{NL-XX-XXX-M-KM.yaml => NL-ZH-BOD-M-KM.yaml} (60%) rename data/custodian/{NL-XX-XXX-E-APADD.yaml => NL-ZH-DHA-E-APADD.yaml} (84%) rename data/custodian/{NL-XX-XXX-E-IJV.yaml => NL-ZH-DHA-E-IJV.yaml} (76%) rename data/custodian/{NL-XX-XXX-E-RC.yaml => NL-ZH-DHA-E-RC.yaml} (88%) rename data/custodian/{NL-XX-XXX-M-C-codart.yaml => NL-ZH-DHA-M-C-codart.yaml} (70%) rename data/custodian/{NL-XX-XXX-M-C.yaml => NL-ZH-DHA-M-C.yaml} (83%) rename data/custodian/{NL-XX-XXX-M-KM-kresse_museum.yaml => NL-ZH-GOU-M-KM-kresse_museum.yaml} (60%) rename data/custodian/{NL-XX-XXX-M-AM-atlantikwall_museum.yaml => NL-ZH-NRW-M-AM-atlantikwall_museum.yaml} (62%) rename data/custodian/{NL-XX-XXX-A-MA.yaml => NL-ZH-ROT-A-MA.yaml} (70%) rename data/custodian/{NL-XX-XXX-M-DPM.yaml => NL-ZH-ROT-M-DPM.yaml} (62%) rename data/custodian/{NL-XX-XXX-M-MG.yaml => PS-GZ-GAZ-O-MG.yaml} (55%) rename data/custodian/{NL-XX-XXX-M-FM-ford_museum.yaml => US-MI-GRA-O-FM-ford_museum.yaml} (54%) rename data/custodian/{ => archive/non_heritage_removed}/NL-XX-XXX-M-DA.yaml (100%) rename data/custodian/{ => archive/non_heritage_removed}/NL-XX-XXX-M-HF.yaml (100%) rename data/custodian/{ => archive/non_heritage_removed}/NL-XX-XXX-M-MA.yaml (100%) create mode 100644 scripts/apply_verified_enrichments.py create mode 100644 scripts/enrich_xxx_via_web_search.py create mode 100644 scripts/fix_non_dutch_institutions.py create mode 100644 scripts/sync/mappings.py diff --git a/.gitignore b/.gitignore index 7660b17b65..6fa676a375 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ MANIFEST docs/invoice data/custodian/web/bu data/custodian/weboj +data/custodian/person/affiliated/manual/ # Virtual environments venv/ diff --git a/backend/rag/main.py b/backend/rag/main.py index 94aa047612..5735594633 100644 --- a/backend/rag/main.py +++ b/backend/rag/main.py @@ -86,11 +86,16 @@ select_visualization: Any = None VisualizationSelector: Any = None # type: ignore[no-redef] generate_sparql: Any = None configure_dspy: Any = None +get_province_code: Any = None # Province name to ISO 3166-2 code converter try: import sys sys.path.insert(0, str(os.path.join(os.path.dirname(__file__), "..", "..", "src"))) - from glam_extractor.api.hybrid_retriever import HybridRetriever as _HybridRetriever, create_hybrid_retriever as _create_hybrid_retriever + from glam_extractor.api.hybrid_retriever import ( + HybridRetriever as _HybridRetriever, + create_hybrid_retriever as _create_hybrid_retriever, + get_province_code as _get_province_code, + ) from glam_extractor.api.qdrant_retriever import HeritageCustodianRetriever as _HeritageCustodianRetriever from glam_extractor.api.typedb_retriever import TypeDBRetriever as _TypeDBRetriever, create_typedb_retriever as _create_typedb_retriever from glam_extractor.api.visualization import select_visualization as _select_visualization, VisualizationSelector as _VisualizationSelector @@ -100,9 +105,14 @@ try: create_typedb_retriever = _create_typedb_retriever select_visualization = _select_visualization VisualizationSelector = _VisualizationSelector + get_province_code = _get_province_code RETRIEVERS_AVAILABLE = True except ImportError as e: logger.warning(f"Core retrievers not available: {e}") + # Provide a fallback get_province_code that returns None + def get_province_code(province_name: str | None) -> str | None: + """Fallback when hybrid_retriever is not available.""" + return None # DSPy is optional - don't block retrievers if it's missing try: @@ -112,6 +122,17 @@ try: except ImportError as e: logger.warning(f"DSPy SPARQL not available: {e}") +# Atomic query decomposition for geographic/type filtering +decompose_query: Any = None +DECOMPOSER_AVAILABLE = False +try: + from atomic_decomposer import decompose_query as _decompose_query + decompose_query = _decompose_query + DECOMPOSER_AVAILABLE = True + logger.info("Query decomposer loaded successfully") +except ImportError as e: + logger.info(f"Query decomposer not available: {e}") + # Cost tracker is optional - gracefully degrades if unavailable COST_TRACKER_AVAILABLE = False get_tracker = None @@ -126,6 +147,98 @@ except ImportError as e: logger.info(f"Cost tracker not available (optional): {e}") +# Province detection for geographic filtering +DUTCH_PROVINCES = { + "noord-holland", "noordholland", "north holland", "north-holland", + "zuid-holland", "zuidholland", "south holland", "south-holland", + "utrecht", "gelderland", "noord-brabant", "noordbrabant", "brabant", + "north brabant", "limburg", "overijssel", "friesland", "fryslân", + "fryslan", "groningen", "drenthe", "flevoland", "zeeland", +} + + +def infer_location_level(location: str) -> str: + """Infer whether location is city, province, or region. + + Returns: + 'province' if location is a Dutch province + 'region' if location is a sub-provincial region + 'city' otherwise + """ + location_lower = location.lower().strip() + + if location_lower in DUTCH_PROVINCES: + return "province" + + # Sub-provincial regions + regions = {"randstad", "veluwe", "achterhoek", "twente", "de betuwe", "betuwe"} + if location_lower in regions: + return "region" + + return "city" + + +def extract_geographic_filters(question: str) -> dict[str, list[str] | None]: + """Extract geographic filters from a question using query decomposition. + + Returns: + dict with keys: region_codes, cities, institution_types + """ + filters: dict[str, list[str] | None] = { + "region_codes": None, + "cities": None, + "institution_types": None, + } + + if not DECOMPOSER_AVAILABLE or not decompose_query: + return filters + + try: + decomposed = decompose_query(question) + + # Extract location and determine if it's a province or city + if decomposed.location: + location = decomposed.location + level = infer_location_level(location) + + if level == "province": + # Convert province name to ISO 3166-2 code for Qdrant filtering + # e.g., "Noord-Holland" → "NH" + province_code = get_province_code(location) + if province_code: + filters["region_codes"] = [province_code] + logger.info(f"Province filter: {location} → {province_code}") + elif level == "city": + filters["cities"] = [location] + logger.info(f"City filter: {location}") + + # Extract institution type + if decomposed.institution_type: + # Map common types to enum values + type_mapping = { + "archive": "ARCHIVE", + "archief": "ARCHIVE", + "archieven": "ARCHIVE", + "museum": "MUSEUM", + "musea": "MUSEUM", + "museums": "MUSEUM", + "library": "LIBRARY", + "bibliotheek": "LIBRARY", + "bibliotheken": "LIBRARY", + "gallery": "GALLERY", + "galerie": "GALLERY", + } + inst_type = decomposed.institution_type.lower() + mapped_type = type_mapping.get(inst_type, inst_type.upper()) + filters["institution_types"] = [mapped_type] + logger.info(f"Institution type filter: {mapped_type}") + + except Exception as e: + logger.warning(f"Failed to extract geographic filters: {e}") + + return filters + + # Configuration class Settings: """Application settings from environment variables.""" @@ -1235,12 +1348,20 @@ async def query_rag(request: QueryRequest) -> QueryResponse: intent, sources = retriever.router.get_sources(request.question, request.sources) logger.info(f"Query intent: {intent}, sources: {sources}") + # Extract geographic filters from question (province, city, institution type) + geo_filters = extract_geographic_filters(request.question) + if any(geo_filters.values()): + logger.info(f"Geographic filters extracted: {geo_filters}") + # Retrieve from all sources results = await retriever.retrieve( request.question, sources, request.k, embedding_model=request.embedding_model, + region_codes=geo_filters["region_codes"], + cities=geo_filters["cities"], + institution_types=geo_filters["institution_types"], ) # Merge results @@ -1664,10 +1785,14 @@ async def stream_query_response( # Route query intent, sources = retriever.router.get_sources(request.question, request.sources) + # Extract geographic filters from question (province, city, institution type) + geo_filters = extract_geographic_filters(request.question) + yield json.dumps({ "type": "status", "message": f"Routing query to {len(sources)} sources...", "intent": intent.value, + "geo_filters": {k: v for k, v in geo_filters.items() if v}, }) + "\n" # Retrieve from sources and stream progress @@ -1683,6 +1808,9 @@ async def stream_query_response( [source], request.k, embedding_model=request.embedding_model, + region_codes=geo_filters["region_codes"], + cities=geo_filters["cities"], + institution_types=geo_filters["institution_types"], ) results.extend(source_results) diff --git a/data/custodian/NL-XX-XXX-A-VZWADEB.yaml b/data/custodian/BE-VWV-OUD-A-VZWADEB.yaml similarity index 58% rename from data/custodian/NL-XX-XXX-A-VZWADEB.yaml rename to data/custodian/BE-VWV-OUD-A-VZWADEB.yaml index b78118fcbb..2e3118e92a 100644 --- a/data/custodian/NL-XX-XXX-A-VZWADEB.yaml +++ b/data/custodian/BE-VWV-OUD-A-VZWADEB.yaml @@ -21,28 +21,39 @@ linkedin_enrichment: original_file: data/custodian/linkedin/v-z-w-archief-en-documentatiecentrum-erfgoed-binnenvaart.yaml schema_version: 1.0.0 location: - city: '' - region: XX - country: NL + city: Oudenburg + region: West-Vlaanderen + country: BE + address: Vaartdijk zuid 11, 8460 Oudenburg (aboard Museumschip Tordino) ghcid: - ghcid_current: NL-XX-XXX-A-VZWADEB - ghcid_original: NL-XX-XXX-A-VZWADEB - ghcid_uuid: 1f4e98ec-143f-5448-90ef-a295fd4a1a6e - ghcid_uuid_sha256: f6cabc91-9be6-875f-ab66-ffc5be964330 - ghcid_numeric: 17783233412197709663 + ghcid_current: BE-VWV-OUD-A-VZWADEB + ghcid_original: BE-VWV-OUD-A-VZWADEB + ghcid_uuid: 2975de6a-8d00-51ac-8ef7-238dc217515a + ghcid_uuid_sha256: 865f764c-c704-803b-8338-b16c56fcdc45 + ghcid_numeric: 9682587795998437435 record_id: fdcd0fb5-b8cf-453d-9a7c-1d0bc87be5d0 generation_timestamp: '2025-12-16T21:06:45.654173+00:00' ghcid_history: - ghcid: NL-XX-XXX-A-VZWADEB ghcid_numeric: 17783233412197709663 valid_from: '2025-12-16T21:06:45.654173+00:00' - valid_to: null + valid_to: '2025-12-17T09:41:23.616579+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: BE-VWV-OUD-A-VZWADEB + ghcid_numeric: 9682587795998437435 + valid_from: '2025-12-17T09:41:23.616579+00:00' + valid_to: null + reason: 'Country code corrected: NL -> BE (Belgium). Location: Oudenburg, West-Vlaanderen' location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX - country_code: NL + method: EXA_WEB_SEARCH + city_code: OUD + city_name: Oudenburg + region_code: VWV + region_name: West-Vlaanderen + country_code: BE + resolution_date: '2025-12-17T09:41:23.616579+00:00' + source_url: http://binnenvaarterfgoed.be/ + notes: Belgian v.z.w. (vzw = Belgian non-profit), located aboard museum ship provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:45.654173+00:00' @@ -59,9 +70,21 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_2_VERIFIED + source_url: http://binnenvaarterfgoed.be/ + extraction_timestamp: '2025-12-17T09:41:23.616579+00:00' + claims_extracted: + - country + - region + - city + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Country code corrected on 2025-12-17: NL was incorrect, institution is in Belgium + (BE)' diff --git a/data/custodian/NL-XX-XXX-M-MBP.yaml b/data/custodian/ID-JT-PEK-M-MBP.yaml similarity index 54% rename from data/custodian/NL-XX-XXX-M-MBP.yaml rename to data/custodian/ID-JT-PEK-M-MBP.yaml index 1a2d83aeb7..b462a97592 100644 --- a/data/custodian/NL-XX-XXX-M-MBP.yaml +++ b/data/custodian/ID-JT-PEK-M-MBP.yaml @@ -18,28 +18,41 @@ linkedin_enrichment: original_file: data/custodian/linkedin/museum-of-batik-pekalongan.yaml schema_version: 1.0.0 location: - city: '' - region: XX - country: NL + city: Pekalongan + region: Jawa Tengah + country: ID + address: Jl. Jetayu No.1, Pekalongan 51152 ghcid: - ghcid_current: NL-XX-XXX-M-MBP - ghcid_original: NL-XX-XXX-M-MBP - ghcid_uuid: eb74d910-63b2-5e5e-9db8-d91073782abf - ghcid_uuid_sha256: 6e7ba504-8c91-8169-aeb8-137a6a295254 - ghcid_numeric: 7961138205264294249 + ghcid_current: ID-JT-PEK-M-MBP + ghcid_original: ID-JT-PEK-M-MBP + ghcid_uuid: c3b6fa1c-543c-509b-8200-9c3e55ea5917 + ghcid_uuid_sha256: fe292b5f-2a03-82a6-8ea7-13192da4c6f8 + ghcid_numeric: 18314217047405564582 record_id: 3e933428-e095-4b85-aeb4-ed7eaa57b11c generation_timestamp: '2025-12-16T21:06:37.585649+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-MBP ghcid_numeric: 7961138205264294249 valid_from: '2025-12-16T21:06:37.585649+00:00' - valid_to: null + valid_to: '2025-12-17T09:53:29.196550+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: ID-JT-PEK-M-MBP + ghcid_numeric: 18314217047405564582 + valid_from: '2025-12-17T09:53:29.196550+00:00' + valid_to: null + reason: 'Country code corrected: NL -> ID (Indonesia). Location: Pekalongan, Jawa + Tengah' location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX - country_code: NL + method: EXA_WEB_SEARCH + city_code: PEK + city_name: Pekalongan + region_code: JT + region_name: Jawa Tengah + country_code: ID + resolution_date: '2025-12-17T09:53:29.196550+00:00' + source_url: https://id.wikipedia.org/wiki/Museum_Batik_Pekalongan + notes: UNESCO recognized museum for batik conservation, opened 12 July 2006 by + President SBY provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:37.585649+00:00' @@ -56,9 +69,21 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_2_VERIFIED + source_url: https://id.wikipedia.org/wiki/Museum_Batik_Pekalongan + extraction_timestamp: '2025-12-17T09:53:29.196550+00:00' + claims_extracted: + - country + - region + - city + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Country code corrected on 2025-12-17: NL was incorrect, institution is in Indonesia + (ID)' diff --git a/data/custodian/NL-XX-XXX-M-DAJ.yaml b/data/custodian/ID-YO-BAN-A-DAJ.yaml similarity index 55% rename from data/custodian/NL-XX-XXX-M-DAJ.yaml rename to data/custodian/ID-YO-BAN-A-DAJ.yaml index cd75d6b28f..b65e85d604 100644 --- a/data/custodian/NL-XX-XXX-M-DAJ.yaml +++ b/data/custodian/ID-YO-BAN-A-DAJ.yaml @@ -2,7 +2,7 @@ custodian_name: emic_name: Diorama Arsip Jogja emic_name_source: linkedin institution_type: -- M +- A linkedin_enrichment: linkedin_url: https://www.linkedin.com/company/diorama-arsip-jogja linkedin_slug: diorama-arsip-jogja @@ -24,28 +24,41 @@ linkedin_enrichment: original_file: data/custodian/linkedin/diorama-arsip-jogja.yaml schema_version: 1.0.0 location: - city: Technology - region: XX - country: NL + city: Bantul + region: Daerah Istimewa Yogyakarta + country: ID + address: LT 1 Gedung DEPO ARSIP, Jl. Janti, Banguntapan, Kabupaten Bantul, Yogyakarta + 55198 ghcid: - ghcid_current: NL-XX-XXX-M-DAJ - ghcid_original: NL-XX-XXX-M-DAJ - ghcid_uuid: 70fabdbb-cfa2-579c-9ed6-715ed3a9961b - ghcid_uuid_sha256: a495caff-0e4e-8b6a-8166-888465abc0cd - ghcid_numeric: 11859608390555585386 + ghcid_current: ID-YO-BAN-A-DAJ + ghcid_original: ID-YO-BAN-A-DAJ + ghcid_uuid: 059d21ea-5974-5a1e-8525-ea372adb2f57 + ghcid_uuid_sha256: 2dcb25b6-bf85-86e0-820b-be86083fea2d + ghcid_numeric: 3299772618806470368 record_id: 7e4ea863-e058-47a7-ab46-85aa9b50ec7c generation_timestamp: '2025-12-16T21:06:39.082344+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-DAJ ghcid_numeric: 11859608390555585386 valid_from: '2025-12-16T21:06:39.082344+00:00' - valid_to: null + valid_to: '2025-12-17T09:41:23.625814+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: ID-YO-BAN-A-DAJ + ghcid_numeric: 3299772618806470368 + valid_from: '2025-12-17T09:41:23.625814+00:00' + valid_to: null + reason: 'Country code corrected: NL -> ID (Indonesia). Location: Bantul, Daerah + Istimewa Yogyakarta' location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX - country_code: NL + method: EXA_WEB_SEARCH + city_code: BAN + city_name: Bantul + region_code: YO + region_name: Daerah Istimewa Yogyakarta + country_code: ID + resolution_date: '2025-12-17T09:41:23.625814+00:00' + source_url: https://dioramaarsip.jogjaprov.go.id/home + notes: Digital archive diorama of Yogyakarta history, opened February 2022 provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:39.082344+00:00' @@ -62,9 +75,21 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_2_VERIFIED + source_url: https://dioramaarsip.jogjaprov.go.id/home + extraction_timestamp: '2025-12-17T09:41:23.625814+00:00' + claims_extracted: + - country + - region + - city + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Country code corrected on 2025-12-17: NL was incorrect, institution is in Indonesia + (ID)' diff --git a/data/custodian/NL-XX-XXX-M-MBV.yaml b/data/custodian/ID-YO-YOG-M-MBV.yaml similarity index 74% rename from data/custodian/NL-XX-XXX-M-MBV.yaml rename to data/custodian/ID-YO-YOG-M-MBV.yaml index 64bbed4a17..fe88c2a91e 100644 --- a/data/custodian/NL-XX-XXX-M-MBV.yaml +++ b/data/custodian/ID-YO-YOG-M-MBV.yaml @@ -86,23 +86,41 @@ linkedin_enrichment: original_file: data/custodian/linkedin/museum-benteng-vredeburg.yaml schema_version: 1.0.0 location: - city: null - region: null - country: NL + city: Yogyakarta + region: Daerah Istimewa Yogyakarta + country: ID + address: Jl. Margo Mulyo No.6, Ngupasan, Kec. Gondomanan, Kota Yogyakarta 55122 ghcid: - ghcid_current: NL-XX-XXX-M-MBV - ghcid_original: NL-XX-XXX-M-MBV - ghcid_uuid: f52e92b3-a191-56c0-95ca-c93ebfd1fa81 - ghcid_uuid_sha256: 669bd4a6-699d-87ae-9590-77f5dd087af7 - ghcid_numeric: 7393737024460408750 + ghcid_current: ID-YO-YOG-M-MBV + ghcid_original: ID-YO-YOG-M-MBV + ghcid_uuid: 5d5e4910-7cd2-5ef8-a51c-c7dc54a055f0 + ghcid_uuid_sha256: aedc6dac-9c94-8841-abd8-6a7416a4b795 + ghcid_numeric: 12600066445604583489 record_id: 1eed48b4-a9a7-436e-a4ac-edfef3de4aee generation_timestamp: '2025-12-16T21:06:42.973186+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-MBV ghcid_numeric: 7393737024460408750 valid_from: '2025-12-17T08:44:26.023035+00:00' - valid_to: null + valid_to: '2025-12-17T09:53:29.174813+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: ID-YO-YOG-M-MBV + ghcid_numeric: 12600066445604583489 + valid_from: '2025-12-17T09:53:29.174813+00:00' + valid_to: null + reason: 'Country code corrected: NL -> ID (Indonesia). Location: Yogyakarta, Daerah + Istimewa Yogyakarta' + location_resolution: + method: EXA_WEB_SEARCH + city_code: YOG + city_name: Yogyakarta + region_code: YO + region_name: Daerah Istimewa Yogyakarta + country_code: ID + resolution_date: '2025-12-17T09:53:29.174813+00:00' + source_url: https://forevervacation.com/yogyakarta/museum-benteng-vredeburg + notes: Dutch colonial fortress converted to museum in 1992, documents Indonesian + independence struggle provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:42.973186+00:00' @@ -119,6 +137,16 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_2_VERIFIED + source_url: https://forevervacation.com/yogyakarta/museum-benteng-vredeburg + extraction_timestamp: '2025-12-17T09:53:29.174813+00:00' + claims_extracted: + - country + - region + - city + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -127,3 +155,5 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Country code corrected on 2025-12-17: NL was incorrect, institution is in Indonesia + (ID)' diff --git a/data/custodian/NL-XX-XXX-A-HAEU.yaml b/data/custodian/IT-52-FIR-A-HAEU.yaml similarity index 57% rename from data/custodian/NL-XX-XXX-A-HAEU.yaml rename to data/custodian/IT-52-FIR-A-HAEU.yaml index a29beee0f0..817e085d86 100644 --- a/data/custodian/NL-XX-XXX-A-HAEU.yaml +++ b/data/custodian/IT-52-FIR-A-HAEU.yaml @@ -18,28 +18,39 @@ linkedin_enrichment: original_file: data/custodian/linkedin/historical-archives-of-the-european-union.yaml schema_version: 1.0.0 location: - city: Director - region: XX - country: NL + city: Firenze + region: Tuscany + country: IT + address: Via Bolognese 156, 50139 Firenze, Villa Salviati ghcid: - ghcid_current: NL-XX-XXX-A-HAEU - ghcid_original: NL-XX-XXX-A-HAEU - ghcid_uuid: 8c50158d-ca20-52fa-a586-123d856d30ce - ghcid_uuid_sha256: a5122731-05a4-8550-91dc-709ae9537003 - ghcid_numeric: 11894612657340421456 + ghcid_current: IT-52-FIR-A-HAEU + ghcid_original: IT-52-FIR-A-HAEU + ghcid_uuid: f61c2f7c-d9e1-5ffe-b5d8-a79fddadc795 + ghcid_uuid_sha256: b546a4f3-4270-80ca-a53a-00d1bf0d4469 + ghcid_numeric: 13062309133933396170 record_id: 63749121-4b05-471e-b075-ec53cbbf0917 generation_timestamp: '2025-12-16T21:06:45.012969+00:00' ghcid_history: - ghcid: NL-XX-XXX-A-HAEU ghcid_numeric: 11894612657340421456 valid_from: '2025-12-16T21:06:45.012969+00:00' - valid_to: null + valid_to: '2025-12-17T09:41:23.611933+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: IT-52-FIR-A-HAEU + ghcid_numeric: 13062309133933396170 + valid_from: '2025-12-17T09:41:23.611933+00:00' + valid_to: null + reason: 'Country code corrected: NL -> IT (Italy). Location: Firenze, Tuscany' location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX - country_code: NL + method: EXA_WEB_SEARCH + city_code: FIR + city_name: Firenze + region_code: '52' + region_name: Tuscany + country_code: IT + resolution_date: '2025-12-17T09:41:23.611933+00:00' + source_url: https://archives.eui.eu/en/repositories/1 + notes: Part of European University Institute, Florence provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:45.012969+00:00' @@ -56,9 +67,21 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_2_VERIFIED + source_url: https://archives.eui.eu/en/repositories/1 + extraction_timestamp: '2025-12-17T09:41:23.611933+00:00' + claims_extracted: + - country + - region + - city + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Country code corrected on 2025-12-17: NL was incorrect, institution is in Italy + (IT)' diff --git a/data/custodian/NL-XX-XXX-M-MJ-museum_janning.yaml b/data/custodian/NL-DR-NIS-M-MJ-museum_janning.yaml similarity index 61% rename from data/custodian/NL-XX-XXX-M-MJ-museum_janning.yaml rename to data/custodian/NL-DR-NIS-M-MJ-museum_janning.yaml index f2e1824919..29fc470659 100644 --- a/data/custodian/NL-XX-XXX-M-MJ-museum_janning.yaml +++ b/data/custodian/NL-DR-NIS-M-MJ-museum_janning.yaml @@ -21,23 +21,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/museum-janning.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Nieuw Schoonebeek + region: Drenthe country: NL + address: Europaweg 143a, 7766 AE Nieuw Schoonebeek ghcid: - ghcid_current: NL-XX-XXX-M-MJ-museum_janning + ghcid_current: NL-DR-NIS-M-MJ-museum_janning ghcid_original: NL-XX-XXX-M-MJ-museum_janning - ghcid_uuid: 2da042ef-f83f-5b4c-9cf6-e95338656e75 - ghcid_uuid_sha256: 2841359b-879c-88e5-8c7f-27f6e806a1d5 - ghcid_numeric: 2900658577114687717 + ghcid_uuid: b14501ab-9840-5df7-b1d5-599a1606b08d + ghcid_uuid_sha256: b8ef7355-6ab8-860e-b9b7-8a9de4f58c9d + ghcid_numeric: 13325996633112462862 record_id: ba018a83-8c5e-422b-a8a0-8685147c0268 generation_timestamp: '2025-12-16T21:06:42.719826+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-MJ-museum_janning ghcid_numeric: 2900658577114687717 valid_from: '2025-12-17T08:44:26.037456+00:00' - valid_to: null + valid_to: '2025-12-17T10:56:09.433656+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-DR-NIS-M-MJ-museum_janning + ghcid_numeric: 13325996633112462862 + valid_from: '2025-12-17T10:56:09.433656+00:00' + valid_to: null + reason: Location enriched via Exa web search - Nieuw Schoonebeek, Drenthe + location_resolution: + method: EXA_WEB_SEARCH + city_code: NIS + city_name: Nieuw Schoonebeek + region_code: DR + region_name: Drenthe + country_code: NL + resolution_date: '2025-12-17T10:56:09.433656+00:00' + source_url: https://www.museumjanning.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:42.719826+00:00' @@ -54,6 +69,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.museumjanning.nl/ + extraction_timestamp: '2025-12-17T10:56:09.433656+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -62,3 +86,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Nieuw Schoonebeek, Drenthe' diff --git a/data/custodian/NL-XX-XXX-M-JH.yaml b/data/custodian/NL-FR-WOR-M-JH.yaml similarity index 61% rename from data/custodian/NL-XX-XXX-M-JH.yaml rename to data/custodian/NL-FR-WOR-M-JH.yaml index 64178b55ad..137a3f40d7 100644 --- a/data/custodian/NL-XX-XXX-M-JH.yaml +++ b/data/custodian/NL-FR-WOR-M-JH.yaml @@ -18,28 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/jopie-huismanmuseum.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Workum + region: Friesland country: NL + address: Noard 6, 8711 AH Workum ghcid: - ghcid_current: NL-XX-XXX-M-JH + ghcid_current: NL-FR-WOR-M-JH ghcid_original: NL-XX-XXX-M-JH - ghcid_uuid: d356866c-b69b-5f7c-9b0d-5be544a5a315 - ghcid_uuid_sha256: 383eb391-9231-8e3c-b45b-2c9a8ff180df - ghcid_numeric: 4052874152484372028 + ghcid_uuid: 3a0b508c-4200-5076-91aa-0c5296f68636 + ghcid_uuid_sha256: 0ded076f-d63e-84a1-af3a-86c064d7338e + ghcid_numeric: 1003466468890657953 record_id: 70d3a7ac-504a-4bca-b45f-7feb1f7fce95 generation_timestamp: '2025-12-16T21:06:39.406621+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-JH ghcid_numeric: 4052874152484372028 valid_from: '2025-12-16T21:06:39.406621+00:00' - valid_to: null + valid_to: '2025-12-17T09:25:04.169919+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-FR-WOR-M-JH + ghcid_numeric: 1003466468890657953 + valid_from: '2025-12-17T09:25:04.169919+00:00' + valid_to: null + reason: Location enriched via Exa web search - Workum, Friesland location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: WOR + city_name: Workum + region_code: FR + region_name: Friesland country_code: NL + resolution_date: '2025-12-17T09:25:04.169919+00:00' + source_url: https://www.jopiehuismanmuseum.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:39.406621+00:00' @@ -56,9 +66,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.jopiehuismanmuseum.nl/ + extraction_timestamp: '2025-12-17T09:25:04.169919+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Workum, Friesland' diff --git a/data/custodian/NL-XX-XXX-M-MGG.yaml b/data/custodian/NL-GE-BAR-M-MGG.yaml similarity index 60% rename from data/custodian/NL-XX-XXX-M-MGG.yaml rename to data/custodian/NL-GE-BAR-M-MGG.yaml index a6964fa666..e219e514b4 100644 --- a/data/custodian/NL-XX-XXX-M-MGG.yaml +++ b/data/custodian/NL-GE-BAR-M-MGG.yaml @@ -18,23 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/museum-de-grote-glind.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Barneveld + region: Gelderland country: NL + address: Scherpenzeelseweg 158, 3772 MG Barneveld ghcid: - ghcid_current: NL-XX-XXX-M-MGG + ghcid_current: NL-GE-BAR-M-MGG ghcid_original: NL-XX-XXX-M-MGG - ghcid_uuid: 10736a2b-5d91-5b7a-b4b9-a4f66e26d978 - ghcid_uuid_sha256: 3037e34d-a06d-8ce6-a605-466e1ce15bb0 - ghcid_numeric: 3474495560083172582 + ghcid_uuid: 1c2dc7dc-bc91-5fb7-bb54-1b2c846b2363 + ghcid_uuid_sha256: c22fdb77-ceac-81a6-8d77-c89492e65c7b + ghcid_numeric: 13992643874878439846 record_id: b014bedb-05da-4f35-9192-e07ab708ed0e generation_timestamp: '2025-12-16T21:06:43.269943+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-MGG ghcid_numeric: 3474495560083172582 valid_from: '2025-12-17T08:44:26.015666+00:00' - valid_to: null + valid_to: '2025-12-17T10:56:09.456702+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-GE-BAR-M-MGG + ghcid_numeric: 13992643874878439846 + valid_from: '2025-12-17T10:56:09.456702+00:00' + valid_to: null + reason: Location enriched via Exa web search - Barneveld, Gelderland + location_resolution: + method: EXA_WEB_SEARCH + city_code: BAR + city_name: Barneveld + region_code: GE + region_name: Gelderland + country_code: NL + resolution_date: '2025-12-17T10:56:09.456702+00:00' + source_url: https://www.degroteglind.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:43.269943+00:00' @@ -51,6 +66,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.degroteglind.nl/ + extraction_timestamp: '2025-12-17T10:56:09.456702+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -59,3 +83,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Barneveld, Gelderland' diff --git a/data/custodian/NL-XX-XXX-M-M-museum_19391945.yaml b/data/custodian/NL-GE-HAR-M-M-museum_19391945.yaml similarity index 58% rename from data/custodian/NL-XX-XXX-M-M-museum_19391945.yaml rename to data/custodian/NL-GE-HAR-M-M-museum_19391945.yaml index 382d72afb8..12996c3907 100644 --- a/data/custodian/NL-XX-XXX-M-M-museum_19391945.yaml +++ b/data/custodian/NL-GE-HAR-M-M-museum_19391945.yaml @@ -18,23 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/museum-1939-1945.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Harreveld + region: Gelderland country: NL + address: Schurinkweg 14, 7135 KJ Harreveld ghcid: - ghcid_current: NL-XX-XXX-M-M-museum_19391945 + ghcid_current: NL-GE-HAR-M-M-museum_19391945 ghcid_original: NL-XX-XXX-M-M-museum_19391945 - ghcid_uuid: e853e192-4695-59e4-87ee-4174351509b7 - ghcid_uuid_sha256: 3b9218d3-0891-8043-bab3-18ddb7bb105f - ghcid_numeric: 4292520689498423363 + ghcid_uuid: f7319b45-8862-5063-932b-0ad042cd196f + ghcid_uuid_sha256: 98c8af8e-ffc8-85e5-a162-937baa38ee40 + ghcid_numeric: 11009242317818750437 record_id: f533f9a7-b9e4-40d9-9406-1003736c61ba generation_timestamp: '2025-12-16T21:06:44.440421+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-M-museum_19391945 ghcid_numeric: 4292520689498423363 valid_from: '2025-12-17T08:44:26.038723+00:00' - valid_to: null + valid_to: '2025-12-17T10:15:28.609076+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-GE-HAR-M-M-museum_19391945 + ghcid_numeric: 11009242317818750437 + valid_from: '2025-12-17T10:15:28.609076+00:00' + valid_to: null + reason: Location enriched via Exa web search - Harreveld, Gelderland + location_resolution: + method: EXA_WEB_SEARCH + city_code: HAR + city_name: Harreveld + region_code: GE + region_name: Gelderland + country_code: NL + resolution_date: '2025-12-17T10:15:28.609076+00:00' + source_url: https://www.tracesofwar.nl/sights/157857/Museum-Opdat-wij-niet-Vergeten-1939-1945.htm provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:44.440421+00:00' @@ -51,6 +66,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.tracesofwar.nl/sights/157857/Museum-Opdat-wij-niet-Vergeten-1939-1945.htm + extraction_timestamp: '2025-12-17T10:15:28.609076+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -59,3 +83,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Harreveld, Gelderland' diff --git a/data/custodian/NL-XX-XXX-M-MGHH.yaml b/data/custodian/NL-GE-HEE-M-MGHH.yaml similarity index 64% rename from data/custodian/NL-XX-XXX-M-MGHH.yaml rename to data/custodian/NL-GE-HEE-M-MGHH.yaml index 346fd23ab9..0f57a0c06c 100644 --- a/data/custodian/NL-XX-XXX-M-MGHH.yaml +++ b/data/custodian/NL-GE-HEE-M-MGHH.yaml @@ -22,28 +22,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/museum-geelvinck-hinlopen-huis.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Heerde + region: Gelderland country: NL + address: Kamperweg 23, 8181 CS Heerde ghcid: - ghcid_current: NL-XX-XXX-M-MGHH + ghcid_current: NL-GE-HEE-M-MGHH ghcid_original: NL-XX-XXX-M-MGHH - ghcid_uuid: 2f84f10f-a9d9-518a-867b-76fd5744c9c8 - ghcid_uuid_sha256: dbc820ca-9861-8e25-9543-d30ccde30e84 - ghcid_numeric: 15836944144160349733 + ghcid_uuid: 26d6aef0-f3cd-5237-ac57-d1cdfa9b3ee1 + ghcid_uuid_sha256: 76b6959c-be1e-84cb-b010-a9e54b718f30 + ghcid_numeric: 8554189042673935563 record_id: 3d9547a0-45c3-4759-8b11-f8193c5abccb generation_timestamp: '2025-12-16T21:06:38.518452+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-MGHH ghcid_numeric: 15836944144160349733 valid_from: '2025-12-16T21:06:38.518452+00:00' - valid_to: null + valid_to: '2025-12-17T10:56:09.444275+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-GE-HEE-M-MGHH + ghcid_numeric: 8554189042673935563 + valid_from: '2025-12-17T10:56:09.444275+00:00' + valid_to: null + reason: Location enriched via Exa web search - Heerde, Gelderland location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: HEE + city_name: Heerde + region_code: GE + region_name: Gelderland country_code: NL + resolution_date: '2025-12-17T10:56:09.444275+00:00' + source_url: https://geelvinck.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:38.518452+00:00' @@ -60,9 +70,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://geelvinck.nl/ + extraction_timestamp: '2025-12-17T10:56:09.444275+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Heerde, Gelderland' diff --git a/data/custodian/NL-XX-XXX-M-MBH.yaml b/data/custodian/NL-GE-ZUT-M-MBH.yaml similarity index 63% rename from data/custodian/NL-XX-XXX-M-MBH.yaml rename to data/custodian/NL-GE-ZUT-M-MBH.yaml index 12a407e1d4..52bfef0c02 100644 --- a/data/custodian/NL-XX-XXX-M-MBH.yaml +++ b/data/custodian/NL-GE-ZUT-M-MBH.yaml @@ -21,23 +21,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/museum-de-brandkas-van-henny.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Zutphen + region: Gelderland country: NL + address: Ravenstraatje 3, 7201 DG Zutphen ghcid: - ghcid_current: NL-XX-XXX-M-MBH + ghcid_current: NL-GE-ZUT-M-MBH ghcid_original: NL-XX-XXX-M-MBH - ghcid_uuid: cfc24f04-4169-55af-891f-ed4942860a5b - ghcid_uuid_sha256: f10091e2-000c-8152-bb4a-9c6e2dc1c4bb - ghcid_numeric: 17366040562990059858 + ghcid_uuid: 8f3789a5-dac1-584a-a369-881ca1fcb35a + ghcid_uuid_sha256: f0f4973c-c174-823c-8ec4-f5bba7997043 + ghcid_numeric: 17362668750619554364 record_id: 7cfce701-5c47-477c-9973-7f9e578d177b generation_timestamp: '2025-12-16T21:06:40.699134+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-MBH ghcid_numeric: 17366040562990059858 valid_from: '2025-12-17T08:44:26.075139+00:00' - valid_to: null + valid_to: '2025-12-17T10:15:28.621915+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-GE-ZUT-M-MBH + ghcid_numeric: 17362668750619554364 + valid_from: '2025-12-17T10:15:28.621915+00:00' + valid_to: null + reason: Location enriched via Exa web search - Zutphen, Gelderland + location_resolution: + method: EXA_WEB_SEARCH + city_code: ZUT + city_name: Zutphen + region_code: GE + region_name: Gelderland + country_code: NL + resolution_date: '2025-12-17T10:15:28.621915+00:00' + source_url: https://brandkashenny.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:40.699134+00:00' @@ -54,6 +69,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://brandkashenny.nl/ + extraction_timestamp: '2025-12-17T10:15:28.621915+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -62,3 +86,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Zutphen, Gelderland' diff --git a/data/custodian/NL-XX-XXX-M-BTOM.yaml b/data/custodian/NL-GR-NIE-M-BTOM.yaml similarity index 61% rename from data/custodian/NL-XX-XXX-M-BTOM.yaml rename to data/custodian/NL-GR-NIE-M-BTOM.yaml index 7012721e23..e7cb80056c 100644 --- a/data/custodian/NL-XX-XXX-M-BTOM.yaml +++ b/data/custodian/NL-GR-NIE-M-BTOM.yaml @@ -18,28 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/blik-trommel-en-oudheden-museum.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Niezijl + region: Groningen country: NL + address: Hoofdstraat 39, 9842 PC Niezijl ghcid: - ghcid_current: NL-XX-XXX-M-BTOM + ghcid_current: NL-GR-NIE-M-BTOM ghcid_original: NL-XX-XXX-M-BTOM - ghcid_uuid: 0e8e0112-b0fd-53c4-ad06-e5956c833244 - ghcid_uuid_sha256: 5b616934-3786-8a12-b647-addf66bdd3bc - ghcid_numeric: 6584659803183176210 + ghcid_uuid: 451234ac-ac1a-59ff-8906-8921a26babaa + ghcid_uuid_sha256: 8afdfde5-a833-8383-a403-9fbe787faf89 + ghcid_numeric: 10015440309153149827 record_id: 8480c9b3-ebdf-47fe-8515-fb69b4a82c51 generation_timestamp: '2025-12-16T21:06:45.483497+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-BTOM ghcid_numeric: 6584659803183176210 valid_from: '2025-12-16T21:06:45.483497+00:00' - valid_to: null + valid_to: '2025-12-17T09:33:15.814554+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-GR-NIE-M-BTOM + ghcid_numeric: 10015440309153149827 + valid_from: '2025-12-17T09:33:15.814554+00:00' + valid_to: null + reason: Location enriched via Exa web search - Niezijl, Groningen location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: NIE + city_name: Niezijl + region_code: GR + region_name: Groningen country_code: NL + resolution_date: '2025-12-17T09:33:15.814554+00:00' + source_url: https://www.blikentrommelmuseum.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:45.483497+00:00' @@ -56,9 +66,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.blikentrommelmuseum.nl/ + extraction_timestamp: '2025-12-17T09:33:15.814554+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Niezijl, Groningen' diff --git a/data/custodian/NL-XX-XXX-M-FM.yaml b/data/custodian/NL-LI-SIT-M-FM.yaml similarity index 61% rename from data/custodian/NL-XX-XXX-M-FM.yaml rename to data/custodian/NL-LI-SIT-M-FM.yaml index 8cb2fe1203..e1f0db293d 100644 --- a/data/custodian/NL-XX-XXX-M-FM.yaml +++ b/data/custodian/NL-LI-SIT-M-FM.yaml @@ -18,28 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/fortuna-museum.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Sittard + region: Limburg country: NL + address: Sittard, Limburg, Netherlands ghcid: - ghcid_current: NL-XX-XXX-M-FM + ghcid_current: NL-LI-SIT-M-FM ghcid_original: NL-XX-XXX-M-FM - ghcid_uuid: be219abf-cc81-5a14-aee9-dc9b1b72efcb - ghcid_uuid_sha256: ad64fc4c-380d-8a38-8268-9c0bc7b7af6f - ghcid_numeric: 12494388670520703544 + ghcid_uuid: 87c8fa4f-7f89-567f-9bcb-fdaa02cefa47 + ghcid_uuid_sha256: 05de3d19-96ff-8790-9b8c-8069d9f4891f + ghcid_numeric: 422842595136202640 record_id: 208c7f58-eaf3-47d8-8d44-f4d714e17ddd generation_timestamp: '2025-12-16T21:06:36.149767+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-FM ghcid_numeric: 12494388670520703544 valid_from: '2025-12-16T21:06:36.149767+00:00' - valid_to: null + valid_to: '2025-12-17T09:25:04.202624+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-LI-SIT-M-FM + ghcid_numeric: 422842595136202640 + valid_from: '2025-12-17T09:25:04.202624+00:00' + valid_to: null + reason: Location enriched via Exa web search - Sittard, Limburg location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: SIT + city_name: Sittard + region_code: LI + region_name: Limburg country_code: NL + resolution_date: '2025-12-17T09:25:04.202624+00:00' + source_url: https://www.fortunasittard.nl/museum/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:36.149767+00:00' @@ -56,9 +66,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.fortunasittard.nl/museum/ + extraction_timestamp: '2025-12-17T09:25:04.202624+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Sittard, Limburg' diff --git a/data/custodian/NL-XX-XXX-M-FMMV.yaml b/data/custodian/NL-LI-VEN-M-FMMV.yaml similarity index 62% rename from data/custodian/NL-XX-XXX-M-FMMV.yaml rename to data/custodian/NL-LI-VEN-M-FMMV.yaml index e4e8816636..be9a62109c 100644 --- a/data/custodian/NL-XX-XXX-M-FMMV.yaml +++ b/data/custodian/NL-LI-VEN-M-FMMV.yaml @@ -18,23 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/frans-maas-museum-verzameling.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Venlo + region: Limburg country: NL + address: Groethofstraat 11L, 5916 PA Venlo ghcid: - ghcid_current: NL-XX-XXX-M-FMMV + ghcid_current: NL-LI-VEN-M-FMMV ghcid_original: NL-XX-XXX-M-FMMV - ghcid_uuid: f9f5904b-3f0e-589a-87d8-45c59c789c4f - ghcid_uuid_sha256: da43503b-8690-884b-8e60-946b38ab8434 - ghcid_numeric: 15727502540298811467 + ghcid_uuid: cdd8c1c8-7fd3-5f8b-babd-54c369e694ca + ghcid_uuid_sha256: dcb56ef8-9c2b-87f4-b515-6ce79a06fdf3 + ghcid_numeric: 15903739673179830260 record_id: 0fe8c62f-329d-4dcd-b2d3-87f1ae6c591e generation_timestamp: '2025-12-16T21:06:38.565300+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-FMMV ghcid_numeric: 15727502540298811467 valid_from: '2025-12-17T08:44:26.042454+00:00' - valid_to: null + valid_to: '2025-12-17T10:18:03.391406+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-LI-VEN-M-FMMV + ghcid_numeric: 15903739673179830260 + valid_from: '2025-12-17T10:18:03.391406+00:00' + valid_to: null + reason: Location enriched via Exa web search - Venlo, Limburg + location_resolution: + method: EXA_WEB_SEARCH + city_code: VEN + city_name: Venlo + region_code: LI + region_name: Limburg + country_code: NL + resolution_date: '2025-12-17T10:18:03.391406+00:00' + source_url: https://www.fransmaasvenlo.nl/contact/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:38.565300+00:00' @@ -51,6 +66,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.fransmaasvenlo.nl/contact/ + extraction_timestamp: '2025-12-17T10:18:03.391406+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -59,3 +83,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Venlo, Limburg' diff --git a/data/custodian/NL-XX-XXX-M-MC-museum_canonije.yaml b/data/custodian/NL-NB-BOX-M-MC-museum_canonije.yaml similarity index 60% rename from data/custodian/NL-XX-XXX-M-MC-museum_canonije.yaml rename to data/custodian/NL-NB-BOX-M-MC-museum_canonije.yaml index d8f85ba940..9dce6065de 100644 --- a/data/custodian/NL-XX-XXX-M-MC-museum_canonije.yaml +++ b/data/custodian/NL-NB-BOX-M-MC-museum_canonije.yaml @@ -21,23 +21,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/museum-canonije.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Boxtel + region: Noord-Brabant country: NL + address: Duinendaal 9, 5281 AP Boxtel ghcid: - ghcid_current: NL-XX-XXX-M-MC-museum_canonije + ghcid_current: NL-NB-BOX-M-MC-museum_canonije ghcid_original: NL-XX-XXX-M-MC-museum_canonije - ghcid_uuid: 15100a44-415a-5ed9-afce-263513d42a1c - ghcid_uuid_sha256: 66912ce3-a33b-8452-ac7f-3980eb9a6eaf - ghcid_numeric: 7390737819699496018 + ghcid_uuid: 3d464ce4-bba5-5dbd-8e3b-525c78016137 + ghcid_uuid_sha256: 0a248f2b-2a81-8242-ad8c-f9badd60b151 + ghcid_numeric: 730866455100334658 record_id: 90dc824a-f2bd-4406-9a5d-bfa30962be9b generation_timestamp: '2025-12-16T21:06:45.443420+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-MC-museum_canonije ghcid_numeric: 7390737819699496018 valid_from: '2025-12-17T08:44:26.070346+00:00' - valid_to: null + valid_to: '2025-12-17T10:41:01.921443+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-NB-BOX-M-MC-museum_canonije + ghcid_numeric: 730866455100334658 + valid_from: '2025-12-17T10:41:01.921443+00:00' + valid_to: null + reason: Location enriched via Exa web search - Boxtel, Noord-Brabant + location_resolution: + method: EXA_WEB_SEARCH + city_code: BOX + city_name: Boxtel + region_code: NB + region_name: Noord-Brabant + country_code: NL + resolution_date: '2025-12-17T10:41:01.921443+00:00' + source_url: https://www.museumgidsnederland.nl/en/boxtel/museum-de-canonije/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:45.443420+00:00' @@ -54,6 +69,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.museumgidsnederland.nl/en/boxtel/museum-de-canonije/ + extraction_timestamp: '2025-12-17T10:41:01.921443+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -62,3 +86,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Boxtel, Noord-Brabant' diff --git a/data/custodian/NL-XX-XXX-M-BM.yaml b/data/custodian/NL-NB-BRE-M-BM.yaml similarity index 62% rename from data/custodian/NL-XX-XXX-M-BM.yaml rename to data/custodian/NL-NB-BRE-M-BM.yaml index 5fa0469d71..0f17c925d2 100644 --- a/data/custodian/NL-XX-XXX-M-BM.yaml +++ b/data/custodian/NL-NB-BRE-M-BM.yaml @@ -22,28 +22,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/bierreclame-museum.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Breda + region: Noord-Brabant country: NL + address: Haagweg 375, 4813 XC Breda ghcid: - ghcid_current: NL-XX-XXX-M-BM + ghcid_current: NL-NB-BRE-M-BM ghcid_original: NL-XX-XXX-M-BM - ghcid_uuid: 84ed37a1-9cef-55df-9e60-e2e684672c12 - ghcid_uuid_sha256: c1231a5d-45dd-8add-a7d4-d95d70d66ab9 - ghcid_numeric: 13916996261411379933 + ghcid_uuid: a2dbc8ee-b755-55ee-84b1-0f99466ca820 + ghcid_uuid_sha256: 8800c7b5-4e0d-8a90-8ee5-6e2e0ca99ede + ghcid_numeric: 9800052370670697104 record_id: a36adeaa-47da-4568-bf3d-798f7bdb1af0 generation_timestamp: '2025-12-16T21:06:43.291899+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-BM ghcid_numeric: 13916996261411379933 valid_from: '2025-12-16T21:06:43.291899+00:00' - valid_to: null + valid_to: '2025-12-17T09:25:04.082081+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-NB-BRE-M-BM + ghcid_numeric: 9800052370670697104 + valid_from: '2025-12-17T09:25:04.082081+00:00' + valid_to: null + reason: Location enriched via Exa web search - Breda, Noord-Brabant location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: BRE + city_name: Breda + region_code: NB + region_name: Noord-Brabant country_code: NL + resolution_date: '2025-12-17T09:25:04.082081+00:00' + source_url: https://bierreclamemuseum.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:43.291899+00:00' @@ -60,9 +70,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://bierreclamemuseum.nl/ + extraction_timestamp: '2025-12-17T09:25:04.082081+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Breda, Noord-Brabant' diff --git a/data/custodian/NL-XX-XXX-M-MC.yaml b/data/custodian/NL-NB-CUI-M-MC.yaml similarity index 60% rename from data/custodian/NL-XX-XXX-M-MC.yaml rename to data/custodian/NL-NB-CUI-M-MC.yaml index 753cff8c4a..f9e575bf0e 100644 --- a/data/custodian/NL-XX-XXX-M-MC.yaml +++ b/data/custodian/NL-NB-CUI-M-MC.yaml @@ -18,23 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/museum-ceuclum.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Cuijk + region: Noord-Brabant country: NL + address: Castellum 1, 5431 EM Cuijk ghcid: - ghcid_current: NL-XX-XXX-M-MC + ghcid_current: NL-NB-CUI-M-MC ghcid_original: NL-XX-XXX-M-MC - ghcid_uuid: 5e2dd6dd-62ce-5e89-8ce7-31ad00950bc2 - ghcid_uuid_sha256: 12ec5579-cc21-8718-8082-0a26ec3b1e28 - ghcid_numeric: 1363558768790574872 + ghcid_uuid: 97f8ab3c-cfe2-53fb-ba27-dd2b3d058a83 + ghcid_uuid_sha256: 695826fd-daa1-82e0-9dbf-919364b88536 + ghcid_numeric: 7590860043669570272 record_id: 8f7d0da9-11c4-4162-9cf3-3b848e24d9b2 generation_timestamp: '2025-12-16T21:06:38.217498+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-MC ghcid_numeric: 1363558768790574872 valid_from: '2025-12-17T08:44:26.063071+00:00' - valid_to: null + valid_to: '2025-12-17T10:56:09.487585+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-NB-CUI-M-MC + ghcid_numeric: 7590860043669570272 + valid_from: '2025-12-17T10:56:09.487585+00:00' + valid_to: null + reason: Location enriched via Exa web search - Cuijk, Noord-Brabant + location_resolution: + method: EXA_WEB_SEARCH + city_code: CUI + city_name: Cuijk + region_code: NB + region_name: Noord-Brabant + country_code: NL + resolution_date: '2025-12-17T10:56:09.487585+00:00' + source_url: https://www.museumceuclum.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:38.217498+00:00' @@ -51,6 +66,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.museumceuclum.nl/ + extraction_timestamp: '2025-12-17T10:56:09.487585+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -59,3 +83,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Cuijk, Noord-Brabant' diff --git a/data/custodian/NL-XX-XXX-M-CM-crypto_museum.yaml b/data/custodian/NL-NB-EIN-M-CM-crypto_museum.yaml similarity index 62% rename from data/custodian/NL-XX-XXX-M-CM-crypto_museum.yaml rename to data/custodian/NL-NB-EIN-M-CM-crypto_museum.yaml index f27dfbc70a..4f6544de81 100644 --- a/data/custodian/NL-XX-XXX-M-CM-crypto_museum.yaml +++ b/data/custodian/NL-NB-EIN-M-CM-crypto_museum.yaml @@ -22,23 +22,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/crypto-museum.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Eindhoven + region: Noord-Brabant country: NL + address: Crypto Museum, Eindhoven, Netherlands ghcid: - ghcid_current: NL-XX-XXX-M-CM-crypto_museum + ghcid_current: NL-NB-EIN-M-CM-crypto_museum ghcid_original: NL-XX-XXX-M-CM-crypto_museum - ghcid_uuid: e2d3a427-14ff-5a42-9504-f9e67b5cb6fb - ghcid_uuid_sha256: be8c4743-a6b9-86ac-bcab-ae0016ba508b - ghcid_numeric: 13730427719831340716 + ghcid_uuid: e3b135ce-d513-5cf6-9e94-ecfba6686a53 + ghcid_uuid_sha256: c7a798b7-74cc-85cc-b39a-69aa49b9fdb1 + ghcid_numeric: 14386635448364312012 record_id: f760bfbd-3158-41b8-b25d-07e8218aff7c generation_timestamp: '2025-12-16T21:06:45.197167+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-CM-crypto_museum ghcid_numeric: 13730427719831340716 valid_from: '2025-12-17T08:44:25.987908+00:00' - valid_to: null + valid_to: '2025-12-17T09:17:11.063469+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-NB-EIN-M-CM-crypto_museum + ghcid_numeric: 14386635448364312012 + valid_from: '2025-12-17T09:17:11.063469+00:00' + valid_to: null + reason: Location enriched via Exa web search - Eindhoven, Noord-Brabant + location_resolution: + method: EXA_WEB_SEARCH + city_code: EIN + city_name: Eindhoven + region_code: NB + region_name: Noord-Brabant + country_code: NL + resolution_date: '2025-12-17T09:17:11.063469+00:00' + source_url: https://www.cryptomuseum.com/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:45.197167+00:00' @@ -55,6 +70,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.cryptomuseum.com/ + extraction_timestamp: '2025-12-17T09:17:11.063469+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -63,3 +87,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Eindhoven, Noord-Brabant' diff --git a/data/custodian/NL-XX-XXX-M-AZKM.yaml b/data/custodian/NL-NB-ETL-M-AZKM.yaml similarity index 62% rename from data/custodian/NL-XX-XXX-M-AZKM.yaml rename to data/custodian/NL-NB-ETL-M-AZKM.yaml index 70cd8500ab..d09baa5217 100644 --- a/data/custodian/NL-XX-XXX-M-AZKM.yaml +++ b/data/custodian/NL-NB-ETL-M-AZKM.yaml @@ -18,28 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/ambachtelijke-zagerij-en-klompenmakerij-museum.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Etten-Leur + region: Noord-Brabant country: NL + address: Schuitvaartjaagpad 179, 4873 NS Etten-Leur ghcid: - ghcid_current: NL-XX-XXX-M-AZKM + ghcid_current: NL-NB-ETL-M-AZKM ghcid_original: NL-XX-XXX-M-AZKM - ghcid_uuid: 79baa8e8-7730-5cb3-9781-8a42082b4427 - ghcid_uuid_sha256: 230c046b-3ca2-865d-bb53-98d69bb656cd - ghcid_numeric: 2525398349673322077 + ghcid_uuid: 57483d0d-fba0-502f-89fd-9e2149db05e4 + ghcid_uuid_sha256: 6922be22-4716-888a-82fb-d5098b9c0f1b + ghcid_numeric: 7575826577621440650 record_id: 47d673a1-1143-42aa-a27c-56387035a200 generation_timestamp: '2025-12-16T21:06:45.151954+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-AZKM ghcid_numeric: 2525398349673322077 valid_from: '2025-12-16T21:06:45.151954+00:00' - valid_to: null + valid_to: '2025-12-17T09:33:15.831394+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-NB-ETL-M-AZKM + ghcid_numeric: 7575826577621440650 + valid_from: '2025-12-17T09:33:15.831394+00:00' + valid_to: null + reason: Location enriched via Exa web search - Etten-Leur, Noord-Brabant location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: ETL + city_name: Etten-Leur + region_code: NB + region_name: Noord-Brabant country_code: NL + resolution_date: '2025-12-17T09:33:15.831394+00:00' + source_url: https://www.klompenmakerij.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:45.151954+00:00' @@ -56,9 +66,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.klompenmakerij.nl/ + extraction_timestamp: '2025-12-17T09:33:15.831394+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Etten-Leur, Noord-Brabant' diff --git a/data/custodian/NL-XX-XXX-M-EM.yaml b/data/custodian/NL-NB-HEL-M-EM.yaml similarity index 61% rename from data/custodian/NL-XX-XXX-M-EM.yaml rename to data/custodian/NL-NB-HEL-M-EM.yaml index fb89622cdf..4f3f32cd84 100644 --- a/data/custodian/NL-XX-XXX-M-EM.yaml +++ b/data/custodian/NL-NB-HEL-M-EM.yaml @@ -21,28 +21,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/edah-museum.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Helmond + region: Noord-Brabant country: NL + address: Helmond, Noord-Brabant, Netherlands ghcid: - ghcid_current: NL-XX-XXX-M-EM + ghcid_current: NL-NB-HEL-M-EM ghcid_original: NL-XX-XXX-M-EM - ghcid_uuid: abfeb5ac-0e66-5995-8d86-8a3cee6fbe6d - ghcid_uuid_sha256: 6fcf6f37-53e2-8880-ab6f-44b77364aa56 - ghcid_numeric: 8056780541810337920 + ghcid_uuid: 9568b2dc-355a-54bb-8e42-cc7ee9003173 + ghcid_uuid_sha256: ae82fbff-3874-8406-9567-a9aae50c658c + ghcid_numeric: 12574890183154267142 record_id: d19ceb8a-e1ca-4669-8c0d-8584d562c8f5 generation_timestamp: '2025-12-16T21:06:37.295988+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-EM ghcid_numeric: 8056780541810337920 valid_from: '2025-12-16T21:06:37.295988+00:00' - valid_to: null + valid_to: '2025-12-17T09:25:04.116169+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-NB-HEL-M-EM + ghcid_numeric: 12574890183154267142 + valid_from: '2025-12-17T09:25:04.116169+00:00' + valid_to: null + reason: Location enriched via Exa web search - Helmond, Noord-Brabant location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: HEL + city_name: Helmond + region_code: NB + region_name: Noord-Brabant country_code: NL + resolution_date: '2025-12-17T09:25:04.116169+00:00' + source_url: https://www.edahmuseum.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:37.295988+00:00' @@ -59,9 +69,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.edahmuseum.nl/ + extraction_timestamp: '2025-12-17T09:25:04.116169+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Helmond, Noord-Brabant' diff --git a/data/custodian/NL-XX-XXX-M-A.yaml b/data/custodian/NL-NB-OOS-M-A.yaml similarity index 60% rename from data/custodian/NL-XX-XXX-M-A.yaml rename to data/custodian/NL-NB-OOS-M-A.yaml index 7b059a676b..3afe5406c1 100644 --- a/data/custodian/NL-XX-XXX-M-A.yaml +++ b/data/custodian/NL-NB-OOS-M-A.yaml @@ -18,23 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/stichting-abrahamdag.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Oosterhout + region: Noord-Brabant country: NL + address: Van Wijngaardestraat 46, 4901VM Oosterhout ghcid: - ghcid_current: NL-XX-XXX-M-A + ghcid_current: NL-NB-OOS-M-A ghcid_original: NL-XX-XXX-M-A - ghcid_uuid: 3dbf1031-5d5d-5640-b949-96e68e4df376 - ghcid_uuid_sha256: b4cf931e-ab67-8939-b358-c1b70b1ed7f8 - ghcid_numeric: 13028794006940141881 + ghcid_uuid: 1b16490b-f37d-5b67-b035-37c14ae23c53 + ghcid_uuid_sha256: 3c7e1c0c-6706-822a-bdac-1946550f8bcf + ghcid_numeric: 4358952328934863402 record_id: 13121906-9f48-4cd3-81e5-32e43aae4a5a generation_timestamp: '2025-12-16T21:06:45.023838+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-A ghcid_numeric: 13028794006940141881 valid_from: '2025-12-17T08:44:26.069013+00:00' - valid_to: null + valid_to: '2025-12-17T10:08:05.575717+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-NB-OOS-M-A + ghcid_numeric: 4358952328934863402 + valid_from: '2025-12-17T10:08:05.575717+00:00' + valid_to: null + reason: Location enriched via Exa web search - Oosterhout, Noord-Brabant + location_resolution: + method: EXA_WEB_SEARCH + city_code: OOS + city_name: Oosterhout + region_code: NB + region_name: Noord-Brabant + country_code: NL + resolution_date: '2025-12-17T10:08:05.575717+00:00' + source_url: https://abrahamdag.com/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:45.023838+00:00' @@ -51,6 +66,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://abrahamdag.com/ + extraction_timestamp: '2025-12-17T10:08:05.575717+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -59,3 +83,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Oosterhout, Noord-Brabant' diff --git a/data/custodian/NL-XX-XXX-L-HN.yaml b/data/custodian/NL-NB-SHE-L-HN.yaml similarity index 89% rename from data/custodian/NL-XX-XXX-L-HN.yaml rename to data/custodian/NL-NB-SHE-L-HN.yaml index bacc1b6627..3a9d0544d5 100644 --- a/data/custodian/NL-XX-XXX-L-HN.yaml +++ b/data/custodian/NL-NB-SHE-L-HN.yaml @@ -226,23 +226,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/huis73-nl.yaml schema_version: 1.0.0 location: - city: null - region: null + city: '''s-Hertogenbosch' + region: Noord-Brabant country: NL + address: Hekellaan 2, 5211 LX 's-Hertogenbosch ghcid: - ghcid_current: NL-XX-XXX-L-HN + ghcid_current: NL-NB-SHE-L-HN ghcid_original: NL-XX-XXX-L-HN - ghcid_uuid: 3e812b40-08d1-5d01-b3f4-d3eb2b053f41 - ghcid_uuid_sha256: 193b35bb-74cd-807d-81e9-68924d148c39 - ghcid_numeric: 1818105953808932989 + ghcid_uuid: 0f399e85-7c29-5e69-b963-c635aaa79cf6 + ghcid_uuid_sha256: 5b7d526a-8eec-8b1b-8a68-416064436348 + ghcid_numeric: 6592516047158119195 record_id: 348d146d-cf2e-4a95-be5a-2d5aa300ebaa generation_timestamp: '2025-12-16T21:06:38.288769+00:00' ghcid_history: - ghcid: NL-XX-XXX-L-HN ghcid_numeric: 1818105953808932989 valid_from: '2025-12-17T08:44:26.044915+00:00' - valid_to: null + valid_to: '2025-12-17T10:06:03.418243+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-NB-SHE-L-HN + ghcid_numeric: 6592516047158119195 + valid_from: '2025-12-17T10:06:03.418243+00:00' + valid_to: null + reason: Location enriched via Exa web search - 's-Hertogenbosch, Noord-Brabant + location_resolution: + method: EXA_WEB_SEARCH + city_code: SHE + city_name: '''s-Hertogenbosch' + region_code: NB + region_name: Noord-Brabant + country_code: NL + resolution_date: '2025-12-17T10:06:03.418243+00:00' + source_url: https://www.huis73.nl/locaties provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:38.288769+00:00' @@ -259,6 +274,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.huis73.nl/locaties + extraction_timestamp: '2025-12-17T10:06:03.418243+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -267,3 +291,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: ''s-Hertogenbosch, Noord-Brabant' diff --git a/data/custodian/NL-XX-XXX-M-MBMP.yaml b/data/custodian/NL-NB-SOR-M-MBMP.yaml similarity index 63% rename from data/custodian/NL-XX-XXX-M-MBMP.yaml rename to data/custodian/NL-NB-SOR-M-MBMP.yaml index 1190d9d1d0..4aa58a1eb0 100644 --- a/data/custodian/NL-XX-XXX-M-MBMP.yaml +++ b/data/custodian/NL-NB-SOR-M-MBMP.yaml @@ -22,23 +22,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/museum-van-brabantse-mutsen-en-poffers.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Sint-Oedenrode + region: Noord-Brabant country: NL + address: Kerkstraat 20, 5492 AH Sint-Oedenrode ghcid: - ghcid_current: NL-XX-XXX-M-MBMP + ghcid_current: NL-NB-SOR-M-MBMP ghcid_original: NL-XX-XXX-M-MBMP - ghcid_uuid: 21336fc7-3662-5602-9119-7d73c036534e - ghcid_uuid_sha256: 593b5119-0fd3-86ae-90c6-c45eb4887beb - ghcid_numeric: 6429822061083035310 + ghcid_uuid: 31deef24-1de5-533c-a94b-41cb77270114 + ghcid_uuid_sha256: 797305b2-f764-8c7b-a93b-56cc8f1a6ab1 + ghcid_numeric: 8751344767123889275 record_id: a2dc4dee-6368-4d74-a185-413ed2e74f2f generation_timestamp: '2025-12-16T21:06:45.177876+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-MBMP ghcid_numeric: 6429822061083035310 valid_from: '2025-12-17T08:44:25.982154+00:00' - valid_to: null + valid_to: '2025-12-17T10:56:09.506688+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-NB-SOR-M-MBMP + ghcid_numeric: 8751344767123889275 + valid_from: '2025-12-17T10:56:09.506688+00:00' + valid_to: null + reason: Location enriched via Exa web search - Sint-Oedenrode, Noord-Brabant + location_resolution: + method: EXA_WEB_SEARCH + city_code: SOR + city_name: Sint-Oedenrode + region_code: NB + region_name: Noord-Brabant + country_code: NL + resolution_date: '2025-12-17T10:56:09.506688+00:00' + source_url: https://mutsenmuseum.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:45.177876+00:00' @@ -55,6 +70,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://mutsenmuseum.nl/ + extraction_timestamp: '2025-12-17T10:56:09.506688+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -63,3 +87,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Sint-Oedenrode, Noord-Brabant' diff --git a/data/custodian/NL-XX-XXX-M-MB-museum_buitenlust.yaml b/data/custodian/NL-NB-WAA-M-MB-museum_buitenlust.yaml similarity index 60% rename from data/custodian/NL-XX-XXX-M-MB-museum_buitenlust.yaml rename to data/custodian/NL-NB-WAA-M-MB-museum_buitenlust.yaml index b615396360..5ae6f81962 100644 --- a/data/custodian/NL-XX-XXX-M-MB-museum_buitenlust.yaml +++ b/data/custodian/NL-NB-WAA-M-MB-museum_buitenlust.yaml @@ -18,23 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/museum-buitenlust.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Waalwijk + region: Noord-Brabant country: NL + address: Jan de Rooystraat 14, 5141 EN Waalwijk ghcid: - ghcid_current: NL-XX-XXX-M-MB-museum_buitenlust + ghcid_current: NL-NB-WAA-M-MB-museum_buitenlust ghcid_original: NL-XX-XXX-M-MB-museum_buitenlust - ghcid_uuid: 78e29a5b-ff12-532e-b6a9-26b96527d012 - ghcid_uuid_sha256: 5d687b60-5e1c-83ce-9fd3-be1ab3eda87c - ghcid_numeric: 6730765296931226574 + ghcid_uuid: df4d5ef7-4ec4-57be-b445-576a334c5cfb + ghcid_uuid_sha256: e3bb7ab7-eaa4-8dd1-aadc-a05bb8f7a822 + ghcid_numeric: 16409844597588803025 record_id: ed0fd5bd-9d38-4b94-bcbc-9b927711b645 generation_timestamp: '2025-12-16T21:06:42.414009+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-MB-museum_buitenlust ghcid_numeric: 6730765296931226574 valid_from: '2025-12-17T08:44:26.056155+00:00' - valid_to: null + valid_to: '2025-12-17T10:41:01.904174+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-NB-WAA-M-MB-museum_buitenlust + ghcid_numeric: 16409844597588803025 + valid_from: '2025-12-17T10:41:01.904174+00:00' + valid_to: null + reason: Location enriched via Exa web search - Waalwijk, Noord-Brabant + location_resolution: + method: EXA_WEB_SEARCH + city_code: WAA + city_name: Waalwijk + region_code: NB + region_name: Noord-Brabant + country_code: NL + resolution_date: '2025-12-17T10:41:01.904174+00:00' + source_url: https://www.museumbuitenlust.nl/contact provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:42.414009+00:00' @@ -51,6 +66,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.museumbuitenlust.nl/contact + extraction_timestamp: '2025-12-17T10:41:01.904174+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -59,3 +83,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Waalwijk, Noord-Brabant' diff --git a/data/custodian/NL-NH-ALK-M-HKM.yaml b/data/custodian/NL-NH-ALK-M-HKM.yaml index d62e52d1dc..721bab28b2 100644 --- a/data/custodian/NL-NH-ALK-M-HKM.yaml +++ b/data/custodian/NL-NH-ALK-M-HKM.yaml @@ -1,3969 +1,84 @@ -original_entry: - organisatie: Het Hollands Kaasmuseum - museum_register: ja - wikidata_id: Q2725746 - type: - - M -entry_index: 668 -processing_timestamp: '2025-11-27T16:34:25.310415+00:00' -wikidata_enrichment: - wikidata_entity_id: Q2725746 - api_metadata: - api_endpoint: https://www.wikidata.org/w/rest.php/wikibase/v1 - fetch_timestamp: '2025-12-09T12:13:44.937349+00:00' - user_agent: GLAMDataExtractor/1.1 (glam-data@example.com) Python/httpx - enrichment_version: 2.0_full - properties_found: - - P17 - - P625 - - P18 - - P31 - - P276 - - P921 - - P2013 - - P131 - - P856 - - P281 - - P1329 - - P973 - - P2671 - - P166 - - P159 - - P11693 - - P373 - - P112 - wikidata_labels: - nl: Hollands Kaasmuseum - en: Hollands Kaasmuseum - wikidata_label_en: Hollands Kaasmuseum - wikidata_label_nl: Hollands Kaasmuseum - wikidata_descriptions: - nl: museum in Noord-Holland - he: מוזיאון בהולנד - en: museum about cheese in the Netherlands - id: museum di Belanda - ar: متحف في هولندا - de: Museum in den Niederlanden - pt: Museu em Alkmaar, Países Baixos - wikidata_description_en: museum about cheese in the Netherlands - wikidata_aliases: - nl: - - Het Hollands Kaasmuseum - - Stichting Hollands Zuivelarchief - en: - - Het Hollands Kaasmuseum - wikidata_sitelinks: - nlwiki: Hollands Kaasmuseum - commonswiki: Category:Hollands Kaasmuseum - wikidata_classification: - instance_of: &id001 - - id: Q33506 - label: museum - description: institution that holds artifacts and other objects of scientific, - artistic, cultural, historical, or other importance - main_subject: - - id: Q17315183 - label: Dutch cheese - description: kaas uit Nederland - wikidata_instance_of: *id001 - wikidata_location: - country: &id003 - id: Q55 - label: Netherlands - description: country in Northwestern Europe with territories in the Caribbean - coordinates: &id005 - latitude: 52.631388888888885 - longitude: 4.750277777777778 - precision: 0.0002777777777777778 - location: &id002 - id: Q16977290 - label: Alkmaar - description: city in Noord-Holland, the Netherlands - located_in_admin_entity: &id004 - id: Q972 - label: Alkmaar - description: municipality in the province of North Holland, the Netherlands - postal_code: 1811JP - headquarters_location: *id002 - wikidata_country: *id003 - wikidata_located_in: *id004 - wikidata_coordinates: *id005 - wikidata_organization: - founded_by: - - id: Q2310590 - label: Melkunie - description: Nederlands zuivelmerk en voormalig zuivelbedrijf - wikidata_web: - official_website: http://www.kaasmuseum.nl/ - described_at_url: https://www.museumkaart.nl/museum/Het+Hollands+Kaasmuseum.aspx - wikidata_official_website: http://www.kaasmuseum.nl/ - wikidata_social_media: - facebook_id: Kaasmuseum - wikidata_media: - image: Alkmaar Waag2.jpg - commons_category: Hollands Kaasmuseum - wikidata_image: Alkmaar Waag2.jpg - wikidata_contact: - phone_number: +31-72-515-5516 - wikidata_recognition: - award_received: - - id: Q110989587 - label: registered museum - description: Dutch certification mark -enrichment_status: success -provenance: - schema_version: 1.0.0 - generated_at: '2025-11-28T23:27:13.474559+00:00' - sources: - original_entry: - - source_type: nde_csv_registry - data_tier: TIER_1_AUTHORITATIVE - claims_extracted: - - organisatie - - museum_register - - wikidata_id - - type - wikidata: - - source_type: wikidata_api - fetch_timestamp: '2025-11-27T16:34:25.139964+00:00' - api_endpoint: https://www.wikidata.org/w/rest.php/wikibase/v1 - entity_id: Q2725746 - claims_extracted: - - labels - - descriptions - - instance_of - - country - - located_in - - coordinates - - official_website - - claim_P276_location - - claim_P921_main_subject - - claim_P2013_facebook_username - - claim_P2851_payment_types_accepted - - claim_postal_code - - claim_phone - - claim_described_at_url - - claim_P2671_google_knowledge_graph_id - - claim_P5021_assessment - - claim_P166_award_received - - claim_headquarters - - claim_street_address - - claim_P669_located_on_street - - claim_P11693_openstreetmap_node_id - - claim_commons_category - - claim_P112_founded_by - google_maps: - - source_type: google_maps_api - fetch_timestamp: '2025-11-28T09:55:24.630880+00:00' - api_endpoint: https://maps.googleapis.com/maps/api/place/textsearch - place_id: ChIJJe3JsbVXz0cRTYSXeXDihT0 - claims_extracted: - - coordinates - - formatted_address - - address_components - - business_status - - website - - phone - - rating - - reviews - - opening_hours - genealogiewerkbalk: - - source_type: genealogiewerkbalk_registry - fetch_timestamp: '2025-12-03T13:50:46.475747+00:00' - data_url: https://docs.google.com/spreadsheets/d/1rS_Z5L6L2vvfGLS6eHI8wfyiwB-KUfHEr7W1VNY3rpg/export?format=csv - match_method: google_maps_admin2 - claims_extracted: - - municipality_name - - municipality_code - - municipal_archive_name - - municipal_archive_website - - municipal_archive_isil - - province_name - - province_code - - provincial_archive_name - - provincial_archive_website - linkup_timespan: - - source_type: linkup_web_search - fetch_timestamp: '2025-12-15T19:22:57.732292+00:00' - search_query: '"Hollands Kaasmuseum" Alkmaar opgericht OR gesticht OR sinds' - source_urls: - - https://www.erfgoedalkmaar.nl/monumentenkaart/waag-hollands-kaasmuseum/ - - https://www.kaasmarkt.nl/historie/kaasmuseum - - https://www.hollandmuseums.nl/blog/hollands-kaasmuseum-alkmaar/ - - https://museumtv.nl/museum/hollands-kaasmuseum/ - - https://www.kaasmuseum.nl/kaasmarkt-alkmaar-10-tips/ - claims_extracted: - - timespan_begin - data_tier: TIER_4_INFERRED - archive_path: data/custodian/web/0668/linkup/linkup_founding_20251215T192257Z.json - data_tier_summary: - TIER_1_AUTHORITATIVE: - - original_entry (NDE CSV) - TIER_2_VERIFIED: - - wikidata_api - - google_maps_api - - genealogiewerkbalk_registry - TIER_3_CROWD_SOURCED: [] - TIER_4_INFERRED: - - website_scrape - - exa_web_search - notes: - - Provenance tracking added retroactively - - claim_level_provenance available in sources section - - Canonical location normalized on 2025-12-09T12:53:08Z -qp_resolution_timestamp: '2025-11-27T20:16:11.251083+00:00' -google_maps_enrichment: - place_id: ChIJJe3JsbVXz0cRTYSXeXDihT0 - name: Hollands Kaasmuseum - fetch_timestamp: '2025-11-28T09:55:24.630880+00:00' - api_status: OK - coordinates: - latitude: 52.6313764 - longitude: 4.7500972 - formatted_address: Waagplein 2, 1811 JP Alkmaar - short_address: Waagplein 2, Alkmaar - address_components: - - long_name: '2' - short_name: '2' - types: - - street_number - - long_name: Waagplein - short_name: Waagplein - types: - - route - - long_name: Alkmaar - short_name: Alkmaar - types: - - locality - - political - - long_name: Alkmaar - short_name: Alkmaar - types: - - administrative_area_level_2 - - political - - long_name: Noord-Holland - short_name: NH - types: - - administrative_area_level_1 - - political - - long_name: Nederland - short_name: NL - types: - - country - - political - - long_name: 1811 JP - short_name: 1811 JP - types: - - postal_code - phone_local: 072 515 5516 - phone_international: +31 72 515 5516 - website: http://www.kaasmuseum.nl/ - google_place_types: - - museum - - tourist_attraction - - point_of_interest - - establishment - primary_type: museum - business_status: OPERATIONAL - opening_hours: - open_now: false - periods: - - open: - day: 0 - hour: 12 - minute: 0 - close: - day: 0 - hour: 16 - minute: 0 - - open: - day: 1 - hour: 13 - minute: 0 - close: - day: 1 - hour: 16 - minute: 0 - - open: - day: 2 - hour: 13 - minute: 0 - close: - day: 2 - hour: 16 - minute: 0 - - open: - day: 3 - hour: 13 - minute: 0 - close: - day: 3 - hour: 16 - minute: 0 - - open: - day: 4 - hour: 13 - minute: 0 - close: - day: 4 - hour: 16 - minute: 0 - - open: - day: 5 - hour: 13 - minute: 0 - close: - day: 5 - hour: 16 - minute: 0 - - open: - day: 6 - hour: 10 - minute: 0 - close: - day: 6 - hour: 16 - minute: 0 - weekday_text: - - 'maandag: 13:00–16:00' - - 'dinsdag: 13:00–16:00' - - 'woensdag: 13:00–16:00' - - 'donderdag: 13:00–16:00' - - 'vrijdag: 13:00–16:00' - - 'zaterdag: 10:00–16:00' - - 'zondag: 12:00–16:00' - rating: 4.3 - total_ratings: 1578 - reviews: - - author_name: Karina Bekker - author_uri: https://www.google.com/maps/contrib/105395927728324909914/reviews - rating: 5 - relative_time_description: 3 maanden geleden - text: Erg leuk kleinschalig museum. Het kaasmaken door de jaren heen is mooi in - beeld en attributen te zien.. er is ook genoeg te lezen en voor de kleinsten - onder ons te spelen of spelenderwijs wat te leren👍 de vrijwilligers vertellen - je met enthousiasme wat je wil weten over bepaalde onderwerpen.. bij binnenkomst - kom je meteen in de sfeer door het blokje kaas wat je word aangereikt.. Kortom - een interessant en leuk museum.. - publish_time: '2025-08-15T19:31:28.764407767Z' - - author_name: Ronald Bruinen - author_uri: https://www.google.com/maps/contrib/107916023175057033000/reviews - rating: 4 - relative_time_description: 4 maanden geleden - text: Leuk om te zien hoe het vroeger en nu gaat met kaasmaken. Vriendelijke ontvangen - door de vrijwilligers. Verschillende interactieve dingen te doen. Je bent ongeveer - een uurtje binnen. Prijs ticket valt mee. - publish_time: '2025-07-14T19:32:41.311849103Z' - - author_name: martin de roode - author_uri: https://www.google.com/maps/contrib/111812264051014663143/reviews - rating: 4 - relative_time_description: 4 maanden geleden - text: Leuk, leerzaam, goed opgezet klein museum. De moeite waard om een kijkje - te nemen. - publish_time: '2025-07-22T07:17:16.032588126Z' - - author_name: Theo Rood - author_uri: https://www.google.com/maps/contrib/101796649420221176709/reviews - rating: 4 - relative_time_description: 2 maanden geleden - text: Leuk om een keer te zien. Gezellige sfeer. - publish_time: '2025-09-17T01:19:46.393573996Z' - - author_name: Pamela M - author_uri: https://www.google.com/maps/contrib/112012444381493782514/reviews - rating: 3 - relative_time_description: 3 maanden geleden - text: Klein museum, ik had er iets meer van verwacht. Bij binnenkomst heel hartelijk - ontvangen door 2 heel vriendelijke en behulpzame dames. Met ook een stukje kaas. - Museum heeft wat interactieve onderdelen en leuke filmpjes. Heel leuk gedaan - en leuke opzet. - publish_time: '2025-08-20T20:42:42.033372014Z' - editorial_summary: Kaasmuseum met historische voorwerpen, schilderijen, presentaties - en meer. - photo_urls: - - https://places.googleapis.com/v1/places/ChIJJe3JsbVXz0cRTYSXeXDihT0/photos/AWn5SU73DwbqOqHDjEdFN9K1UlXLO92YFxSns-2X5T-4Rfonj4GytlgyOPvmwD5eHS-oQ5CwKFSfrr9XPSPlDd9QulNJShxUHVuwR9DqotLrXfWzp3rAIYbcxxxgUmIRtL_g82D6V4ke4qKqaF5GdAanisJuo_awfcZWWwfa5vuDOWYKdw-UiEepM3qD2nEr4OD6QZIksNP-ppB5liUfoISm-fy3XQRQIPeRtjbIjg83mlcEj7VxU2U8Xom6KGqG-xyq6gOocTsPWGgDNHOHbTHE6vh988-ufyfXZ00UQYZyFQ3aDg/media?maxWidthPx=800&key=AIzaSyAHuazNth9ZvfRFYk5-v49CwXwhABH8Ri0 - - https://places.googleapis.com/v1/places/ChIJJe3JsbVXz0cRTYSXeXDihT0/photos/AWn5SU6oYC0pEXln4IkHDedv_ShMGmXzGpuAHdok98llc3BWe33vpAQoOTK39oVKs8hZBgu1bUkji-HOxWFcM42sJrOOAaW-jgnCqee9KLB5-uQgHYAcCmTuxid5Of52dedFnMt90Hzt7v2mrdrOj2CU44MaNlDDQxYqjB3TKGy__5N-XJA4zM3FI0l9PPhoSIzCkNy9NhSdCCIgGRuMX3QChVaSphbhSpK2kcGJfVx8N0zGnl00R7wLWYdjcQTG7RI2bCfNLHJfr8-Izo65BTBuQawD5bUlYlm2HZGVqLbhZk6qwpz1L6BhhBWf8aZ5my5npVcdXv6XdP1n0RA_5kMvzsew2xB2DZUjVwFUnMxKjT9HUdb4osSE0sOy1g5uRei6_29w2X0LgEIeq2fFVqIVbq-3WSI4TQjcMVE5d2hqt8BL_Q/media?maxWidthPx=800&key=AIzaSyAHuazNth9ZvfRFYk5-v49CwXwhABH8Ri0 - - https://places.googleapis.com/v1/places/ChIJJe3JsbVXz0cRTYSXeXDihT0/photos/AWn5SU6xiLytd4DBp4n54GxMvQiagLjbBjFE6Ay8wEIZxjFituWl-CYWFvBPs3DpJO0-MEVaqiVWHIVaF1Qmoibble_DREVi80uy6LwyC-8ha1Xzf4q7gAm38nEJXEtczBolkbiS30fYx7jYXD7S0514pKMmJXSF5JkIcPss04hTqVs0yosphBNsT8s0-cqQrHd6BmpCvy5ztUX_ZDzh9HeYcgyvdkj1Qxb_F0jwNpmBJAov1REIEh92EfKGbqVLA4Z9nY6_ck2hlI3uUBCJBmQOEKVEwFg66e0Cb9ojns2l4EfxtD3Bkcgtcpe8a9dFj7aLuOjBfaAVjRZfcDpjPvjhPZt2DCiFbzSLiaqpx2dWh8a0qHDqXHN9lhLT96dvQId_C0aqDuB0hIE7x4M7O11fF_f9zF8LuyUWE3NGQogi3hLKJg/media?maxWidthPx=800&key=AIzaSyAHuazNth9ZvfRFYk5-v49CwXwhABH8Ri0 - - https://places.googleapis.com/v1/places/ChIJJe3JsbVXz0cRTYSXeXDihT0/photos/AWn5SU6BGjpKLCUyNMVJ3LCowKhMvfEVFylzS6HA5QN2bDXQbC0BpIUDpVZaLt6oDMnS65n4pc1aUPPVWVoL2kNhVjI_Wz3IQbFxdv5ZATb9kgxC8AQlqqyzUJFTVRb6Y_3ODke7VZs6_XyEqSFESuj56vFJAmtFffenNE1YzZg8S3zgk0GoHi7D38Iy0TtQCIzHJm7EmN-aRjC_9QXkwFcCqSYL8f3YQlKyblbd-nppjFPYRq9KM0ALcYBVUhaRWrCj-sCqsJyzPMZugtDwuR4ZmWXQXtuhcgyWh5kVu-0587HZsRkGM8fF5BEVdoVCy97QEHUr2HIiyx_GXnHesy4SKXOJP0tm-fhZhsu6lrrqSUEUzVenzOYz-RVajPo0HTtpVGB9xVGE--lcAreP3EeH5BehgFL_Xc1ptJfRdDNRHLsHmcA5qgPZAJPaly1hMKQz/media?maxWidthPx=800&key=AIzaSyAHuazNth9ZvfRFYk5-v49CwXwhABH8Ri0 - - https://places.googleapis.com/v1/places/ChIJJe3JsbVXz0cRTYSXeXDihT0/photos/AWn5SU63hRQAAu7QGml3UzF34lgrIFA2YA8CBNf0AjQdlKK8mfGGhhN4p4xYfnr4X4RCUJsHKnIPpB4bUVU4rBFzm_vmBUKvSoMWwXChdkOnSleJOh7Jym39xErESXHv7DjkGLEcXqCurR2vtAt98fCyPPVNuUdIT5VLJyOxIaIejaxOMmzjESCiIJDulTGYRqYp5ym5plf7bOO5HePqP6hL6uxevL6caN644gLDITW7VsNAPrZOw_9YRkPXgnvU2F83HRtYUTmvuDze2aR43xH45QaLkdTtqyiOzG_9jUlPgZFMjMQnpsQ41XLAiKaeWvC5Iw7xSvP8ntHztpYdHwWqGgH4SUGNHV7oZl-zqkcHi_OvT9tp6ykV0dO4mB34fTxUfl1QXdecfVem3UepdIw0ZdACy7Hfu1tBHIN151NKml8/media?maxWidthPx=800&key=AIzaSyAHuazNth9ZvfRFYk5-v49CwXwhABH8Ri0 - photos_metadata: - - name: places/ChIJJe3JsbVXz0cRTYSXeXDihT0/photos/AWn5SU73DwbqOqHDjEdFN9K1UlXLO92YFxSns-2X5T-4Rfonj4GytlgyOPvmwD5eHS-oQ5CwKFSfrr9XPSPlDd9QulNJShxUHVuwR9DqotLrXfWzp3rAIYbcxxxgUmIRtL_g82D6V4ke4qKqaF5GdAanisJuo_awfcZWWwfa5vuDOWYKdw-UiEepM3qD2nEr4OD6QZIksNP-ppB5liUfoISm-fy3XQRQIPeRtjbIjg83mlcEj7VxU2U8Xom6KGqG-xyq6gOocTsPWGgDNHOHbTHE6vh988-ufyfXZ00UQYZyFQ3aDg - height: 683 - width: 1024 - author_attributions: - - displayName: Hollands Kaasmuseum - uri: https://maps.google.com/maps/contrib/106681157110932190469 - photoUri: https://lh3.googleusercontent.com/a/ACg8ocITwyI2opQojRy7mewawC6IaiF76QW-TDV7ME7_mHpb0AucGw=s100-p-k-no-mo - - name: places/ChIJJe3JsbVXz0cRTYSXeXDihT0/photos/AWn5SU6oYC0pEXln4IkHDedv_ShMGmXzGpuAHdok98llc3BWe33vpAQoOTK39oVKs8hZBgu1bUkji-HOxWFcM42sJrOOAaW-jgnCqee9KLB5-uQgHYAcCmTuxid5Of52dedFnMt90Hzt7v2mrdrOj2CU44MaNlDDQxYqjB3TKGy__5N-XJA4zM3FI0l9PPhoSIzCkNy9NhSdCCIgGRuMX3QChVaSphbhSpK2kcGJfVx8N0zGnl00R7wLWYdjcQTG7RI2bCfNLHJfr8-Izo65BTBuQawD5bUlYlm2HZGVqLbhZk6qwpz1L6BhhBWf8aZ5my5npVcdXv6XdP1n0RA_5kMvzsew2xB2DZUjVwFUnMxKjT9HUdb4osSE0sOy1g5uRei6_29w2X0LgEIeq2fFVqIVbq-3WSI4TQjcMVE5d2hqt8BL_Q - height: 3464 - width: 4618 - author_attributions: - - displayName: John van Straalen - uri: https://maps.google.com/maps/contrib/108803647265273769911 - photoUri: https://lh3.googleusercontent.com/a-/ALV-UjXLJynJjR-MS6ThxxXMDqlw4ccu9S1ifUqrpEmsT4ge_eteyEg=s100-p-k-no-mo - - name: places/ChIJJe3JsbVXz0cRTYSXeXDihT0/photos/AWn5SU6xiLytd4DBp4n54GxMvQiagLjbBjFE6Ay8wEIZxjFituWl-CYWFvBPs3DpJO0-MEVaqiVWHIVaF1Qmoibble_DREVi80uy6LwyC-8ha1Xzf4q7gAm38nEJXEtczBolkbiS30fYx7jYXD7S0514pKMmJXSF5JkIcPss04hTqVs0yosphBNsT8s0-cqQrHd6BmpCvy5ztUX_ZDzh9HeYcgyvdkj1Qxb_F0jwNpmBJAov1REIEh92EfKGbqVLA4Z9nY6_ck2hlI3uUBCJBmQOEKVEwFg66e0Cb9ojns2l4EfxtD3Bkcgtcpe8a9dFj7aLuOjBfaAVjRZfcDpjPvjhPZt2DCiFbzSLiaqpx2dWh8a0qHDqXHN9lhLT96dvQId_C0aqDuB0hIE7x4M7O11fF_f9zF8LuyUWE3NGQogi3hLKJg - height: 1508 - width: 2010 - author_attributions: - - displayName: Valery Gondova - uri: https://maps.google.com/maps/contrib/109208942931552974959 - photoUri: https://lh3.googleusercontent.com/a/ACg8ocKdobQa74wqViuVPWA8XSG3EHnRdV3kaoJOoL65QUcifPFClg=s100-p-k-no-mo - - name: places/ChIJJe3JsbVXz0cRTYSXeXDihT0/photos/AWn5SU6BGjpKLCUyNMVJ3LCowKhMvfEVFylzS6HA5QN2bDXQbC0BpIUDpVZaLt6oDMnS65n4pc1aUPPVWVoL2kNhVjI_Wz3IQbFxdv5ZATb9kgxC8AQlqqyzUJFTVRb6Y_3ODke7VZs6_XyEqSFESuj56vFJAmtFffenNE1YzZg8S3zgk0GoHi7D38Iy0TtQCIzHJm7EmN-aRjC_9QXkwFcCqSYL8f3YQlKyblbd-nppjFPYRq9KM0ALcYBVUhaRWrCj-sCqsJyzPMZugtDwuR4ZmWXQXtuhcgyWh5kVu-0587HZsRkGM8fF5BEVdoVCy97QEHUr2HIiyx_GXnHesy4SKXOJP0tm-fhZhsu6lrrqSUEUzVenzOYz-RVajPo0HTtpVGB9xVGE--lcAreP3EeH5BehgFL_Xc1ptJfRdDNRHLsHmcA5qgPZAJPaly1hMKQz - height: 1622 - width: 1080 - author_attributions: - - displayName: Fabio Henrique - uri: https://maps.google.com/maps/contrib/107598150557089646631 - photoUri: https://lh3.googleusercontent.com/a-/ALV-UjWkG9aIXqRb9mLovoV35GjS-c6PwYoXUM8ziz5k68m9BXuhv8bwYw=s100-p-k-no-mo - - name: places/ChIJJe3JsbVXz0cRTYSXeXDihT0/photos/AWn5SU63hRQAAu7QGml3UzF34lgrIFA2YA8CBNf0AjQdlKK8mfGGhhN4p4xYfnr4X4RCUJsHKnIPpB4bUVU4rBFzm_vmBUKvSoMWwXChdkOnSleJOh7Jym39xErESXHv7DjkGLEcXqCurR2vtAt98fCyPPVNuUdIT5VLJyOxIaIejaxOMmzjESCiIJDulTGYRqYp5ym5plf7bOO5HePqP6hL6uxevL6caN644gLDITW7VsNAPrZOw_9YRkPXgnvU2F83HRtYUTmvuDze2aR43xH45QaLkdTtqyiOzG_9jUlPgZFMjMQnpsQ41XLAiKaeWvC5Iw7xSvP8ntHztpYdHwWqGgH4SUGNHV7oZl-zqkcHi_OvT9tp6ykV0dO4mB34fTxUfl1QXdecfVem3UepdIw0ZdACy7Hfu1tBHIN151NKml8 - height: 3425 - width: 3468 - author_attributions: - - displayName: Benno Wolf - uri: https://maps.google.com/maps/contrib/106506987001885421970 - photoUri: https://lh3.googleusercontent.com/a/ACg8ocK8cmE5sMCaTQ33lTQT0YNhie-5ixbYdkLBNHV_ZN8JlBgscQ=s100-p-k-no-mo - google_maps_url: https://maps.google.com/?cid=4433198380920308813&g_mp=Cidnb29nbGUubWFwcy5wbGFjZXMudjEuUGxhY2VzLlNlYXJjaFRleHQQAhgEIAA - street_view_url: https://maps.googleapis.com/maps/api/streetview?size=600x400&location=52.6313764,4.7500972&key=AIzaSyAHuazNth9ZvfRFYk5-v49CwXwhABH8Ri0 - icon_mask_uri: https://maps.gstatic.com/mapfiles/place_api/icons/v2/museum_pinlet - icon_background_color: '#13B5C7' - utc_offset_minutes: 60 -google_maps_status: SUCCESS -google_maps_search_query: Het Hollands Kaasmuseum, Netherlands -web_enrichment: - web_archives: - - url: http://www.kaasmuseum.nl/ - directory: web/0668/kaasmuseum.nl - pages_archived: 110 - archive_method: wget_warc_deep - warc_file: archive.warc.gz - warc_size_bytes: 1985603 - warc_format: ISO 28500 - full_site_archive_timestamp: '2025-11-29T16:54:11.177845+00:00' -museum_register_enrichment: - museum_name: Het Hollands Kaasmuseum - website_url: https://www.kaasmuseum.nl/ - province: Noord-Holland - registered_since: '1999-09-15' - source_provenance: - source_file: data/museum_register_nl/museumregister_nederland_20251130.yaml - source_url: https://www.museumregisternederland.nl/register-bekijken - scrape_timestamp: '2025-11-30T12:28:03.607528+00:00' - source_page: 13 - enrichment_timestamp: '2025-11-30T12:47:37.153200+00:00' +custodian_name: + emic_name: Hollands Kaas Museum + emic_name_source: linkedin +institution_type: +- M +linkedin_enrichment: + linkedin_url: https://www.linkedin.com/company/hollands-kaas-museum + linkedin_slug: hollands-kaas-museum + industry: Museums, Historical Sites, and Zoos + website: null + follower_count: 5,618,343 + staff_count: 1 + heritage_staff_count: 0 + heritage_staff: [] + enrichment_timestamp: '2025-12-16T21:06:41.385742+00:00' + provenance: + source: linkedin_company_scrape + original_file: data/custodian/linkedin/hollands-kaas-museum.yaml + schema_version: 1.0.0 +location: + city: Alkmaar + region: Noord-Holland + country: NL + address: Waagplein 2, 1811 JP Alkmaar ghcid: ghcid_current: NL-NH-ALK-M-HKM - ghcid_original: NL-NH-ALK-M-HKM + ghcid_original: NL-XX-XXX-M-HKM ghcid_uuid: 7af2a5e6-cb11-5b73-8b0e-459fcab32330 ghcid_uuid_sha256: a4b36c14-ff8e-801d-93c0-7ccdd63253f1 ghcid_numeric: 11867948280494030877 - record_id: 019adf94-75d5-7f34-b539-2a684754eb98 - generation_timestamp: '2025-12-02T14:56:45.615377+00:00' + record_id: b51e4aff-c0c7-40da-b064-3f308125b650 + generation_timestamp: '2025-12-16T21:06:41.385742+00:00' ghcid_history: + - ghcid: NL-XX-XXX-M-HKM + ghcid_numeric: 13822241092346228972 + valid_from: '2025-12-16T21:06:41.385742+00:00' + valid_to: '2025-12-17T09:57:11.853959+00:00' + reason: Initial GHCID assignment from LinkedIn batch import - ghcid: NL-NH-ALK-M-HKM ghcid_numeric: 11867948280494030877 - valid_from: '2025-12-02T14:56:45.615377+00:00' + valid_from: '2025-12-17T09:57:11.853959+00:00' valid_to: null - reason: GHCID regenerated with Google Maps locality fix (Dec 2025) + reason: Location enriched via Exa web search - Alkmaar, Noord-Holland location_resolution: - method: GOOGLE_MAPS_LOCALITY - google_maps_locality: Alkmaar - geonames_id: 2759899 - geonames_name: Alkmaar - feature_code: PPL - population: 94853 - admin1_code: '07' + method: EXA_WEB_SEARCH + city_code: ALK + city_name: Alkmaar region_code: NH + region_name: Noord-Holland country_code: NL - source_coordinates: - latitude: 52.6313764 - longitude: 4.7500972 - source: google_maps - geonames_id: 2759899 -identifiers: -- identifier_scheme: GHCID - identifier_value: NL-NH-ALK-M-HKM -- identifier_scheme: GHCID_UUID - identifier_value: 7af2a5e6-cb11-5b73-8b0e-459fcab32330 - identifier_url: urn:uuid:7af2a5e6-cb11-5b73-8b0e-459fcab32330 -- identifier_scheme: GHCID_UUID_SHA256 - identifier_value: a4b36c14-ff8e-801d-93c0-7ccdd63253f1 - identifier_url: urn:uuid:a4b36c14-ff8e-801d-93c0-7ccdd63253f1 -- identifier_scheme: GHCID_NUMERIC - identifier_value: '11867948280494030877' -- identifier_scheme: RECORD_ID - identifier_value: 019adf94-75d5-7f34-b539-2a684754eb98 - identifier_url: urn:uuid:019adf94-75d5-7f34-b539-2a684754eb98 -web_claims: - extraction_timestamp: '2025-12-02T08:44:41.470463+00:00' - source_archive: web/0668/kaasmuseum.nl - claims_count: 284 - claims: - - claim_type: org_name - claim_value: Over ons - raw_value: Over ons - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.662649+00:00' - - claim_type: description_short - claim_value: Ons museum over kaas bestaat al sinds 1983 en ontvangt bezoekers - van over de hele wereld. - raw_value: Ons museum over kaas bestaat al sinds 1983 en ontvangt bezoekers van - over de hele wereld. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:40.662756+00:00' - - claim_type: org_name - claim_value: Kaasmuseum Alkmaar - raw_value: Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[20] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 1.0 - extraction_method: og_site_name - extraction_timestamp: '2025-12-02T08:44:40.662886+00:00' - - claim_type: email - claim_value: info@kaasmuseum.nl - raw_value: info@kaasmuseum.nl - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/footer/div[1]/div/div[2]/div[2]/a[2] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 1.0 - extraction_method: mailto_link - extraction_timestamp: '2025-12-02T08:44:40.663002+00:00' - - claim_type: phone - claim_value: 072 515 55 16 - raw_value: 072 515 55 16 - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/footer/div[1]/div/div[2]/div[2]/a[1] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 1.0 - extraction_method: tel_link - extraction_timestamp: '2025-12-02T08:44:40.663045+00:00' - - claim_type: social_youtube - claim_value: https://www.youtube.com/channel/UCrzcN3g53N1yrxL5AcbQ3sw - raw_value: https://www.youtube.com/channel/UCrzcN3g53N1yrxL5AcbQ3sw - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/footer/div[1]/div/div[3]/div/a[1] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 1.0 - extraction_method: social_link - extraction_timestamp: '2025-12-02T08:44:40.663145+00:00' - - claim_type: social_facebook - claim_value: https://www.facebook.com/Kaasmuseum - raw_value: https://www.facebook.com/Kaasmuseum - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/footer/div[1]/div/div[3]/div/a[2] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 1.0 - extraction_method: social_link - extraction_timestamp: '2025-12-02T08:44:40.663150+00:00' - - claim_type: collection_page - claim_value: structured_data_collection - raw_value: JSON-LD contains collection-related schema - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/script[1] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 0.85 - extraction_method: schema_org_collection - extraction_timestamp: '2025-12-02T08:44:40.665833+00:00' - - claim_type: page_title - claim_value: Over ons - Kaasmuseum Alkmaar - raw_value: Over ons - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.665891+00:00' - - claim_type: favicon - claim_value: https://www.kaasmuseum.nl/wp-content/themes/raadhuis/favicon.png - raw_value: https://www.kaasmuseum.nl/wp-content/themes/raadhuis/favicon.png - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/link[1] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 1.0 - extraction_method: favicon_link - extraction_timestamp: '2025-12-02T08:44:40.665929+00:00' - - claim_type: favicon - claim_value: https://www.kaasmuseum.nl/wp-content/themes/raadhuis/assets/images/favicon/favicon-32x32.png - raw_value: sizes=32x32, type=image/png - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/link[5] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 1.0 - extraction_method: favicon_link - extraction_timestamp: '2025-12-02T08:44:40.665937+00:00' - - claim_type: favicon - claim_value: https://www.kaasmuseum.nl/wp-content/themes/raadhuis/assets/images/favicon/favicon-16x16.png - raw_value: sizes=16x16, type=image/png - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/link[6] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 1.0 - extraction_method: favicon_link - extraction_timestamp: '2025-12-02T08:44:40.665941+00:00' - - claim_type: favicon - claim_value: https://www.kaasmuseum.nl/wp-content/themes/raadhuis/assets/images/apple-icon-touch.png - raw_value: https://www.kaasmuseum.nl/wp-content/themes/raadhuis/assets/images/apple-icon-touch.png - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/link[2] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 1.0 - extraction_method: favicon_link - extraction_timestamp: '2025-12-02T08:44:40.666003+00:00' - - claim_type: favicon - claim_value: https://www.kaasmuseum.nl/wp-content/themes/raadhuis/assets/images/favicon/apple-touch-icon.png - raw_value: sizes=180x180 - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/link[4] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 1.0 - extraction_method: favicon_link - extraction_timestamp: '2025-12-02T08:44:40.666007+00:00' - - claim_type: favicon - claim_value: https://www.kaasmuseum.nl/wp-content/themes/raadhuis/assets/images/favicon/safari-pinned-tab.svg - raw_value: https://www.kaasmuseum.nl/wp-content/themes/raadhuis/assets/images/favicon/safari-pinned-tab.svg - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/link[8] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 1.0 - extraction_method: favicon_link - extraction_timestamp: '2025-12-02T08:44:40.666011+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/themes/raadhuis/assets/images/logo/logo.svg - raw_value: alt=logo - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/header/div[1]/ul[1]/li/a/img - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 1.0 - extraction_method: logo_img_attr - extraction_timestamp: '2025-12-02T08:44:40.666264+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/themes/raadhuis/assets/images/HvNH_Logo_Ontdek_Achtergrond.png - raw_value: alt=HvNH Logo - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/footer/div[1]/div/div[4]/div/img - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 1.0 - extraction_method: logo_img_attr - extraction_timestamp: '2025-12-02T08:44:40.666272+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2019/02/share.jpg - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2019/02/share.jpg - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[23] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:40.666584+00:00' - - claim_type: org_name - claim_value: Privacyverklaring - raw_value: Privacyverklaring - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_privacybeleid_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.668987+00:00' - - claim_type: description_short - claim_value: In deze privacyverklaring informeren we jou over welke persoonsgegevens - wij verzamelen, waarom we deze gegevens verzamelen en wat we ermee doen. Stichting - Hollands Kaasmuseum Alkmaar (verder genoemd Hollands Kaasmuseum) vindt het belangrijk - dat er zorgvuldig met jouw persoonsgegevens wordt omgegaan en zorgt ervoor dat - de persoonlijke informatie die je ons verstrekt vertrouwelijk wordt behandeld. - Deze... Read more » - raw_value: In deze privacyverklaring informeren we jou over welke persoonsgegevens - wij verzamelen, waarom we deze gegevens verzamelen en wat we ermee doen. Stichting - Hollands Kaasmuseum Alkmaar (verder genoemd Hollands Kaasmuseum) vindt het belangrijk - dat er zorgvuldig met jouw persoonsgegevens wordt omgegaan en zorgt ervoor dat - de persoonlijke informatie die je ons verstrekt vertrouwelijk wordt behandeld. - Deze... Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_privacybeleid_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:40.669133+00:00' - - claim_type: page_title - claim_value: Privacyverklaring - Kaasmuseum Alkmaar - raw_value: Privacyverklaring - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_privacybeleid_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.672562+00:00' - - claim_type: org_name - claim_value: Organisation - raw_value: Organisation - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_about-us_organisation_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.675272+00:00' - - claim_type: description_short - claim_value: Stichting Hollands Kaasmuseum vertelt het ware verhaal over kaas. - raw_value: Stichting Hollands Kaasmuseum vertelt het ware verhaal over kaas. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/en_about-us_organisation_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:40.675342+00:00' - - claim_type: page_title - claim_value: Organisation - Kaasmuseum Alkmaar - raw_value: Organisation - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_about-us_organisation_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.679122+00:00' - - claim_type: org_name - claim_value: About us - raw_value: About us - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_about-us_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.682325+00:00' - - claim_type: description_short - claim_value: 'The Dutch Cheese Museum The Dutch Cheese Museum was founded in Alkmaar - in 1983. It is located in the historic Waaggebouw, which overlooks the cheese - market. In the museum you will find lots of interesting information about cheese: - its history, production methods and the cheese trade. To discover the true story - of cheese, you really... Read more »' - raw_value: 'The Dutch Cheese Museum The Dutch Cheese Museum was founded in Alkmaar - in 1983. It is located in the historic Waaggebouw, which overlooks the cheese - market. In the museum you will find lots of interesting information about cheese: - its history, production methods and the cheese trade. To discover the true story - of cheese, you really... Read more »' - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/en_about-us_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:40.682460+00:00' - - claim_type: page_title - claim_value: About us - Kaasmuseum Alkmaar - raw_value: About us - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_about-us_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.686851+00:00' - - claim_type: org_name - claim_value: Privacy statement - raw_value: Privacy statement - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_about-us_privacy-statement_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.689993+00:00' - - claim_type: description_short - claim_value: In this privacy policy, we inform you about which personal data we - collect, why we collect this data, and what we do with it. The Hollands Cheese - Museum Alkmaar Foundation (hereinafter referred to as Hollands Cheese Museum) - values the careful handling of your personal data and ensures that the personal - information you provide to us... Read more » - raw_value: In this privacy policy, we inform you about which personal data we - collect, why we collect this data, and what we do with it. The Hollands Cheese - Museum Alkmaar Foundation (hereinafter referred to as Hollands Cheese Museum) - values the careful handling of your personal data and ensures that the personal - information you provide to us... Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/en_about-us_privacy-statement_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:40.690133+00:00' - - claim_type: page_title - claim_value: Privacy statement - Kaasmuseum Alkmaar - raw_value: Privacy statement - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_about-us_privacy-statement_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.693401+00:00' - - claim_type: org_name - claim_value: Organisatie - raw_value: Organisatie - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_organisatie_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.695898+00:00' - - claim_type: page_title - claim_value: Organisatie - Kaasmuseum Alkmaar - raw_value: Organisatie - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/over-ons_organisatie_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.699765+00:00' - - claim_type: org_name - claim_value: Fun facts about cheese - raw_value: Fun facts about cheese - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_fun-facts-about-cheese_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.703111+00:00' - - claim_type: page_title - claim_value: Fun facts about cheese - Kaasmuseum Alkmaar - raw_value: Fun facts about cheese - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_fun-facts-about-cheese_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.708399+00:00' - - claim_type: org_name - claim_value: Datenschutzerklärung - raw_value: Datenschutzerklärung - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_ueber-uns_datenschutzerklaerung_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.761585+00:00' - - claim_type: description_short - claim_value: In dieser Datenschutzerklärung informieren wir Sie darüber, welche - personenbezogenen Daten wir erheben, warum wir diese Daten erheben und was wir - damit machen. Die Stiftung Hollands Kaasmuseum Alkmaar (im Folgenden Hollands - Kaasmuseum genannt) legt großen Wert auf den sorgfältigen Umgang mit Ihren personenbezogenen - Daten und sorgt dafür, dass die persönlichen Informationen, die Sie uns zur - Verfügung... Read more » - raw_value: In dieser Datenschutzerklärung informieren wir Sie darüber, welche - personenbezogenen Daten wir erheben, warum wir diese Daten erheben und was wir - damit machen. Die Stiftung Hollands Kaasmuseum Alkmaar (im Folgenden Hollands - Kaasmuseum genannt) legt großen Wert auf den sorgfältigen Umgang mit Ihren personenbezogenen - Daten und sorgt dafür, dass die persönlichen Informationen, die Sie uns zur - Verfügung... Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/de_ueber-uns_datenschutzerklaerung_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:40.761753+00:00' - - claim_type: page_title - claim_value: Datenschutzerklärung - Kaasmuseum Alkmaar - raw_value: Datenschutzerklärung - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_ueber-uns_datenschutzerklaerung_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.765790+00:00' - - claim_type: org_name - claim_value: 隐私声明 - raw_value: 隐私声明 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_关于我们_隐私声明_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.769381+00:00' - - claim_type: description_short - claim_value: 本隐私声明向您介绍我们收集的个人资料,我们收集这些资料的原因以及我们对它们的处理方式。 荷兰奶酪博物馆基金会阿... Read more - » - raw_value: 本隐私声明向您介绍我们收集的个人资料,我们收集这些资料的原因以及我们对它们的处理方式。 荷兰奶酪博物馆基金会阿... Read more - » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/zh_关于我们_隐私声明_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:40.769677+00:00' - - claim_type: page_title - claim_value: 隐私声明 - Kaasmuseum Alkmaar - raw_value: 隐私声明 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_关于我们_隐私声明_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.773758+00:00' - - claim_type: org_name - claim_value: 新闻 - raw_value: 新闻 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_news_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.777989+00:00' - - claim_type: description_short - claim_value: Het leukste nieuws over kaas en het Hollands Kaasmuseum. - raw_value: Het leukste nieuws over kaas en het Hollands Kaasmuseum. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/zh_news_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:40.778086+00:00' - - claim_type: page_title - claim_value: 新闻 - Kaasmuseum Alkmaar - raw_value: 新闻 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_news_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.781842+00:00' - - claim_type: org_name - claim_value: Besuch planen - raw_value: Besuch planen - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_besuch-planen_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.786302+00:00' - - claim_type: description_short - claim_value: Unser Museum ist auch für Besucher im Rollstuhl eingerichtet. Sind - Sie schlecht zu Fuß oder sitzen Sie im Rollstuhl oder in einem Elektromobil? - Wir möchten allen den Besuch unseres Museums ermöglichen. Im VVV-Laden befindet - sich ein Fahrstuhl, der ins Museum führt. Es gibt ein Behinderten-WC. Im Filmsaal - haben wir einen Rollstuhllift. Benötigen Sie zusätzliche Hilfe... Read more - » - raw_value: Unser Museum ist auch für Besucher im Rollstuhl eingerichtet. Sind - Sie schlecht zu Fuß oder sitzen Sie im Rollstuhl oder in einem Elektromobil? - Wir möchten allen den Besuch unseres Museums ermöglichen. Im VVV-Laden befindet - sich ein Fahrstuhl, der ins Museum führt. Es gibt ein Behinderten-WC. Im Filmsaal - haben wir einen Rollstuhllift. Benötigen Sie zusätzliche Hilfe... Read more - » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/de_besuch-planen_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:40.786551+00:00' - - claim_type: page_title - claim_value: Besuch planen - Kaasmuseum Alkmaar - raw_value: Besuch planen - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_besuch-planen_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.790685+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2019/07/rolstoel.jpg - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2019/07/rolstoel.jpg - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[22] - html_file: web/0668/kaasmuseum.nl/pages/de_besuch-planen_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:40.791639+00:00' - - claim_type: org_name - claim_value: Plan je bezoek - raw_value: Plan je bezoek - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/plan-je-bezoek_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.794247+00:00' - - claim_type: description_short - claim_value: Kom alles te weten over kaas. Plan je bezoek aan het leukste museum - van Nederland. - raw_value: Kom alles te weten over kaas. Plan je bezoek aan het leukste museum - van Nederland. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/plan-je-bezoek_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:40.794318+00:00' - - claim_type: page_title - claim_value: Plan je bezoek - Kaasmuseum Alkmaar - raw_value: Plan je bezoek - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/plan-je-bezoek_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.799049+00:00' - - claim_type: org_name - claim_value: Eyssen Alkmaar - raw_value: Eyssen Alkmaar - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/fr_eyssen-alkmaar_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.802912+00:00' - - claim_type: description_short - claim_value: Eyssen et Alkmaar sont indissociables du fromage et de leur histoire. - Eyssen, inventeur du fromage affiné que nous connaissons aujourd’hui sous le - nom de fromage à tartiner, est une formidable entreprise familiale dont la marque - existe depuis 1883, a reçu la désignation royale en 1905 et est implantée à - Alkmaar depuis 1929. L’histoire d’Eyssen et... Read more » - raw_value: Eyssen et Alkmaar sont indissociables du fromage et de leur histoire. - Eyssen, inventeur du fromage affiné que nous connaissons aujourd’hui sous le - nom de fromage à tartiner, est une formidable entreprise familiale dont la marque - existe depuis 1883, a reçu la désignation royale en 1905 et est implantée à - Alkmaar depuis 1929. L’histoire d’Eyssen et... Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[16] - html_file: web/0668/kaasmuseum.nl/pages/fr_eyssen-alkmaar_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:40.803055+00:00' - - claim_type: page_title - claim_value: Eyssen Alkmaar - Kaasmuseum Alkmaar - raw_value: Eyssen Alkmaar - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/fr_eyssen-alkmaar_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.807299+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2025/09/pand-Eyssen-Alkmaar.jpg - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2025/09/pand-Eyssen-Alkmaar.jpg - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[21] - html_file: web/0668/kaasmuseum.nl/pages/fr_eyssen-alkmaar_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:40.808718+00:00' - - claim_type: org_name - claim_value: Voor kinderen - raw_value: Voor kinderen - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/wat-is-er-te-doen_voor-kinderen_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.813171+00:00' - - claim_type: description_short - claim_value: Alle ins en outs over kaas leer je tijdens de interactieve speurtocht - en spelletjes in het kaasmuseum. - raw_value: Alle ins en outs over kaas leer je tijdens de interactieve speurtocht - en spelletjes in het kaasmuseum. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/wat-is-er-te-doen_voor-kinderen_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:40.813345+00:00' - - claim_type: page_title - claim_value: Voor kinderen - Kaasmuseum Alkmaar - raw_value: Voor kinderen - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/wat-is-er-te-doen_voor-kinderen_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.816754+00:00' - - claim_type: org_name - claim_value: Von der Kuh zum Käse - raw_value: Von der Kuh zum Käse - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_was-kann-man-dort-machen_von-der-kuh-zum-kaese_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.819968+00:00' - - claim_type: page_title - claim_value: Von der Kuh zum Käse - Kaasmuseum Alkmaar - raw_value: Von der Kuh zum Käse - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_was-kann-man-dort-machen_von-der-kuh-zum-kaese_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.825785+00:00' - - claim_type: org_name - claim_value: De Kaasmarkt in Alkmaar van A tot Z - raw_value: De Kaasmarkt in Alkmaar van A tot Z - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/kaasmarkt-alkmaar-van-a-tot-z_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.829940+00:00' - - claim_type: description_short - claim_value: De kaasmarkt in Alkmaar is al meer dan 4 eeuwen een traditie. Ontdek - in dit blog precies wat de Alkmaarse kaasmarkt zo uniek maakt. - raw_value: De kaasmarkt in Alkmaar is al meer dan 4 eeuwen een traditie. Ontdek - in dit blog precies wat de Alkmaarse kaasmarkt zo uniek maakt. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/kaasmarkt-alkmaar-van-a-tot-z_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:40.830036+00:00' - - claim_type: page_title - claim_value: De Kaasmarkt in Alkmaar van A tot Z - Kaasmuseum Alkmaar - raw_value: De Kaasmarkt in Alkmaar van A tot Z - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/kaasmarkt-alkmaar-van-a-tot-z_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.836575+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2020/10/Foto-5-Kaasmeesters-keuren-de-kazen.jpg - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2020/10/Foto-5-Kaasmeesters-keuren-de-kazen.jpg - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[19] - html_file: web/0668/kaasmuseum.nl/pages/kaasmarkt-alkmaar-van-a-tot-z_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:40.837967+00:00' - - claim_type: org_name - claim_value: De 10 leukste musea voor kinderen in Noord-Holland - raw_value: De 10 leukste musea voor kinderen in Noord-Holland - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de-10-leukste-musea-voor-kinderen-in-noord-holland_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.840861+00:00' - - claim_type: description_short - claim_value: Musea saai voor kinderen? Echt niet! Wij hebben een lijst opgezet - van de 10 leukste musea in Noord-Holland. - raw_value: Musea saai voor kinderen? Echt niet! Wij hebben een lijst opgezet van - de 10 leukste musea in Noord-Holland. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/de-10-leukste-musea-voor-kinderen-in-noord-holland_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:40.840945+00:00' - - claim_type: page_title - claim_value: De 10 leukste musea voor kinderen in Noord-Holland - Kaasmuseum Alkmaar - raw_value: De 10 leukste musea voor kinderen in Noord-Holland - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de-10-leukste-musea-voor-kinderen-in-noord-holland_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.845404+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2020/10/Foto-13-Kaasmuseum-Alkmaar.jpg - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2020/10/Foto-13-Kaasmuseum-Alkmaar.jpg - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[19] - html_file: web/0668/kaasmuseum.nl/pages/de-10-leukste-musea-voor-kinderen-in-noord-holland_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:40.846614+00:00' - - claim_type: org_name - claim_value: 主頁 - raw_value: 主頁 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.849314+00:00' - - claim_type: description_short - claim_value: Het leukste museum over kaas van Nederland staat in Alkmaar. - raw_value: Het leukste museum over kaas van Nederland staat in Alkmaar. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/zh_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:40.849393+00:00' - - claim_type: org_name - claim_value: 从奶牛到奶酪 - raw_value: 从奶牛到奶酪 - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/div[1]/main/div[1]/div/div[1]/div/div/a/h1 - html_file: web/0668/kaasmuseum.nl/pages/zh_index.html - xpath_match_score: 0.9 - extraction_method: h1_tag - extraction_timestamp: '2025-12-02T08:44:40.850179+00:00' - - claim_type: page_title - claim_value: 主頁 - Kaasmuseum Alkmaar - raw_value: 主頁 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.854638+00:00' - - claim_type: org_name - claim_value: Nieuws - raw_value: Nieuws - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/nieuws_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.859964+00:00' - - claim_type: page_title - claim_value: Nieuws - Kaasmuseum Alkmaar - raw_value: Nieuws - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/nieuws_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.868812+00:00' - - claim_type: org_name - claim_value: 对于儿童 - raw_value: 对于儿童 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_該怎麼辦_对于儿童_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.874137+00:00' - - claim_type: page_title - claim_value: 对于儿童 - Kaasmuseum Alkmaar - raw_value: 对于儿童 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_該怎麼辦_对于儿童_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.877587+00:00' - - claim_type: org_name - claim_value: Kaas verbindt generaties - raw_value: Kaas verbindt generaties - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/kaas-verbindt-generaties_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.889273+00:00' - - claim_type: description_short - claim_value: Ontdek hoe kaas generaties verbindt in Nederlandse gezinnen en leer - samen meer in het Kaasmuseum in Alkmaar. Een nostalgisch uitje. - raw_value: Ontdek hoe kaas generaties verbindt in Nederlandse gezinnen en leer - samen meer in het Kaasmuseum in Alkmaar. Een nostalgisch uitje. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/kaas-verbindt-generaties_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:40.889352+00:00' - - claim_type: page_title - claim_value: Kaas verbindt generaties - Kaasmuseum Alkmaar - raw_value: Kaas verbindt generaties - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/kaas-verbindt-generaties_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.892409+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2025/09/Kaas-en-gezin.png - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2025/09/Kaas-en-gezin.png - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[19] - html_file: web/0668/kaasmuseum.nl/pages/kaas-verbindt-generaties_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:40.893163+00:00' - - claim_type: org_name - claim_value: Plan your visit - raw_value: Plan your visit - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_plan-your-visit_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.895757+00:00' - - claim_type: description_short - claim_value: We want everyone to have the opportunity to visit our museum and - there are facilities for users of wheelchairs and motorised strollers. There - is a lift up to the museum in the VVV shop. There is a toilet for disabled persons. - There is a wheelchair lift in the museum’s cinema. If you need any further... - Read more » - raw_value: We want everyone to have the opportunity to visit our museum and there - are facilities for users of wheelchairs and motorised strollers. There is a - lift up to the museum in the VVV shop. There is a toilet for disabled persons. - There is a wheelchair lift in the museum’s cinema. If you need any further... - Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/en_plan-your-visit_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:40.895882+00:00' - - claim_type: page_title - claim_value: Plan your visit - Kaasmuseum Alkmaar - raw_value: Plan your visit - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_plan-your-visit_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.900051+00:00' - - claim_type: org_name - claim_value: Adres en route - raw_value: Adres en route - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/plan-je-bezoek_adres-en-route_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.903457+00:00' - - claim_type: description_short - claim_value: Het kaasmuseum in Alkmaar is goed te bereiken met de auto en openbaar - vervoer. Plan hier je route. - raw_value: Het kaasmuseum in Alkmaar is goed te bereiken met de auto en openbaar - vervoer. Plan hier je route. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/plan-je-bezoek_adres-en-route_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:40.903529+00:00' - - claim_type: page_title - claim_value: Adres en route - Kaasmuseum Alkmaar - raw_value: Adres en route - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/plan-je-bezoek_adres-en-route_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.908613+00:00' - - claim_type: org_name - claim_value: Ouverture et prix - raw_value: Ouverture et prix - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/fr_planifiez-votre-visite_ouverture-et-prix_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.912162+00:00' - - claim_type: description_short - claim_value: Hoe laat gaat het kaasmuseum open en hoeveel kost een kaartje voor - het museum?’ - raw_value: Hoe laat gaat het kaasmuseum open en hoeveel kost een kaartje voor - het museum?’ - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/fr_planifiez-votre-visite_ouverture-et-prix_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:40.912333+00:00' - - claim_type: page_title - claim_value: Ouverture et prix - Kaasmuseum Alkmaar - raw_value: Ouverture et prix - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/fr_planifiez-votre-visite_ouverture-et-prix_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.919113+00:00' - - claim_type: org_name - claim_value: Hollands Kaasmuseum - raw_value: Hollands Kaasmuseum - Hét leukste museum van Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.923655+00:00' - - claim_type: description_short - claim_value: Van koe naar kaas. Ontdek in het Kaasmuseum de geschiedenis van onze - kaas, hoe hij wordt gemaakt en hoe de verschillende smaken ontstaan. - raw_value: Van koe naar kaas. Ontdek in het Kaasmuseum de geschiedenis van onze - kaas, hoe hij wordt gemaakt en hoe de verschillende smaken ontstaan. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:40.923831+00:00' - - claim_type: org_name - claim_value: Van koenaar kaas! - raw_value: Van koenaar kaas! - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/div[1]/main/div[1]/div/div[1]/div/div/a/h1 - html_file: web/0668/kaasmuseum.nl/pages/index.html - xpath_match_score: 0.9 - extraction_method: h1_tag - extraction_timestamp: '2025-12-02T08:44:40.924729+00:00' - - claim_type: page_title - claim_value: Hollands Kaasmuseum - Hét leukste museum van Alkmaar - raw_value: Hollands Kaasmuseum - Hét leukste museum van Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.929158+00:00' - - claim_type: org_name - claim_value: Página principal - raw_value: Página principal - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/es_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.932645+00:00' - - claim_type: org_name - claim_value: ¡De la vaca... al queso! - raw_value: ¡De la vaca... al queso! - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/div[1]/main/div[1]/div/div[1]/div/div/a/h1 - html_file: web/0668/kaasmuseum.nl/pages/es_index.html - xpath_match_score: 0.9 - extraction_method: h1_tag - extraction_timestamp: '2025-12-02T08:44:40.933571+00:00' - - claim_type: page_title - claim_value: Página principal - Kaasmuseum Alkmaar - raw_value: Página principal - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/es_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.938349+00:00' - - claim_type: org_name - claim_value: Que pouvez-vous y faire? - raw_value: Que pouvez-vous y faire? - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/fr_que-pouvez-vous-y-faire_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.941579+00:00' - - claim_type: description_short - claim_value: Une journée amusante pour tous les âges ! Le Musée hollandais du - fromage est situé dans le Waaggebouw, qui donne sur la Waagplein à Alkmaar, - la place où se tient le célèbre marché au fromage tous les vendredis d’avril - à octobre. Une visite au musée est amusante et instructive pour les personnes - de tous âges. Notre... Read more » - raw_value: Une journée amusante pour tous les âges ! Le Musée hollandais du fromage - est situé dans le Waaggebouw, qui donne sur la Waagplein à Alkmaar, la place - où se tient le célèbre marché au fromage tous les vendredis d’avril à octobre. - Une visite au musée est amusante et instructive pour les personnes de tous âges. - Notre... Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/fr_que-pouvez-vous-y-faire_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:40.941718+00:00' - - claim_type: page_title - claim_value: Que pouvez-vous y faire? - Kaasmuseum Alkmaar - raw_value: Que pouvez-vous y faire? - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/fr_que-pouvez-vous-y-faire_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.945861+00:00' - - claim_type: org_name - claim_value: Dagje Alkmaar - raw_value: Dagje Alkmaar - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/wat-is-er-te-doen_dagje-alkmaar_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.948488+00:00' - - claim_type: description_short - claim_value: Alkmaar heeft een mooi historisch centrum waar je gezellig kunt eten - en winkelen voor of na je bezoek aan het kaasmuseum. - raw_value: Alkmaar heeft een mooi historisch centrum waar je gezellig kunt eten - en winkelen voor of na je bezoek aan het kaasmuseum. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/wat-is-er-te-doen_dagje-alkmaar_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:40.948557+00:00' - - claim_type: page_title - claim_value: Dagje Alkmaar - Kaasmuseum Alkmaar - raw_value: Dagje Alkmaar - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/wat-is-er-te-doen_dagje-alkmaar_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.952883+00:00' - - claim_type: org_name - claim_value: Kaasmuseum op TV - raw_value: Kaasmuseum op TV - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/kaasmuseum-op-tv_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.956438+00:00' - - claim_type: description_short - claim_value: 'Het SBS6-programma De Grote Tuinverbouwing bezocht onlangs het Kaasmuseum - Alkmaar. Bekijk hier de korte reportage:' - raw_value: 'Het SBS6-programma De Grote Tuinverbouwing bezocht onlangs het Kaasmuseum - Alkmaar. Bekijk hier de korte reportage:' - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[13] - html_file: web/0668/kaasmuseum.nl/pages/kaasmuseum-op-tv_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:40.956663+00:00' - - claim_type: video_youtube - claim_value: https://www.youtube.com/watch?v=OGCJHMYGV6k - raw_value: https://www.youtube.com/embed/OGCJHMYGV6k - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/div[1]/main/div[2]/div/article/section/div/p[2]/iframe - html_file: web/0668/kaasmuseum.nl/pages/kaasmuseum-op-tv_index.html - xpath_match_score: 1.0 - extraction_method: youtube_iframe - extraction_timestamp: '2025-12-02T08:44:40.957559+00:00' - - claim_type: page_title - claim_value: Kaasmuseum op TV - Kaasmuseum Alkmaar - raw_value: Kaasmuseum op TV - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/kaasmuseum-op-tv_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.962453+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2019/11/image00003.jpeg - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2019/11/image00003.jpeg - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[19] - html_file: web/0668/kaasmuseum.nl/pages/kaasmuseum-op-tv_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:40.964026+00:00' - - claim_type: org_name - claim_value: 奶酪博物馆内的奶酪市场 - raw_value: 奶酪博物馆内的奶酪市场 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_奶酪博物馆内的奶酪市场_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.968918+00:00' - - claim_type: description_short - claim_value: 阿尔克马尔著名的奶酪市场只能在 4 月至 10 月期间的周五上午 10 点至下午 1 点在我们的博物馆前现场体... Read more - » - raw_value: 阿尔克马尔著名的奶酪市场只能在 4 月至 10 月期间的周五上午 10 点至下午 1 点在我们的博物馆前现场体... Read more - » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/zh_奶酪博物馆内的奶酪市场_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:40.969059+00:00' - - claim_type: page_title - claim_value: 奶酪博物馆内的奶酪市场 - Kaasmuseum Alkmaar - raw_value: 奶酪博物馆内的奶酪市场 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_奶酪博物馆内的奶酪市场_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.973440+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2024/11/Kijker-2-bewerkt.jpeg - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2024/11/Kijker-2-bewerkt.jpeg - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[23] - html_file: web/0668/kaasmuseum.nl/pages/zh_奶酪博物馆内的奶酪市场_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:40.974552+00:00' - - claim_type: org_name - claim_value: Actualités - raw_value: Actualités - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/fr_actualites_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.976775+00:00' - - claim_type: page_title - claim_value: Actualités - Kaasmuseum Alkmaar - raw_value: Actualités - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/fr_actualites_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:40.981122+00:00' - - claim_type: description_short - claim_value: Eyssen y Alkmaar están inextricablemente unidos al queso y entre - sí. Eyssen, el inventor del queso curado que hoy conocemos como queso para untar, - es una maravillosa empresa familiar que existe como marca desde 1883, recibió - la designación real en 1905 y está ubicada en Alkmaar desde 1929. La historia - de Eyssen y el queso... Read more » - raw_value: Eyssen y Alkmaar están inextricablemente unidos al queso y entre sí. - Eyssen, el inventor del queso curado que hoy conocemos como queso para untar, - es una maravillosa empresa familiar que existe como marca desde 1883, recibió - la designación real en 1905 y está ubicada en Alkmaar desde 1929. La historia - de Eyssen y el queso... Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[16] - html_file: web/0668/kaasmuseum.nl/pages/es_eyssen-alkmaar_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:40.986454+00:00' - - claim_type: org_name - claim_value: horarios de apertura y precios - raw_value: horarios de apertura y precios - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/es_planifique-su-visita_horarios-de-apertura-y-precios_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:40.995353+00:00' - - claim_type: page_title - claim_value: horarios de apertura y precios - Kaasmuseum Alkmaar - raw_value: horarios de apertura y precios - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/es_planifique-su-visita_horarios-de-apertura-y-precios_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.001059+00:00' - - claim_type: org_name - claim_value: News - raw_value: News - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_news_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.005399+00:00' - - claim_type: page_title - claim_value: News - Kaasmuseum Alkmaar - raw_value: News - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_news_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.011519+00:00' - - claim_type: description_short - claim_value: Eyssen und Alkmaar sind untrennbar mit Käse und miteinander verbunden. - Eyssen, der Erfinder des gereiften Käses, den wir heute als Streichkäse kennen. - Ein wunderbares Familienunternehmen, das seit 1883 als Marke existiert, 1905 - die königliche Auszeichnung erhielt und seit 1929 in Alkmaar ansässig ist. Die - Geschichte von Eyssen und dem gereiften Käse, mit dem das Unternehmen... Read - more » - raw_value: Eyssen und Alkmaar sind untrennbar mit Käse und miteinander verbunden. - Eyssen, der Erfinder des gereiften Käses, den wir heute als Streichkäse kennen. - Ein wunderbares Familienunternehmen, das seit 1883 als Marke existiert, 1905 - die königliche Auszeichnung erhielt und seit 1929 in Alkmaar ansässig ist. Die - Geschichte von Eyssen und dem gereiften Käse, mit dem das Unternehmen... Read - more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[16] - html_file: web/0668/kaasmuseum.nl/pages/de_eyssen-alkmaar_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.015521+00:00' - - claim_type: org_name - claim_value: Nachrichten - raw_value: Nachrichten - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_nachrichten_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.023448+00:00' - - claim_type: page_title - claim_value: Nachrichten - Kaasmuseum Alkmaar - raw_value: Nachrichten - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_nachrichten_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.028783+00:00' - - claim_type: org_name - claim_value: Kaasweetjes - raw_value: Kaasweetjes - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_奶酪科普_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.032696+00:00' - - claim_type: description_short - claim_value: 您是否知道生产1公斤奶酪需要10升的牛奶,9.5升的山羊奶或6升的绵羊奶?制成一块好奶酪是弥足珍贵的̷... Read more - » - raw_value: 您是否知道生产1公斤奶酪需要10升的牛奶,9.5升的山羊奶或6升的绵羊奶?制成一块好奶酪是弥足珍贵的̷... Read more - » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/zh_奶酪科普_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.032856+00:00' - - claim_type: org_name - claim_value: 奶酪科普 - raw_value: 奶酪科普 - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/div[1]/main/div[1]/div/div/section/div/h1 - html_file: web/0668/kaasmuseum.nl/pages/zh_奶酪科普_index.html - xpath_match_score: 0.9 - extraction_method: h1_tag - extraction_timestamp: '2025-12-02T08:44:41.033310+00:00' - - claim_type: page_title - claim_value: Kaasweetjes - Kaasmuseum Alkmaar - raw_value: Kaasweetjes - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_奶酪科普_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.039721+00:00' - - claim_type: org_name - claim_value: '"Ik zei nog zo, geen bommetje!"' - raw_value: '"Ik zei nog zo, geen bommetje!" - Kaasmuseum Alkmaar' - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/ik-zei-nog-zo-geen-bommetje_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.043904+00:00' - - claim_type: description_short - claim_value: 'Het Hollands Kaasmuseum in het Waaggebouw is na de lockdown heropend - met een nieuwe permanente tentoonstelling: de Wereld van Zuivel. De maandenlange - sluiting is aangegrepen om een prachtige nieuwe interactieve tentoonstelling - neer te zetten op de tweede verdieping van het Waaggebouw, waarin de Wereld - van Zuivel centraal staat.  Dankzij een bijdrage van Friesland Campina en... - Read more »' - raw_value: 'Het Hollands Kaasmuseum in het Waaggebouw is na de lockdown heropend - met een nieuwe permanente tentoonstelling: de Wereld van Zuivel. De maandenlange - sluiting is aangegrepen om een prachtige nieuwe interactieve tentoonstelling - neer te zetten op de tweede verdieping van het Waaggebouw, waarin de Wereld - van Zuivel centraal staat.  Dankzij een bijdrage van Friesland Campina en... - Read more »' - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[12] - html_file: web/0668/kaasmuseum.nl/pages/ik-zei-nog-zo-geen-bommetje_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.044053+00:00' - - claim_type: org_name - claim_value: “Ik zei nog zo, geen bommetje!” - raw_value: “Ik zei nog zo, geen bommetje!” - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/div[1]/main/div[1]/div/div/section/div/h1 - html_file: web/0668/kaasmuseum.nl/pages/ik-zei-nog-zo-geen-bommetje_index.html - xpath_match_score: 0.9 - extraction_method: h1_tag - extraction_timestamp: '2025-12-02T08:44:41.044707+00:00' - - claim_type: page_title - claim_value: '"Ik zei nog zo, geen bommetje!" - Kaasmuseum Alkmaar' - raw_value: '"Ik zei nog zo, geen bommetje!" - Kaasmuseum Alkmaar' - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/ik-zei-nog-zo-geen-bommetje_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.049274+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2021/06/Wereld-van-Zuivel-2.jpeg - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2021/06/Wereld-van-Zuivel-2.jpeg - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[18] - html_file: web/0668/kaasmuseum.nl/pages/ik-zei-nog-zo-geen-bommetje_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:41.050439+00:00' - - claim_type: org_name - claim_value: Tickets - raw_value: Tickets - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_tickets_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.053259+00:00' - - claim_type: description_short - claim_value: Tickets can be purchased on site at the VVV box office at the entrance - of our museum or at the counter of our museum. You can also buy tickets online - via this website. You will receive a discount of € 0.50. Tickets are valid for - one year from the date of purchase. Museum card or... Read more » - raw_value: Tickets can be purchased on site at the VVV box office at the entrance - of our museum or at the counter of our museum. You can also buy tickets online - via this website. You will receive a discount of € 0.50. Tickets are valid for - one year from the date of purchase. Museum card or... Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/en_tickets_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.053421+00:00' - - claim_type: page_title - claim_value: Tickets - Kaasmuseum Alkmaar - raw_value: Tickets - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_tickets_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.057996+00:00' - - claim_type: description_short - claim_value: Tickets kunt u ter plaatse aanschaffen bij de VVV-kassa bij de ingang - van ons museum of bij de balie van ons museum. Tickets kunt u eveneens online - via deze website kopen. U ontvangt hierbij een korting van € 0,50. Tickets zijn - geldig tot een jaar na de datum van aankoop. Museumkaart of Alkmaar Pas? Dan... - Read more » - raw_value: Tickets kunt u ter plaatse aanschaffen bij de VVV-kassa bij de ingang - van ons museum of bij de balie van ons museum. Tickets kunt u eveneens online - via deze website kopen. U ontvangt hierbij een korting van € 0,50. Tickets zijn - geldig tot een jaar na de datum van aankoop. Museumkaart of Alkmaar Pas? Dan... - Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/reserveren-van-toegangskaarten_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.061763+00:00' - - claim_type: org_name - claim_value: Groups - raw_value: Groups - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_plan-your-visit_groups_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.068807+00:00' - - claim_type: description_short - claim_value: Visiting the Cheese Museum with a school group If you would like - to visit the Dutch Cheese Museum with a school group, you can choose a guided - tour or an independent visit. Tickets can be reserved on the website. Groups - of 10 or more persons are welcome. Group visits outside our regular opening - hours are... Read more » - raw_value: Visiting the Cheese Museum with a school group If you would like to - visit the Dutch Cheese Museum with a school group, you can choose a guided tour - or an independent visit. Tickets can be reserved on the website. Groups of 10 - or more persons are welcome. Group visits outside our regular opening hours - are... Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/en_plan-your-visit_groups_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.068977+00:00' - - claim_type: page_title - claim_value: Groups - Kaasmuseum Alkmaar - raw_value: Groups - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_plan-your-visit_groups_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.076493+00:00' - - claim_type: org_name - claim_value: 預訂門票 - raw_value: 預訂門票 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_預訂門票-yuding-menpiao_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.080759+00:00' - - claim_type: description_short - claim_value: 门票可以在我们博物馆入口处的VVV售票处或我们博物馆的柜台现场购买。 您也可以通过本网站在线购买门票。您将获得... Read more - » - raw_value: 门票可以在我们博物馆入口处的VVV售票处或我们博物馆的柜台现场购买。 您也可以通过本网站在线购买门票。您将获得... Read more - » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/zh_預訂門票-yuding-menpiao_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.080886+00:00' - - claim_type: page_title - claim_value: 預訂門票 - Kaasmuseum Alkmaar - raw_value: 預訂門票 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_預訂門票-yuding-menpiao_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.084686+00:00' - - claim_type: org_name - claim_value: Waar komt Hollandse kaas vandaan? - raw_value: Waar komt Hollandse kaas vandaan? - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/waar-komt-hollandse-kaas-vandaan_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.087900+00:00' - - claim_type: description_short - claim_value: Hollandse kaas is al heel oud, ook de jonge kaas. Er zijn aardewerkpotjes - met gaatjes gevonden uit ongeveer 800 jaar v.Chr. - raw_value: Hollandse kaas is al heel oud, ook de jonge kaas. Er zijn aardewerkpotjes - met gaatjes gevonden uit ongeveer 800 jaar v.Chr. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/waar-komt-hollandse-kaas-vandaan_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:41.087979+00:00' - - claim_type: page_title - claim_value: Waar komt Hollandse kaas vandaan? - Kaasmuseum Alkmaar - raw_value: Waar komt Hollandse kaas vandaan? - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/waar-komt-hollandse-kaas-vandaan_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.094044+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2021/11/kaasplanken.jpg - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2021/11/kaasplanken.jpg - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[19] - html_file: web/0668/kaasmuseum.nl/pages/waar-komt-hollandse-kaas-vandaan_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:41.094868+00:00' - - claim_type: org_name - claim_value: From cow to cheese - raw_value: From cow to cheese - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_things-to-do_from-cow-to-cheese_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.096870+00:00' - - claim_type: description_short - claim_value: Hoe wordt jonge en oude kaas gemaakt? Het hele verhaal van koe tot - kaas. - raw_value: Hoe wordt jonge en oude kaas gemaakt? Het hele verhaal van koe tot - kaas. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/en_things-to-do_from-cow-to-cheese_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:41.096955+00:00' - - claim_type: page_title - claim_value: From cow to cheese - Kaasmuseum Alkmaar - raw_value: From cow to cheese - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_things-to-do_from-cow-to-cheese_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.102014+00:00' - - claim_type: description_short - claim_value: Stiftung Holländisches Käsemuseum Das holländische Käsemuseum gehört - zur Stiftung Holländisches Käsemuseum. Diese Stiftung will Menschen auf inspirierende - Weise über die Welt des Käses informieren. Unsere Stiftung arbeitet nur mit - ehrenamtlich Tätigen. Gemeinsam tun wir unser Bestes, um den Besuchern unseres - Museums ein unvergessliches Erlebnis zu bieten! Vorstand Der Vorstand der Stiftung - Holländisches Käsemuseum besteht aus... Read more » - raw_value: Stiftung Holländisches Käsemuseum Das holländische Käsemuseum gehört - zur Stiftung Holländisches Käsemuseum. Diese Stiftung will Menschen auf inspirierende - Weise über die Welt des Käses informieren. Unsere Stiftung arbeitet nur mit - ehrenamtlich Tätigen. Gemeinsam tun wir unser Bestes, um den Besuchern unseres - Museums ein unvergessliches Erlebnis zu bieten! Vorstand Der Vorstand der Stiftung - Holländisches Käsemuseum besteht aus... Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/de_ueber-uns_organisation_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.105904+00:00' - - claim_type: org_name - claim_value: Über uns - raw_value: Über uns - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_ueber-uns_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.114330+00:00' - - claim_type: description_short - claim_value: 'Holländisches Käsemuseum Das holländische Käsemuseum in Alkmaar - wurde im Jahr 1983 gegründet. Unser Museum befindet sich im historischen Gebäude - der Waage, mit Aussicht auf den Käsemarkt. Im Museum gibt es viele interessante - Informationen über Käse: die Geschichte, das Herstellungsverfahren und den Käsehandel. - Im holländischen Käsemuseum entdecken Sie die wahre Geschichte des Käses! Geschichte - Die Grundlage... Read more »' - raw_value: 'Holländisches Käsemuseum Das holländische Käsemuseum in Alkmaar wurde - im Jahr 1983 gegründet. Unser Museum befindet sich im historischen Gebäude der - Waage, mit Aussicht auf den Käsemarkt. Im Museum gibt es viele interessante - Informationen über Käse: die Geschichte, das Herstellungsverfahren und den Käsehandel. - Im holländischen Käsemuseum entdecken Sie die wahre Geschichte des Käses! Geschichte - Die Grundlage... Read more »' - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/de_ueber-uns_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.114657+00:00' - - claim_type: page_title - claim_value: Über uns - Kaasmuseum Alkmaar - raw_value: Über uns - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_ueber-uns_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.118235+00:00' - - claim_type: org_name - claim_value: 'Alkmaar met Pinksteren: Ontdek de Lente, Koeien en Kaas in het Kaasmuseum' - raw_value: 'Alkmaar met Pinksteren: Ontdek de Lente, Koeien en Kaas in het Kaasmuseum - - Kaasmuseum Alkmaar' - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/alkmaar-met-pinksteren-ontdek-de-lente-koeien-en-kaas-in-het-kaasmuseum_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.121747+00:00' - - claim_type: description_short - claim_value: 'Wil je met Pinksteren iets leuks doen met het hele gezin en ben - je op zoek naar inspiratie in de omgeving van Alkmaar? Goed nieuws: het voorjaar - is dé perfecte tijd om op ontdekkingstocht te gaan. En wist je dat die vrolijke - koeien in de weilanden rondom Alkmaar juist nu zorgen voor een bijzondere kaastraditie?... - Read more »' - raw_value: 'Wil je met Pinksteren iets leuks doen met het hele gezin en ben je - op zoek naar inspiratie in de omgeving van Alkmaar? Goed nieuws: het voorjaar - is dé perfecte tijd om op ontdekkingstocht te gaan. En wist je dat die vrolijke - koeien in de weilanden rondom Alkmaar juist nu zorgen voor een bijzondere kaastraditie?... - Read more »' - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[12] - html_file: web/0668/kaasmuseum.nl/pages/alkmaar-met-pinksteren-ontdek-de-lente-koeien-en-kaas-in-het-kaasmuseum_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.121893+00:00' - - claim_type: page_title - claim_value: 'Alkmaar met Pinksteren: Ontdek de Lente, Koeien en Kaas in het Kaasmuseum - - Kaasmuseum Alkmaar' - raw_value: 'Alkmaar met Pinksteren: Ontdek de Lente, Koeien en Kaas in het Kaasmuseum - - Kaasmuseum Alkmaar' - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/alkmaar-met-pinksteren-ontdek-de-lente-koeien-en-kaas-in-het-kaasmuseum_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.127036+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2025/05/pinksterkaas.png - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2025/05/pinksterkaas.png - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/alkmaar-met-pinksteren-ontdek-de-lente-koeien-en-kaas-in-het-kaasmuseum_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:41.127892+00:00' - - claim_type: org_name - claim_value: Noticias - raw_value: Noticias - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/es_news_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.131134+00:00' - - claim_type: page_title - claim_value: Noticias - Kaasmuseum Alkmaar - raw_value: Noticias - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/es_news_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.137397+00:00' - - claim_type: org_name - claim_value: 從牛到奶酪 - raw_value: 從牛到奶酪 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_該怎麼辦_從牛到奶酪_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.142055+00:00' - - claim_type: page_title - claim_value: 從牛到奶酪 - Kaasmuseum Alkmaar - raw_value: 從牛到奶酪 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_該怎麼辦_從牛到奶酪_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.145849+00:00' - - claim_type: org_name - claim_value: Faits amusants sur le fromage - raw_value: Faits amusants sur le fromage - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/div[1]/main/div/div/div/section/div/h1 - html_file: web/0668/kaasmuseum.nl/pages/fr_faits-amusants-sur-le-fromage_index.html - xpath_match_score: 0.9 - extraction_method: h1_tag - extraction_timestamp: '2025-12-02T08:44:41.149564+00:00' - - claim_type: org_name - claim_value: Eintrittskarten - raw_value: Eintrittskarten - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_reservierung-von-eintrittskarten_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.158547+00:00' - - claim_type: description_short - claim_value: Tickets können vor Ort an der VVV-Kassa am Eingang unseres Museums - oder an der Kasse unseres Museums erworben werden. Sie können Tickets auch online - über diese Website kaufen. Sie erhalten einen Rabatt von 0,50 €. Tickets sind - ein Jahr ab Kaufdatum gültig. Museumskarte oder Alkmaar Pass? Dann können Sie - unser Museum ohne Eintrittskarten besuchen!  ... Read more » - raw_value: Tickets können vor Ort an der VVV-Kassa am Eingang unseres Museums - oder an der Kasse unseres Museums erworben werden. Sie können Tickets auch online - über diese Website kaufen. Sie erhalten einen Rabatt von 0,50 €. Tickets sind - ein Jahr ab Kaufdatum gültig. Museumskarte oder Alkmaar Pass? Dann können Sie - unser Museum ohne Eintrittskarten besuchen!  ... Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/de_reservierung-von-eintrittskarten_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.158686+00:00' - - claim_type: page_title - claim_value: Eintrittskarten - Kaasmuseum Alkmaar - raw_value: Eintrittskarten - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_reservierung-von-eintrittskarten_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.163193+00:00' - - claim_type: org_name - claim_value: Para los niños - raw_value: Para los niños - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/es_que-hay-para-hacer_para-los-ninos_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.166482+00:00' - - claim_type: page_title - claim_value: Para los niños - Kaasmuseum Alkmaar - raw_value: Para los niños - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/es_que-hay-para-hacer_para-los-ninos_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.171583+00:00' - - claim_type: org_name - claim_value: Öffnungszeiten und Preise - raw_value: Öffnungszeiten und Preise - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_besuch-planen_oeffnungszeiten-und-preise_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.175302+00:00' - - claim_type: description_short - claim_value: Hoe laat gaat het kaasmuseum open en hoeveel kost een kaartje voor - het museum? - raw_value: Hoe laat gaat het kaasmuseum open en hoeveel kost een kaartje voor - het museum? - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/de_besuch-planen_oeffnungszeiten-und-preise_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:41.175466+00:00' - - claim_type: page_title - claim_value: Öffnungszeiten und Preise - Kaasmuseum Alkmaar - raw_value: Öffnungszeiten und Preise - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_besuch-planen_oeffnungszeiten-und-preise_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.181026+00:00' - - claim_type: org_name - claim_value: Planifique su visita - raw_value: Planifique su visita - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/es_planifique-su-visita_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.185997+00:00' - - claim_type: description_short - claim_value: Queremos que todo el mundo tenga la oportunidad de visitar nuestro - museo y hay instalaciones para usuarios de sillas de ruedas y coches motorizados - para minusválidos. Hay un ascensor para llegar al museo en la tienda de VVV. - Hay un baño para discapacitados. Hay un ascensor para sillas de ruedas en el - cine del museo.... Read more » - raw_value: Queremos que todo el mundo tenga la oportunidad de visitar nuestro - museo y hay instalaciones para usuarios de sillas de ruedas y coches motorizados - para minusválidos. Hay un ascensor para llegar al museo en la tienda de VVV. - Hay un baño para discapacitados. Hay un ascensor para sillas de ruedas en el - cine del museo.... Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/es_planifique-su-visita_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.186134+00:00' - - claim_type: page_title - claim_value: Planifique su visita - Kaasmuseum Alkmaar - raw_value: Planifique su visita - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/es_planifique-su-visita_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.189867+00:00' - - claim_type: org_name - claim_value: Nostalgie - raw_value: Nostalgie - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/wat-is-er-te-doen_nostalgie_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.193561+00:00' - - claim_type: description_short - claim_value: De rijke geschiedenis van Hollandse kaas gaat ver terug. Romeinse - keizers spraken al over kaas uit de lage landen. - raw_value: De rijke geschiedenis van Hollandse kaas gaat ver terug. Romeinse keizers - spraken al over kaas uit de lage landen. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/wat-is-er-te-doen_nostalgie_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:41.193668+00:00' - - claim_type: video_youtube - claim_value: https://www.youtube.com/watch?v=olBln0tSZtg - raw_value: https://www.youtube.com/embed/olBln0tSZtg - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/div[1]/main/div[2]/div/div/div[2]/p/iframe - html_file: web/0668/kaasmuseum.nl/pages/wat-is-er-te-doen_nostalgie_index.html - xpath_match_score: 1.0 - extraction_method: youtube_iframe - extraction_timestamp: '2025-12-02T08:44:41.194402+00:00' - - claim_type: gallery_detected - claim_value: gallery - raw_value: 'gallery: 1 elements' - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/section - html_file: web/0668/kaasmuseum.nl/pages/wat-is-er-te-doen_nostalgie_index.html - xpath_match_score: 0.85 - extraction_method: gallery_pattern - extraction_timestamp: '2025-12-02T08:44:41.200454+00:00' - - claim_type: image_count - claim_value: '48' - raw_value: 48 images in gallery container - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/section - html_file: web/0668/kaasmuseum.nl/pages/wat-is-er-te-doen_nostalgie_index.html - xpath_match_score: 0.8 - extraction_method: gallery_image_count - extraction_timestamp: '2025-12-02T08:44:41.200648+00:00' - - claim_type: page_title - claim_value: Nostalgie - Kaasmuseum Alkmaar - raw_value: Nostalgie - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/wat-is-er-te-doen_nostalgie_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.200838+00:00' - - claim_type: org_name - claim_value: Impressum - raw_value: Impressum - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_impressum_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.207302+00:00' - - claim_type: description_short - claim_value: 'Grundangaben Kaasmuseum Nederland Waagplein 2 1811 JP Alkmaar Holland -   Kontakt E-Mail-Adresse: info@kaasmuseum.nl Telefon: +31 515 55 16   Vertretungsberechtigten - Joop Brakenhoff   Angaben zum Unternehmen Registernummer: 41 23 90 00 (KVK)' - raw_value: 'Grundangaben Kaasmuseum Nederland Waagplein 2 1811 JP Alkmaar Holland -   Kontakt E-Mail-Adresse: info@kaasmuseum.nl Telefon: +31 515 55 16   Vertretungsberechtigten - Joop Brakenhoff   Angaben zum Unternehmen Registernummer: 41 23 90 00 (KVK)' - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[12] - html_file: web/0668/kaasmuseum.nl/pages/de_impressum_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.207463+00:00' - - claim_type: page_title - claim_value: Impressum - Kaasmuseum Alkmaar - raw_value: Impressum - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_impressum_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.211906+00:00' - - claim_type: org_name - claim_value: 'Nieuw: Kaaspakhuis' - raw_value: 'Nieuw: Kaaspakhuis - Kaasmuseum Alkmaar' - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/nieuw-kaaspakhuis_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.214453+00:00' - - claim_type: description_short - claim_value: Nieuwste aanwinst in het Hollands Kaasmuseum is ons interactieve - kaaspakhuis. Hier kunt u door middel van 10 quizvragen uw kennis over kaas testen. - De vragen en antwoorden worden met spectaculaire beelden en geluid in het pakhuis - ondersteund. Dit kaaspakhuis is overigens een natuurgetrouw en op schaal nagebouwd - model van een echt pakhuis in Oosthuizen uit... Read more » - raw_value: Nieuwste aanwinst in het Hollands Kaasmuseum is ons interactieve kaaspakhuis. - Hier kunt u door middel van 10 quizvragen uw kennis over kaas testen. De vragen - en antwoorden worden met spectaculaire beelden en geluid in het pakhuis ondersteund. - Dit kaaspakhuis is overigens een natuurgetrouw en op schaal nagebouwd model - van een echt pakhuis in Oosthuizen uit... Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/nieuw-kaaspakhuis_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.214590+00:00' - - claim_type: page_title - claim_value: 'Nieuw: Kaaspakhuis - Kaasmuseum Alkmaar' - raw_value: 'Nieuw: Kaaspakhuis - Kaasmuseum Alkmaar' - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/nieuw-kaaspakhuis_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.218625+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2024/09/pakhuis2.jpg - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2024/09/pakhuis2.jpg - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[23] - html_file: web/0668/kaasmuseum.nl/pages/nieuw-kaaspakhuis_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:41.219299+00:00' - - claim_type: org_name - claim_value: Veelgestelde vragen - raw_value: Veelgestelde vragen - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/plan-je-bezoek_veelgestelde-vragen_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.221884+00:00' - - claim_type: description_short - claim_value: Antwoorden op de meest gestelde vragen over het kaasmuseum - raw_value: Antwoorden op de meest gestelde vragen over het kaasmuseum - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/plan-je-bezoek_veelgestelde-vragen_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:41.221971+00:00' - - claim_type: social_facebook - claim_value: https://nl-nl.facebook.com/Kaasmuseum - raw_value: https://nl-nl.facebook.com/Kaasmuseum - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/div[1]/main/section/div/div/div/div/div[18]/div/div[2]/div/div/a[1] - html_file: web/0668/kaasmuseum.nl/pages/plan-je-bezoek_veelgestelde-vragen_index.html - xpath_match_score: 1.0 - extraction_method: social_link - extraction_timestamp: '2025-12-02T08:44:41.222482+00:00' - - claim_type: page_title - claim_value: Veelgestelde vragen - Kaasmuseum Alkmaar - raw_value: Veelgestelde vragen - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/plan-je-bezoek_veelgestelde-vragen_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.228077+00:00' - - claim_type: org_name - claim_value: Kaasmarkten in 2025 - raw_value: Kaasmarkten in 2025 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/kaasmarkten-in-2025_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.231513+00:00' - - claim_type: description_short - claim_value: Duizenden bezoekers vanuit de hele wereld komen speciaal naar Alkmaar - voor de kaasmarkt. Het is dan ook een bijzonder schouwspel met een plein vol - kaas en sjouwende kaasdragers. In 2025 vindt de kaasmarkt plaats op alle vrijdagen - van 28 maart tot en met 26 september van 10 tot 13 uur. In de maanden juli en... - Read more » - raw_value: Duizenden bezoekers vanuit de hele wereld komen speciaal naar Alkmaar - voor de kaasmarkt. Het is dan ook een bijzonder schouwspel met een plein vol - kaas en sjouwende kaasdragers. In 2025 vindt de kaasmarkt plaats op alle vrijdagen - van 28 maart tot en met 26 september van 10 tot 13 uur. In de maanden juli en... - Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/kaasmarkten-in-2025_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.231655+00:00' - - claim_type: page_title - claim_value: Kaasmarkten in 2025 - Kaasmuseum Alkmaar - raw_value: Kaasmarkten in 2025 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/kaasmarkten-in-2025_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.237339+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2024/02/Werpers-op-de-Kaasmarkt-Ed-van-de-Pol.jpg - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2024/02/Werpers-op-de-Kaasmarkt-Ed-van-de-Pol.jpg - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[23] - html_file: web/0668/kaasmuseum.nl/pages/kaasmarkten-in-2025_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:41.237969+00:00' - - claim_type: org_name - claim_value: Lespakket Van Koe Naar Kaas - raw_value: Lespakket Van Koe Naar Kaas - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/lespakket-van-koe-naar-kaas_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.241080+00:00' - - claim_type: description_short - claim_value: Vanwege ons 40-jarig jubileum hebben wij een nieuw, leuk en leerzaam - lespakket ontwikkeld voor de groepen 6 en 7 van het basisonderwijs. Gedurende - het schooljaar ’23-’24 kunnen basisscholen uit de gemeente (groot) Alkmaar hiervan - gratis gebruik maken. Kijk voor meer informatie op onze pagina Onderwijs/Lespakket. - raw_value: Vanwege ons 40-jarig jubileum hebben wij een nieuw, leuk en leerzaam - lespakket ontwikkeld voor de groepen 6 en 7 van het basisonderwijs. Gedurende - het schooljaar ’23-’24 kunnen basisscholen uit de gemeente (groot) Alkmaar hiervan - gratis gebruik maken. Kijk voor meer informatie op onze pagina Onderwijs/Lespakket. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[12] - html_file: web/0668/kaasmuseum.nl/pages/lespakket-van-koe-naar-kaas_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.241260+00:00' - - claim_type: page_title - claim_value: Lespakket Van Koe Naar Kaas - Kaasmuseum Alkmaar - raw_value: Lespakket Van Koe Naar Kaas - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/lespakket-van-koe-naar-kaas_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.245183+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2023/10/Lespakket-comprim-scaled.jpg - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2023/10/Lespakket-comprim-scaled.jpg - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[18] - html_file: web/0668/kaasmuseum.nl/pages/lespakket-van-koe-naar-kaas_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:41.246184+00:00' - - claim_type: org_name - claim_value: Spreekbeurt - raw_value: Spreekbeurt - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/onderwijs_spreekbeurt_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.248186+00:00' - - claim_type: description_short - claim_value: Een spreekbeurt over kaas is leuk en lekker! Kom kaas proeven in - het museum en vertel je klasgenoten alles over hoe je kaas maakt. - raw_value: Een spreekbeurt over kaas is leuk en lekker! Kom kaas proeven in het - museum en vertel je klasgenoten alles over hoe je kaas maakt. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/onderwijs_spreekbeurt_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:41.248250+00:00' - - claim_type: video_youtube - claim_value: https://www.youtube.com/watch?v=2U4mAJkey0I - raw_value: https://www.youtube.com/embed/2U4mAJkey0I?feature=oembed - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/div[1]/main/div[2]/div/div/div/p[2]/iframe - html_file: web/0668/kaasmuseum.nl/pages/onderwijs_spreekbeurt_index.html - xpath_match_score: 1.0 - extraction_method: youtube_iframe - extraction_timestamp: '2025-12-02T08:44:41.248845+00:00' - - claim_type: video_youtube - claim_value: https://www.youtube.com/watch?v=8tJd0E4dt8I - raw_value: https://www.youtube.com/embed/8tJd0E4dt8I?feature=oembed - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/div[1]/main/div[2]/div/div/div/p[3]/iframe - html_file: web/0668/kaasmuseum.nl/pages/onderwijs_spreekbeurt_index.html - xpath_match_score: 1.0 - extraction_method: youtube_iframe - extraction_timestamp: '2025-12-02T08:44:41.248857+00:00' - - claim_type: page_title - claim_value: Spreekbeurt - Kaasmuseum Alkmaar - raw_value: Spreekbeurt - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/onderwijs_spreekbeurt_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.252383+00:00' - - claim_type: org_name - claim_value: Was kann man dort machen? - raw_value: Was kann man dort machen? - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_was-kann-man-dort-machen_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.255155+00:00' - - claim_type: description_short - claim_value: Schöner Ausflug für Jung und Alt Das holländische Käsemuseum befindet - sich im Waaggebouw, dem historischen Gebäude der Waage in Alkmaar, mit Aussicht - auf den Waagplein, auf dem der weltberühmte Käsemarkt stattfindet (freitags, - von April bis Oktober). Ein Besuch dieses Museums ist für Jung und Alt nett - und lehrreich. Die Sammlung mit historischen Objekten verschafft einem... Read - more » - raw_value: Schöner Ausflug für Jung und Alt Das holländische Käsemuseum befindet - sich im Waaggebouw, dem historischen Gebäude der Waage in Alkmaar, mit Aussicht - auf den Waagplein, auf dem der weltberühmte Käsemarkt stattfindet (freitags, - von April bis Oktober). Ein Besuch dieses Museums ist für Jung und Alt nett - und lehrreich. Die Sammlung mit historischen Objekten verschafft einem... Read - more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/de_was-kann-man-dort-machen_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.255504+00:00' - - claim_type: page_title - claim_value: Was kann man dort machen? - Kaasmuseum Alkmaar - raw_value: Was kann man dort machen? - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_was-kann-man-dort-machen_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.259490+00:00' - - claim_type: org_name - claim_value: 组织 - raw_value: 组织 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_关于我们_组织_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.262082+00:00' - - claim_type: page_title - claim_value: 组织 - Kaasmuseum Alkmaar - raw_value: 组织 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_关于我们_组织_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.265950+00:00' - - claim_type: org_name - claim_value: de la vaca al queso - raw_value: de la vaca al queso - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/es_que-hay-para-hacer_de-la-vaca-al-queso_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.268279+00:00' - - claim_type: page_title - claim_value: de la vaca al queso - Kaasmuseum Alkmaar - raw_value: de la vaca al queso - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/es_que-hay-para-hacer_de-la-vaca-al-queso_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.272417+00:00' - - claim_type: org_name - claim_value: 該怎麼辦 - raw_value: 該怎麼辦 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_該怎麼辦_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.274943+00:00' - - claim_type: description_short - claim_value: 为所有年龄段准备的有趣的一天! 荷兰奶酪博物馆位于阿尔克马尔过磅房楼上,并可俯瞰阿尔克马尔广场,从4月到10月... Read more - » - raw_value: 为所有年龄段准备的有趣的一天! 荷兰奶酪博物馆位于阿尔克马尔过磅房楼上,并可俯瞰阿尔克马尔广场,从4月到10月... Read more - » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/zh_該怎麼辦_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.275132+00:00' - - claim_type: page_title - claim_value: 該怎麼辦 - Kaasmuseum Alkmaar - raw_value: 該怎麼辦 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_該怎麼辦_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.280742+00:00' - - claim_type: org_name - claim_value: Déclaration de confidentialité - raw_value: Déclaration de confidentialité - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/fr_a-propos-de-nous_declaration-de-confidentialite_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.284045+00:00' - - claim_type: description_short - claim_value: Dans cette déclaration de confidentialité, nous vous informons sur - les données personnelles que nous collectons, pourquoi nous les collectons et - ce que nous en faisons. La Fondation Hollands Kaasmuseum Alkmaar (ci-après dénommée - Hollands Kaasmuseum) accorde une grande importance à la gestion soigneuse de - vos données personnelles et veille à ce que les informations personnelles que... - Read more » - raw_value: Dans cette déclaration de confidentialité, nous vous informons sur - les données personnelles que nous collectons, pourquoi nous les collectons et - ce que nous en faisons. La Fondation Hollands Kaasmuseum Alkmaar (ci-après dénommée - Hollands Kaasmuseum) accorde une grande importance à la gestion soigneuse de - vos données personnelles et veille à ce que les informations personnelles que... - Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/fr_a-propos-de-nous_declaration-de-confidentialite_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.284180+00:00' - - claim_type: page_title - claim_value: Déclaration de confidentialité - Kaasmuseum Alkmaar - raw_value: Déclaration de confidentialité - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/fr_a-propos-de-nous_declaration-de-confidentialite_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.288068+00:00' - - claim_type: org_name - claim_value: Ontdek het Geheim van de Gouden Kaas in Donald Duck Weekblad 17 (2025) - raw_value: Ontdek het Geheim van de Gouden Kaas in Donald Duck Weekblad 17 (2025) - - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/ontdek-het-geheim-van-de-gouden-kaas-in-donald-duck-weekblad-17-2025_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.290883+00:00' - - claim_type: description_short - claim_value: Ben jij klaar voor een avontuur dat letterlijk goud waard is? Het - nieuwste Donald Duck Weekblad, nummer 17 van 2025, neemt je mee op een verhaal - waar je van gaat smullen! Een klopjacht vol spanning, humor en – natuurlijk - – kaas! Pak een lekker plekje op de bank, want dit wil je lezen (en misschien... - Read more » - raw_value: Ben jij klaar voor een avontuur dat letterlijk goud waard is? Het nieuwste - Donald Duck Weekblad, nummer 17 van 2025, neemt je mee op een verhaal waar je - van gaat smullen! Een klopjacht vol spanning, humor en – natuurlijk – kaas! - Pak een lekker plekje op de bank, want dit wil je lezen (en misschien... Read - more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[12] - html_file: web/0668/kaasmuseum.nl/pages/ontdek-het-geheim-van-de-gouden-kaas-in-donald-duck-weekblad-17-2025_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.291016+00:00' - - claim_type: page_title - claim_value: Ontdek het Geheim van de Gouden Kaas in Donald Duck Weekblad 17 (2025) - - Kaasmuseum Alkmaar - raw_value: Ontdek het Geheim van de Gouden Kaas in Donald Duck Weekblad 17 (2025) - - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/ontdek-het-geheim-van-de-gouden-kaas-in-donald-duck-weekblad-17-2025_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.294566+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2025/04/kaas-alkmaar.png - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2025/04/kaas-alkmaar.png - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[18] - html_file: web/0668/kaasmuseum.nl/pages/ontdek-het-geheim-van-de-gouden-kaas-in-donald-duck-weekblad-17-2025_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:41.295210+00:00' - - claim_type: description_short - claim_value: Eyssen and Alkmaar are inextricably linked to cheese and to each - other. Eyssen, the inventor of cured cheese, which we now know as cheese spread. - A wonderful family business that has existed as a brand name since 1883, received - the Royal designation in 1905, and has been located in Alkmaar since 1929. The - history of... Read more » - raw_value: Eyssen and Alkmaar are inextricably linked to cheese and to each other. - Eyssen, the inventor of cured cheese, which we now know as cheese spread. A - wonderful family business that has existed as a brand name since 1883, received - the Royal designation in 1905, and has been located in Alkmaar since 1929. The - history of... Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[16] - html_file: web/0668/kaasmuseum.nl/pages/en_eyssen-alkmaar_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.297795+00:00' - - claim_type: org_name - claim_value: Lespakket - raw_value: Lespakket - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/onderwijs_lespakket_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.303397+00:00' - - claim_type: description_short - claim_value: Het kaasmuseum biedt een educatief programma voor groep 7 en 8 en - een kaasmarkt leskist voor alle klassen. - raw_value: Het kaasmuseum biedt een educatief programma voor groep 7 en 8 en een - kaasmarkt leskist voor alle klassen. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/onderwijs_lespakket_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:41.303465+00:00' - - claim_type: page_title - claim_value: Lespakket - Kaasmuseum Alkmaar - raw_value: Lespakket - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/onderwijs_lespakket_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.306525+00:00' - - claim_type: org_name - claim_value: Wat is er te doen? - raw_value: Wat is er te doen? - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/wat-is-er-te-doen_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.309056+00:00' - - claim_type: description_short - claim_value: Voor de hele familie een leuk dagje uit. Een interactief museum in - het monumentale waaggebouw vol nostalgie. - raw_value: Voor de hele familie een leuk dagje uit. Een interactief museum in - het monumentale waaggebouw vol nostalgie. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/wat-is-er-te-doen_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:41.309234+00:00' - - claim_type: page_title - claim_value: Wat is er te doen? - Kaasmuseum Alkmaar - raw_value: Wat is er te doen? - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/wat-is-er-te-doen_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.312728+00:00' - - claim_type: org_name - claim_value: 開放日報 - raw_value: 開放日報 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_计划出行_開放日報_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.315928+00:00' - - claim_type: page_title - claim_value: 開放日報 - Kaasmuseum Alkmaar - raw_value: 開放日報 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_计划出行_開放日報_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.320906+00:00' - - claim_type: org_name - claim_value: For children - raw_value: For children - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_things-to-do_for-children_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.323869+00:00' - - claim_type: page_title - claim_value: For children - Kaasmuseum Alkmaar - raw_value: For children - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_things-to-do_for-children_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.327814+00:00' - - claim_type: org_name - claim_value: Planifiez votre visite - raw_value: Planifiez votre visite - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/fr_planifiez-votre-visite_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.330196+00:00' - - claim_type: page_title - claim_value: Planifiez votre visite - Kaasmuseum Alkmaar - raw_value: Planifiez votre visite - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/fr_planifiez-votre-visite_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.333534+00:00' - - claim_type: org_name - claim_value: Für Kinder - raw_value: Für Kinder - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_was-kann-man-dort-machen_fuer-kinder_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.336420+00:00' - - claim_type: page_title - claim_value: Für Kinder - Kaasmuseum Alkmaar - raw_value: Für Kinder - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_was-kann-man-dort-machen_fuer-kinder_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.339282+00:00' - - claim_type: org_name - claim_value: Onderwijs - raw_value: Onderwijs - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/onderwijs_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.342422+00:00' - - claim_type: description_short - claim_value: Een leuk en leerzaam schoolprogramma voor de bovenbouw, informatie - voor spreekbeurten en een kaasmarkt leskist. - raw_value: Een leuk en leerzaam schoolprogramma voor de bovenbouw, informatie - voor spreekbeurten en een kaasmarkt leskist. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/onderwijs_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:41.342493+00:00' - - claim_type: page_title - claim_value: Onderwijs - Kaasmuseum Alkmaar - raw_value: Onderwijs - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/onderwijs_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.345405+00:00' - - claim_type: org_name - claim_value: Van koe naar kaas - raw_value: Van koe naar kaas - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/wat-is-er-te-doen_van-koe-naar-kaas_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.347815+00:00' - - claim_type: page_title - claim_value: Van koe naar kaas - Kaasmuseum Alkmaar - raw_value: Van koe naar kaas - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/wat-is-er-te-doen_van-koe-naar-kaas_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.351189+00:00' - - claim_type: org_name - claim_value: 关于我们 - raw_value: 关于我们 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_关于我们_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.353814+00:00' - - claim_type: page_title - claim_value: 关于我们 - Kaasmuseum Alkmaar - raw_value: 关于我们 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_关于我们_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.357581+00:00' - - claim_type: org_name - claim_value: De la vache au fromage - raw_value: De la vache au fromage - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/fr_que-pouvez-vous-y-faire_de-la-vache-au-fromage_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.360783+00:00' - - claim_type: page_title - claim_value: De la vache au fromage - Kaasmuseum Alkmaar - raw_value: De la vache au fromage - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/fr_que-pouvez-vous-y-faire_de-la-vache-au-fromage_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.365401+00:00' - - claim_type: org_name - claim_value: Wat jij kunt leren in het Kaasmuseum - raw_value: Wat jij kunt leren in het Kaasmuseum - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/wat-jij-kunt-leren-in-het-kaasmuseum_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.368681+00:00' - - claim_type: description_short - claim_value: Ontdek wat je kunt leren in het Kaasmuseum in Alkmaar. Leuk en leerzaam - voor het hele gezin – van kaasgeschiedenis tot interactieve speurtochten voor - kinderen. - raw_value: Ontdek wat je kunt leren in het Kaasmuseum in Alkmaar. Leuk en leerzaam - voor het hele gezin – van kaasgeschiedenis tot interactieve speurtochten voor - kinderen. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/wat-jij-kunt-leren-in-het-kaasmuseum_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:41.368756+00:00' - - claim_type: page_title - claim_value: Wat jij kunt leren in het Kaasmuseum - Kaasmuseum Alkmaar - raw_value: Wat jij kunt leren in het Kaasmuseum - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/wat-jij-kunt-leren-in-het-kaasmuseum_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.372456+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2023/05/STOCK_Kaasmuseum_025-scaled.jpg - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2023/05/STOCK_Kaasmuseum_025-scaled.jpg - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[19] - html_file: web/0668/kaasmuseum.nl/pages/wat-jij-kunt-leren-in-het-kaasmuseum_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:41.373099+00:00' - - claim_type: description_short - claim_value: Eyssen en Alkmaar zijn onlosmakelijk met kaas en met elkaar verbonden. - Eyssen als uitvinder van de verduurzaamde kaas, dat wij tegenwoordig kennen - als smeerkaas. Een prachtig familiebedrijf dat als merknaam sinds 1883 bestaat, - in 1905 het predikaat Koninklijk al verkreeg en sinds 1929 in Alkmaar is gevestigd. - De historie van Eyssen en de verduurzaamde kaas... Read more » - raw_value: Eyssen en Alkmaar zijn onlosmakelijk met kaas en met elkaar verbonden. - Eyssen als uitvinder van de verduurzaamde kaas, dat wij tegenwoordig kennen - als smeerkaas. Een prachtig familiebedrijf dat als merknaam sinds 1883 bestaat, - in 1905 het predikaat Koninklijk al verkreeg en sinds 1929 in Alkmaar is gevestigd. - De historie van Eyssen en de verduurzaamde kaas... Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[16] - html_file: web/0668/kaasmuseum.nl/pages/eyssen-alkmaar_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.375521+00:00' - - claim_type: org_name - claim_value: Wissenswertes über Käse - raw_value: Wissenswertes über Käse - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_wissenswertes-ueber-kaese_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.382245+00:00' - - claim_type: page_title - claim_value: Wissenswertes über Käse - Kaasmuseum Alkmaar - raw_value: Wissenswertes über Käse - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_wissenswertes-ueber-kaese_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.387312+00:00' - - claim_type: org_name - claim_value: Openingstijden en prijzen - raw_value: Openingstijden en prijzen - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/plan-je-bezoek_openingstijden-prijzen_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.390374+00:00' - - claim_type: social_youtube - claim_value: https://www.youtube.com/watch?v=yw8EheMn5Ek - raw_value: https://www.youtube.com/watch?v=yw8EheMn5Ek - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/div[1]/main/section[3]/div[1]/div/div[1]/p[2]/a - html_file: web/0668/kaasmuseum.nl/pages/plan-je-bezoek_openingstijden-prijzen_index.html - xpath_match_score: 1.0 - extraction_method: social_link - extraction_timestamp: '2025-12-02T08:44:41.391102+00:00' - - claim_type: page_title - claim_value: Openingstijden en prijzen - Kaasmuseum Alkmaar - raw_value: Openingstijden en prijzen - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/plan-je-bezoek_openingstijden-prijzen_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.394945+00:00' - - claim_type: org_name - claim_value: De 5 leukste musea van Alkmaar - raw_value: 'De 5 leukste musea van Alkmaar: voor ieder wat wils!' - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de-5-leukste-musea-van-alkmaar-voor-ieder-wat-wils_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.398006+00:00' - - claim_type: description_short - claim_value: 'De 5 leukste musea van Alkmaar: voor ieder wat wils! Zin in een - dagje cultuur snuiven in Alkmaar? Of je nu houdt van geschiedenis, kunst, muziek - of… natuurlijk kaas: deze gezellige stad heeft voor iedereen een museum om van - te smullen. In deze blog ontdek je de vijf leukste musea van Alkmaar. En wees - gewaarschuwd:... Read more »' - raw_value: 'De 5 leukste musea van Alkmaar: voor ieder wat wils! Zin in een dagje - cultuur snuiven in Alkmaar? Of je nu houdt van geschiedenis, kunst, muziek of… - natuurlijk kaas: deze gezellige stad heeft voor iedereen een museum om van te - smullen. In deze blog ontdek je de vijf leukste musea van Alkmaar. En wees gewaarschuwd:... - Read more »' - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[12] - html_file: web/0668/kaasmuseum.nl/pages/de-5-leukste-musea-van-alkmaar-voor-ieder-wat-wils_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.398141+00:00' - - claim_type: org_name - claim_value: 'De 5 leukste musea van Alkmaar: voor ieder wat wils!' - raw_value: 'De 5 leukste musea van Alkmaar: voor ieder wat wils!' - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/div[1]/main/div[1]/div/div/section/div/h1 - html_file: web/0668/kaasmuseum.nl/pages/de-5-leukste-musea-van-alkmaar-voor-ieder-wat-wils_index.html - xpath_match_score: 0.9 - extraction_method: h1_tag - extraction_timestamp: '2025-12-02T08:44:41.398965+00:00' - - claim_type: page_title - claim_value: 'De 5 leukste musea van Alkmaar: voor ieder wat wils!' - raw_value: 'De 5 leukste musea van Alkmaar: voor ieder wat wils!' - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de-5-leukste-musea-van-alkmaar-voor-ieder-wat-wils_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.401728+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2023/11/Waagplein-bewerkt-2MB.png - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2023/11/Waagplein-bewerkt-2MB.png - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[18] - html_file: web/0668/kaasmuseum.nl/pages/de-5-leukste-musea-van-alkmaar-voor-ieder-wat-wils_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:41.402388+00:00' - - claim_type: org_name - claim_value: Kaasmarkt in het Kaasmuseum - raw_value: Kaasmarkt in het Kaasmuseum - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/kaasmarkt-in-het-kaasmuseum_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.404642+00:00' - - claim_type: description_short - claim_value: De beroemde kaasmarkt van Alkmaar is alleen van april tot oktober - op vrijdagen tussen 10 en 13 uur live te beleven voor de deur van ons museum. - Binnen in ons museum is de kaasmarkt echter zeven dagen per week, het hele jaar - door te zien. Dit kan door middel van de nieuwste aanwinst van het... Read more - » - raw_value: De beroemde kaasmarkt van Alkmaar is alleen van april tot oktober op - vrijdagen tussen 10 en 13 uur live te beleven voor de deur van ons museum. Binnen - in ons museum is de kaasmarkt echter zeven dagen per week, het hele jaar door - te zien. Dit kan door middel van de nieuwste aanwinst van het... Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/kaasmarkt-in-het-kaasmuseum_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.404929+00:00' - - claim_type: page_title - claim_value: Kaasmarkt in het Kaasmuseum - Kaasmuseum Alkmaar - raw_value: Kaasmarkt in het Kaasmuseum - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/kaasmarkt-in-het-kaasmuseum_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.408890+00:00' - - claim_type: org_name - claim_value: Alkmaar bezoeken? Ontdek meer met deze 10 tips. - raw_value: Alkmaar bezoeken? Ontdek meer met deze 10 tips. - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/kaasmarkt-alkmaar-10-tips_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.412530+00:00' - - claim_type: description_short - claim_value: De Alkmaarse Kaasmarkt is een ware belevenis, maar er is nog veel - meer doen in het gezellige, oude stadshart van Alkmaar. Wij geven je 10 tips. - raw_value: De Alkmaarse Kaasmarkt is een ware belevenis, maar er is nog veel meer - doen in het gezellige, oude stadshart van Alkmaar. Wij geven je 10 tips. - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[9] - html_file: web/0668/kaasmuseum.nl/pages/kaasmarkt-alkmaar-10-tips_index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:41.412619+00:00' - - claim_type: video_youtube - claim_value: https://www.youtube.com/watch?v=h7gWFC75adk - raw_value: https://www.youtube.com/embed/h7gWFC75adk?feature=oembed - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/div[1]/main/div[2]/div/article/section/div/p[31]/iframe - html_file: web/0668/kaasmuseum.nl/pages/kaasmarkt-alkmaar-10-tips_index.html - xpath_match_score: 1.0 - extraction_method: youtube_iframe - extraction_timestamp: '2025-12-02T08:44:41.413277+00:00' - - claim_type: page_title - claim_value: Alkmaar bezoeken? Ontdek meer met deze 10 tips. - Kaasmuseum Alkmaar - raw_value: Alkmaar bezoeken? Ontdek meer met deze 10 tips. - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/kaasmarkt-alkmaar-10-tips_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.416845+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2020/04/Kaasmarkt.jpeg - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2020/04/Kaasmarkt.jpeg - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[19] - html_file: web/0668/kaasmuseum.nl/pages/kaasmarkt-alkmaar-10-tips_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:41.417817+00:00' - - claim_type: org_name - claim_value: Organización - raw_value: Organización - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/es_sobre-nosotros_organizacion_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.419910+00:00' - - claim_type: page_title - claim_value: Organización - Kaasmuseum Alkmaar - raw_value: Organización - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/es_sobre-nosotros_organizacion_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.423309+00:00' - - claim_type: org_name - claim_value: Startseite - raw_value: Startseite - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.426392+00:00' - - claim_type: org_name - claim_value: Von der Kuhzum Käse! - raw_value: Von der Kuhzum Käse! - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/div[1]/main/div[1]/div/div[1]/div/div/a/h1 - html_file: web/0668/kaasmuseum.nl/pages/de_index.html - xpath_match_score: 0.9 - extraction_method: h1_tag - extraction_timestamp: '2025-12-02T08:44:41.426970+00:00' - - claim_type: page_title - claim_value: Startseite - Kaasmuseum Alkmaar - raw_value: Startseite - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/de_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.431707+00:00' - - claim_type: org_name - claim_value: Opening hours and prices - raw_value: Opening hours and prices - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_plan-your-visit_opening-hours-and-prices_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.434833+00:00' - - claim_type: page_title - claim_value: Opening hours and prices - Kaasmuseum Alkmaar - raw_value: Opening hours and prices - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/en_plan-your-visit_opening-hours-and-prices_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.440094+00:00' - - claim_type: org_name - claim_value: ¿Qué hay para hacer? - raw_value: ¿Qué hay para hacer? - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/es_que-hay-para-hacer_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.444419+00:00' - - claim_type: description_short - claim_value: ¡Un día divertido para todas las edades! El Museo del Queso Neerlandés - está situado en Waaggebouw, que da a Waagplein en Alkmaar, la plaza donde se - celebra el mundialmente famoso mercado del queso todos los viernes desde abril - hasta octubre. Una visita al museo es divertida e informativa para gente de - todas las edades. En... Read more » - raw_value: ¡Un día divertido para todas las edades! El Museo del Queso Neerlandés - está situado en Waaggebouw, que da a Waagplein en Alkmaar, la plaza donde se - celebra el mundialmente famoso mercado del queso todos los viernes desde abril - hasta octubre. Una visita al museo es divertida e informativa para gente de - todas las edades. En... Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/es_que-hay-para-hacer_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.444673+00:00' - - claim_type: page_title - claim_value: ¿Qué hay para hacer? - Kaasmuseum Alkmaar - raw_value: ¿Qué hay para hacer? - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/es_que-hay-para-hacer_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.448263+00:00' - - claim_type: org_name - claim_value: Kaasmuseum in China - raw_value: Kaasmuseum in China - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/chinese-tv-ploeg-op-bezoek-bij-het-kaasmuseum_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.451953+00:00' - - claim_type: description_short - claim_value: Op 22 november is in China door Anhui Television het veelbekeken - TV-programma YU BAO BEI uitgezonden. In het programma volgt men Tongtong, een - meisje van 7 jaar dat met haar vader Meng kennis maakt met de Nederlandse cultuur - en natuurlijk ook met het ware verhaal van koe tot kaas dat in het Kaasmuseum - te zien... Read more » - raw_value: Op 22 november is in China door Anhui Television het veelbekeken TV-programma - YU BAO BEI uitgezonden. In het programma volgt men Tongtong, een meisje van - 7 jaar dat met haar vader Meng kennis maakt met de Nederlandse cultuur en natuurlijk - ook met het ware verhaal van koe tot kaas dat in het Kaasmuseum te zien... Read - more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[13] - html_file: web/0668/kaasmuseum.nl/pages/chinese-tv-ploeg-op-bezoek-bij-het-kaasmuseum_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.452091+00:00' - - claim_type: video_youtube - claim_value: https://www.youtube.com/watch?v=NooeeRueHXs - raw_value: https://www.youtube.com/embed/NooeeRueHXs - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/body/div[1]/main/div[2]/div/article/section/div/p[2]/iframe - html_file: web/0668/kaasmuseum.nl/pages/chinese-tv-ploeg-op-bezoek-bij-het-kaasmuseum_index.html - xpath_match_score: 1.0 - extraction_method: youtube_iframe - extraction_timestamp: '2025-12-02T08:44:41.452568+00:00' - - claim_type: page_title - claim_value: Kaasmuseum in China - Kaasmuseum Alkmaar - raw_value: Kaasmuseum in China - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/chinese-tv-ploeg-op-bezoek-bij-het-kaasmuseum_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.455339+00:00' - - claim_type: logo - claim_value: https://www.kaasmuseum.nl/wp-content/uploads/2019/11/sddefault.jpg - raw_value: https://www.kaasmuseum.nl/wp-content/uploads/2019/11/sddefault.jpg - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[19] - html_file: web/0668/kaasmuseum.nl/pages/chinese-tv-ploeg-op-bezoek-bij-het-kaasmuseum_index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:41.456137+00:00' - - claim_type: org_name - claim_value: Billets - raw_value: Billets - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/fr_reservation-de-billets_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.457868+00:00' - - claim_type: description_short - claim_value: Les billets peuvent être achetés sur place à la billetterie VVV à - l’entrée de notre musée ou au guichet de notre musée. Vous pouvez également - acheter des billets en ligne via ce site Web. Vous bénéficierez d’une réduction - de 0,50 €. Les billets sont valables un an à compter de la date d’achat. Carte - musée... Read more » - raw_value: Les billets peuvent être achetés sur place à la billetterie VVV à l’entrée - de notre musée ou au guichet de notre musée. Vous pouvez également acheter des - billets en ligne via ce site Web. Vous bénéficierez d’une réduction de 0,50 - €. Les billets sont valables un an à compter de la date d’achat. Carte musée... - Read more » - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/meta[17] - html_file: web/0668/kaasmuseum.nl/pages/fr_reservation-de-billets_index.html - xpath_match_score: 1.0 - extraction_method: og_description - extraction_timestamp: '2025-12-02T08:44:41.457989+00:00' - - claim_type: page_title - claim_value: Billets - Kaasmuseum Alkmaar - raw_value: Billets - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/fr_reservation-de-billets_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.460528+00:00' - - claim_type: org_name - claim_value: 计划出行 - raw_value: 计划出行 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_计划出行_index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:41.463786+00:00' - - claim_type: page_title - claim_value: 计划出行 - Kaasmuseum Alkmaar - raw_value: 计划出行 - Kaasmuseum Alkmaar - source_url: http://www.kaasmuseum.nl/ - retrieved_on: '2025-11-29T16:54:10.692503+00:00' - xpath: /html/head/title[1] - html_file: web/0668/kaasmuseum.nl/pages/zh_计划出行_index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:41.467923+00:00' -custodian_name: - claim_type: custodian_name - claim_value: Hollands Kaasmuseum - source: wikidata - confidence: 0.491 - consensus_method: true - sources_checked: 86 - sources_matched: 10 - extraction_timestamp: '2025-12-02T13:08:01.304703+00:00' - matching_sources: - - source: google_maps - name: Hollands Kaasmuseum - score: 1.0 - - source: original_entry - name: Het Hollands Kaasmuseum - score: 1.0 - - source: web_og_site_name - name: Kaasmuseum Alkmaar - score: 0.71 - - source: web_title_tag - name: Hollands Kaasmuseum - score: 1.0 - - source: web_title_tag - name: Kaasmuseum op TV - score: 0.77 - - source: web_title_tag - name: 'Alkmaar met Pinksteren: Ontdek de Lente, Koeien en Kaas in het Kaasmuseum' - score: 0.7 - - source: web_title_tag - name: Wat jij kunt leren in het Kaasmuseum - score: 0.7 - - source: web_title_tag - name: Kaasmarkt in het Kaasmuseum - score: 0.7 - - source: web_title_tag - name: Kaasmuseum in China - score: 0.74 -genealogiewerkbalk_enrichment: - source: Genealogiewerkbalk.nl Municipality Archives Registry - source_url: https://www.genealogiewerkbalk.nl/archieven.html - data_url: https://docs.google.com/spreadsheets/d/1rS_Z5L6L2vvfGLS6eHI8wfyiwB-KUfHEr7W1VNY3rpg/export?format=csv - data_tier: TIER_2_VERIFIED - enrichment_timestamp: '2025-12-03T13:50:46.475736+00:00' - match_method: google_maps_admin2 - match_confidence: 0.95 - municipality: - name: Alkmaar - code: '361' - municipal_archive: - name: Regionaal Historisch Centrum Alkmaar - website: https://www.regionaalarchiefalkmaar.nl/ - isil: NL-AmrRAA - province: - name: Noord-Holland - code: '27' - provincial_archive: - name: Noord-Hollands Archief - website: https://noord-hollandsarchief.nl/ -digital_platforms: -- platform_name: Het Hollands Kaasmuseum Website - platform_url: http://www.kaasmuseum.nl/ - platform_type: WEBSITE - platform_category: - - Organizational website - digital_collections: museum about cheese in the Netherlands - technology_stack: Standard web technology - data_standards: - - HTML5 - user_services: Exhibition information, Visit planning, Contact - sustainability_model: Institutional funding - enrichment_timestamp: '2025-12-05T11:19:27.565723+00:00' - source_method: automated_extraction -unesco_ich_enrichment: - country_code: NL - total_elements_in_country: 5 - enrichment_timestamp: '2025-12-06T20:20:22.436769+00:00' - elements: - - unesco_ich_id: '1870' - name: Rotterdam Summer Carnival - list_type: RL - list_name: Representative List of the Intangible Cultural Heritage of Humanity - inscription_year: 2023 - multinational: false - url: https://ich.unesco.org/en/RL/rotterdam-summer-carnival-01870 - description: The Rotterdam Summer Carnival is a multicultural celebration that - unites participants from the Caribbean and European Netherlands, as well as - ethnic minority groups from Central and South America and Africa living in the - Netherlands. The event includes a street parade, a brass band competition and - a... - - unesco_ich_id: '1979' - name: 'Traditional irrigation: knowledge, technique, and organization' - list_type: RL - list_name: Representative List of the Intangible Cultural Heritage of Humanity - inscription_year: 2023 - multinational: true - url: https://ich.unesco.org/en/RL/traditional-irrigation-knowledge-technique-and-organization-01979 - description: Traditional irrigation uses gravity and hand-made constructions such - as channels and ditches to distribute water from naturally-occurring water catchment - points (such as springs, streams and glaciers) to the fields. Practitioners - choose specific days and periods to manually divert the water, and the... - - unesco_ich_id: '1707' - name: Corso culture, flower and fruit parades in the Netherlands - list_type: RL - list_name: Representative List of the Intangible Cultural Heritage of Humanity - inscription_year: 2021 - multinational: false - url: https://ich.unesco.org/en/RL/corso-culture-flower-and-fruit-parades-in-the-netherlands-01707 - description: Dating back to the late nineteenth century, a corso is an annual - parade of floats or boats decorated with flowers, fruit, vegetables and, in - some cases, people in costumes. Originating in the south of France and Italy, - the practice spread to the Netherlands in the nineteenth century. The parade - take... - - unesco_ich_id: '1708' - name: Falconry, a living human heritage - list_type: RL - list_name: Representative List of the Intangible Cultural Heritage of Humanity - inscription_year: 2021 - multinational: true - url: https://ich.unesco.org/en/RL/falconry-a-living-human-heritage-01708 - description: Falconry is the traditional art and practice of training and flying - falcons (and sometimes eagles, hawks, buzzards and other birds of prey). It - has been practised for over 4000 years. The practice of falconry in early and - medieval periods of history is documented in many parts of the world. Original... - - unesco_ich_id: '1265' - name: Craft of the miller operating windmills and watermills - list_type: RL - list_name: Representative List of the Intangible Cultural Heritage of Humanity - inscription_year: 2017 - multinational: false - url: https://ich.unesco.org/en/RL/craft-of-the-miller-operating-windmills-and-watermills-01265 - description: The craft of the miller operating windmills and watermills involves - the knowledge and skills necessary to operate a mill and maintain it in a good - state of repair. With a declining number of people earning their livelihood - from the craft, millers today also play a key role in transmitting the cultur... -location: - latitude: 52.6313764 - longitude: 4.7500972 - coordinate_provenance: - source_type: GOOGLE_MAPS - source_path: google_maps_enrichment.coordinates - original_timestamp: '2025-11-28T09:55:24.630880+00:00' - entity_id: ChIJJe3JsbVXz0cRTYSXeXDihT0 - api_endpoint: https://maps.googleapis.com/maps/api/place/textsearch - city: Alkmaar - region: Noord-Holland - region_code: NH - country: NL - postal_code: 1811 JP - street_address: Waagplein 2, Alkmaar - formatted_address: Waagplein 2, 1811 JP Alkmaar - geonames_id: 2759899 - geonames_name: Alkmaar - feature_code: PPL - normalization_timestamp: '2025-12-09T12:53:08.863740+00:00' -validated_entity_claims: - extraction_timestamp: '2025-12-13T19:45:01.228959+00:00' - extraction_method: hybrid_llm_pattern_layout_v1 - confidence_threshold: 0.6 - entities_count: 5 - cleanup_applied: '2025-12-13T19:49:30.969715+00:00' - claims: - - entity: Hollands Kaasmuseum - entity_type: GRP.HER - xpath: /html/head/title - base_confidence: 1.0 - layout_score: 0.2 - pattern_score: 0.0 - final_confidence: 1.0 - layout_match: high_conf:head/title - - entity: Kaasmuseum Alkmaar - entity_type: GRP.HER - xpath: /html/head/meta[@property='og:site_name']/@content - base_confidence: 0.95 - layout_score: 0.2 - pattern_score: 0.0 - final_confidence: 1.0 - layout_match: high_conf:head/meta[@name='description']/@content - - entity: Alkmaar - entity_type: TOP.SET - xpath: /html/head/title - base_confidence: 1.0 - layout_score: 0.0 - pattern_score: 0.15 - final_confidence: 1.0 - wikidata_id: Q9865 - wikidata_label: Alkmaar - - entity: https://www.kaasmuseum.nl/ - entity_type: APP.URL - xpath: /html/head/link[@rel='canonical']/@href - base_confidence: 1.0 - layout_score: 0.0 - pattern_score: 0.0 - final_confidence: 1.0 - - entity: Eyssen Alkmaar - entity_type: GRP.UNT - xpath: //*[@id='home-uitgelicht-small']//a/h6 - base_confidence: 0.8 - layout_score: 0.0 - pattern_score: 0.0 - final_confidence: 0.8 - wikidata_linking_timestamp: '2025-12-13T22:09:35.403637' -crawl4ai_enrichment: - retrieval_timestamp: '2025-12-14T17:54:57.163717+00:00' - retrieval_agent: crawl4ai - source_url: http://www.kaasmuseum.nl/ - status_code: null - error: Crawl failed with status None -digital_platform_v2: - transformation_metadata: - transformed_from: httpx_beautifulsoup - transformation_date: '2025-12-14T22:58:40.713683+00:00' - transformation_version: '2.1' - source_status_code: 200 - primary_platform: - platform_id: primary_website_kaasmuseum_nl - platform_name: Hollands Kaasmuseum - Hét leukste museum van Alkmaar Website - platform_url: https://www.kaasmuseum.nl/ - platform_type: DISCOVERY_PORTAL - description: Van koe naar kaas. Ontdek in het Kaasmuseum de geschiedenis van onze - kaas, hoe hij wordt gemaakt en hoe de verschillende smaken ontstaan. - language: nl - og_image: https://www.kaasmuseum.nl/wp-content/uploads/2019/02/share.jpg - favicon: https://www.kaasmuseum.nl/wp-content/themes/raadhuis/favicon.png - navigation_links: - - https://www.kaasmuseum.nl - - https://www.kaasmuseum.nl/plan-je-bezoek/ - - https://www.kaasmuseum.nl/wat-is-er-te-doen/ - - https://www.kaasmuseum.nl/onderwijs/ - - https://www.kaasmuseum.nl/over-ons/ - - https://www.kaasmuseum.nl/reserveren-van-toegangskaarten/ - - https://www.kaasmuseum.nl/ - - https://www.kaasmuseum.nl/en/ - - https://www.kaasmuseum.nl/de/ - - https://www.kaasmuseum.nl/fr/ - - https://www.kaasmuseum.nl/es/ - - https://www.kaasmuseum.nl/zh/ - - https://www.kaasmuseum.nl/nieuws/ - - https://www.kaasmuseum.nl/wat-is-er-te-doen/van-koe-naar-kaas/ - - https://www.kaasmuseum.nl/plan-je-bezoek/openingstijden-prijzen/ - - https://www.kaasmuseum.nl/eyssen-alkmaar/ - - https://www.kaasmuseum.nl/wp-content/uploads/2025/12/Kleurplaat-kerst-2025.pdf - - https://www.kaasmuseum.nl/wat-is-er-te-doen/voor-kinderen/ - - https://www.kaasmuseum.nl/kaasweetjes/ - - https://www.kaasmuseum.nl/over-ons/privacybeleid/ -timespan: - begin_of_the_begin: '1969-04-23T00:00:00Z' - end_of_the_begin: '1969-04-23T00:00:00Z' - begin_of_the_end: null - end_of_the_end: null + resolution_date: '2025-12-17T09:57:11.853959+00:00' + source_url: https://www.kaasmuseum.nl/ +provenance: + schema_version: 1.0.0 + generated_at: '2025-12-16T21:06:41.385742+00:00' sources: - - 'Linkup web search: https://www.kaasmuseum.nl/over-ons/' - notes: 'Found via pattern: full_date_nl' - events: - - date: '1983-04-21' - type: founding - description: opgericht in 1983 -linkup_enrichment: - timeline_events: - - event_type: FOUNDING - event_date: '1983' - date_precision: year - approximate: false - description: opgericht in 1983 - source_urls: - - https://www.kaasmuseum.nl/over-ons/ - - https://www.erfgoedalkmaar.nl/monumentenkaart/waag-hollands-kaasmuseum/ - - https://www.kaasmarkt.nl/historie/kaasmuseum - - https://nl.wikipedia.org/wiki/Hollands_Kaasmuseum - - https://www.tripadvisor.nl/Attraction_Review-g188589-d3524516-Reviews-Dutch_Cheese_Museum-Alkmaar_North_Holland_Province.html - linkup_query: '"Hollands Kaasmuseum" Alkmaar opgericht OR gesticht OR sinds' - linkup_answer: Het Hollands Kaasmuseum in Alkmaar is opgericht in 1983. De deuren - van het museum gingen officieel open op 21 april 1983. De basis werd gelegd - in 1969 met de oprichting van de Stichting Hollands Zuivelarchief. - fetch_timestamp: '2025-12-15T19:22:57.727337+00:00' - archive_path: web/0668/linkup/linkup_founding_20251215T192257Z.json - extraction_method: linkup_answer_regex - extraction_timestamp: '2025-12-16T21:30:32.256134+00:00' - data_tier: TIER_4_INFERRED - - event_type: FOUNDING - event_date: '1983-04-21' - date_precision: day - approximate: false - description: opgericht in 1983 - source_urls: - - https://www.kaasmuseum.nl/over-ons/ - - https://www.erfgoedalkmaar.nl/monumentenkaart/waag-hollands-kaasmuseum/ - - https://www.kaasmarkt.nl/historie/kaasmuseum - - https://nl.wikipedia.org/wiki/Hollands_Kaasmuseum - - https://www.tripadvisor.nl/Attraction_Review-g188589-d3524516-Reviews-Dutch_Cheese_Museum-Alkmaar_North_Holland_Province.html - linkup_query: '"Hollands Kaasmuseum" Alkmaar opgericht OR gesticht OR sinds' - linkup_answer: Het Hollands Kaasmuseum in Alkmaar is opgericht in 1983. De deuren - van het museum gingen officieel open op 21 april 1983. De basis werd gelegd - in 1969 met de oprichting van de Stichting Hollands Zuivelarchief. - fetch_timestamp: '2025-12-15T19:22:57.727337+00:00' - archive_path: web/0668/linkup/linkup_founding_20251215T192257Z.json - extraction_method: linkup_answer_regex - extraction_timestamp: '2025-12-16T20:17:53.366534+00:00' - data_tier: TIER_4_INFERRED + linkedin: + - source_type: linkedin_company_profile + data_tier: TIER_4_INFERRED + source_file: data/custodian/linkedin/hollands-kaas-museum.yaml + extraction_timestamp: '2025-12-16T21:06:41.385742+00:00' + claims_extracted: + - name + - industry + - location + - website + - staff_count + - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.kaasmuseum.nl/ + extraction_timestamp: '2025-12-17T09:57:11.853959+00:00' + claims_extracted: + - city + - region + - address + data_tier_summary: + TIER_4_INFERRED: + - linkedin_company_profile + notes: + - Created from unmatched LinkedIn company profile + - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Alkmaar, Noord-Holland' diff --git a/data/custodian/NL-NH-AMS-M-AM.yaml b/data/custodian/NL-NH-AMS-M-AM.yaml index c3a2db8ecb..6faf11a83a 100644 --- a/data/custodian/NL-NH-AMS-M-AM.yaml +++ b/data/custodian/NL-NH-AMS-M-AM.yaml @@ -1,3232 +1,84 @@ -original_entry: - plaatsnaam_bezoekadres: Amsterdam - organisatie: Amsterdam Museum - isil_code_na: NL-AsdAM - systeem: Axiell Collections? - versnellen: ja - collectie_nederland: ja - museum_register: ja - in_scope_voor_dc4eu: ja - dc4eu_aansluit_route: direct - wo2net: ja - modemuze: ja - oode24_mondriaan: ja - linked_data: nee - versnellen_project: Upgrade - wikidata_id: Q1820897 - type: - - M -entry_index: 616 -processing_timestamp: '2025-11-27T16:32:57.560231+00:00' -wikidata_enrichment: - wikidata_entity_id: Q1820897 - api_metadata: - api_endpoint: https://www.wikidata.org/w/rest.php/wikibase/v1 - fetch_timestamp: '2025-12-09T12:14:44.943655+00:00' - user_agent: GLAMDataExtractor/1.1 (glam-data@example.com) Python/httpx - enrichment_version: 2.0_full - properties_found: - - P214 - - P527 - - P373 - - P17 - - P131 - - P31 - - P18 - - P625 - - P856 - - P571 - - P1566 - - P227 - - P268 - - P213 - - P244 - - P935 - - P2002 - - P3500 - - P2397 - - P276 - - P2427 - - P281 - - P1329 - - P973 - - P6782 - - P463 - - P1619 - - P8687 - - P166 - - P1015 - - P271 - - P269 - - P159 - - P11496 - - P11693 - wikidata_labels: - nl: Amsterdam Museum - en: Amsterdam Museum - fr: musée d'Amsterdam - he: המוזיאון להיסטוריה של אמסטרדם - it: Amsterdams Historisch Museum - tr: Amsterdam Tarih Müzesi - zh: 阿姆斯特丹博物馆 - ru: Амстердамский исторический музей - de: Amsterdam-Museum - mk: Амстердамски музеј - es: Museo de Ámsterdam - el: Μουσείο του Άμστερνταμ - ca: Museu d'Amsterdam - cy: Amgueddfa Amsterdam - en-gb: Amsterdam Museum - nb: Amsterdam Museum - hy: Ամստերդամի պատմական թանգարան - zh-hant: 阿姆斯特丹博物館 - fa: موزه آمستردام - eo: Amsterdama Muzeo - sr: Музеј Амстердама - uk: Амстердамський музей - lv: Amsterdamas muzejs - pt: Museu de Amesterdão - ast: Muséu d'Ámsterdam - ga: Iarsmalann Amstardam - bn: আমস্টারডাম জাদুঘর - ja: アムステルダム博物館 - cs: Amsterdamské muzeum - sl: Amsterdamski muzej - wikidata_label_en: Amsterdam Museum - wikidata_label_nl: Amsterdam Museum - wikidata_label_ja: アムステルダム博物館 - wikidata_label_de: Amsterdam-Museum - wikidata_label_fr: musée d'Amsterdam - wikidata_label_es: Museo de Ámsterdam - wikidata_descriptions: - nl: museum in Amsterdam - fr: musée néerlandais - en: municipal museum in Amsterdam, Netherlands - de: Museum der Stadtgeschichte von Amsterdam - ca: museu a Amsterdam - cy: amgueddfa yn Amsterdam - he: מוזיאון בהולנד - lv: muzejs Amsterdamā - id: museum di Belanda - ar: متحف في هولندا - eo: muzeo en Amsterdamo, Nederlando - ga: iarsmalann in Amstardam na hÍsiltíre - it: museo di Amsterdam - pt: museu histórico de Amsterdã - bn: আমস্টারডামের জাদুঘর - cs: muzeum v Amsterdamu - sl: muzej v Amsterdamu (Nizozemska) - wikidata_description_en: municipal museum in Amsterdam, Netherlands - wikidata_aliases: - nl: - - Amsterdams Historisch Museum - en: - - Amsterdam Historical Museum - - Burgerweeshuis Amsterdam - cy: - - Amsterdams Historisch - - Amgueddfa Amsterdams Historisch - de: - - Amsterdams Historisch Museum - es: - - Museo de Amsterdam - lv: - - Amsterdams Historisch Museum - - Amsterdamas vēstures muzejs - eo: - - Muzeo de Amsterdamo - - Amsterdam Museum - uk: - - Амстердамський історичний музей - ja: - - アムステルダム美術館 - cs: - - Amsterdamské historické muzeum - sl: - - Amsterdam Museum - wikidata_sitelinks: - bnwiki: আমস্টারডাম জাদুঘর - commonswiki: Amsterdam Museum - dewiki: Amsterdam Museum - enwiki: Amsterdam Museum - eowiki: Amsterdam Museum - fawiki: موزه آمستردام - frwiki: Musée d'Amsterdam - hewiki: המוזיאון להיסטוריה של אמסטרדם - hywiki: Ամստերդամի պատմության թանգարան - itwiki: Amsterdams Historisch Museum - nlwiki: Amsterdam Museum - ptwiki: Museu de Amsterdã - ruwiki: Амстердамский исторический музей - simplewiki: Amsterdam Museum - trwiki: Amsterdam Tarih Müzesi - zhwiki: 阿姆斯特丹博物馆 - eswiki: Museo de Ámsterdam - jawiki: アムステルダム博物館 - wikidata_temporal: - inception: '1926-01-01' - date_of_official_opening: '1926-00-00' - wikidata_inception: '1926-01-01' - wikidata_opening_date: '1926-00-00' - wikidata_classification: - instance_of: &id001 - - id: Q33506 - label: museum - description: institution that holds artifacts and other objects of scientific, artistic, cultural, historical, or other - importance - wikidata_instance_of: *id001 - wikidata_location: - country: &id002 - id: Q55 - label: Netherlands - description: country in Northwestern Europe with territories in the Caribbean - located_in_admin_entity: &id003 - id: Q9899 - label: Amsterdam - description: municipality in the Netherlands, containing the cities of Amsterdam and Weesp - coordinates: &id004 - latitude: 52.370278 - longitude: 4.890833 - precision: 1.0e-05 - location: - id: Q1909968 - label: Burgerweeshuis - description: former city orphanage (1580-1960) in Amsterdam, Netherlands; home to Amsterdam Museum - postal_code: 1012 PH - headquarters_location: - id: Q727 - label: Amsterdam - description: capital and most populous city of the Netherlands - wikidata_country: *id002 - wikidata_located_in: *id003 - wikidata_coordinates: *id004 - wikidata_organization: - has_parts: - - id: Q1886176 - label: Museum Willet-Holthuysen - description: museum in Amsterdam - member_of: - - id: Q1991604 - label: Geheugen van Nederland - description: image database in the Netherlands - wikidata_web: - official_website: http://amsterdammuseum.nl/ - described_at_url: https://www.museumkaart.nl/museum/Amsterdam+Museum.aspx - wikidata_official_website: http://amsterdammuseum.nl/ - wikidata_social_media: - twitter_username: AmsterdamMuseum - youtube_channel_id: UCmGzfZNyTQ5LC3GotRGmd0w - social_media_followers: '21039' - wikidata_media: - commons_category: Amsterdam Museum - image: Amsterdams Historisch Museum.jpg - commons_gallery: Amsterdam Museum - wikidata_image: Amsterdams Historisch Museum.jpg - wikidata_contact: - phone_number: +31-20-523-1822 - wikidata_recognition: - award_received: - - id: Q110989587 - label: registered museum - description: Dutch certification mark -enrichment_status: success -provenance: - schema_version: 1.0.0 - generated_at: '2025-11-28T23:27:01.487278+00:00' - sources: - original_entry: - - source_type: nde_csv_registry - data_tier: TIER_1_AUTHORITATIVE - claims_extracted: - - plaatsnaam_bezoekadres - - organisatie - - isil-code_na - - systeem - - versnellen - - collectie_nederland - - museum_register - - in_scope_voor_dc4eu - - dc4eu_aansluit_route - - wo2net - - modemuze - - oode24_mondriaan - - linked_data - - versnellen_project - - wikidata_id - - type - wikidata: - - source_type: wikidata_api - fetch_timestamp: '2025-11-27T16:32:57.126396+00:00' - api_endpoint: https://www.wikidata.org/w/rest.php/wikibase/v1 - entity_id: Q1820897 - claims_extracted: - - labels - - descriptions - - instance_of - - country - - located_in - - coordinates - - official_website - - claim_P527_has_part_s_ - - claim_commons_category - - claim_P646_freebase_id - - claim_P1174_visitors_per_year - - claim_P359_rijksmonument_id - - claim_P1612_commons_institution_page - - claim_P245_union_list_of_artist_names_id - - claim_P669_located_on_street - - claim_P935_commons_gallery - - claim_P1417_encyclop_dia_britannica_online_id - - claim_P1711_british_museum_person_or_institution_id - - claim_P2002_x__twitter__username - - claim_P2397_youtube_channel_id - - claim_P276_location - - claim_P1705_native_label - - claim_P4146_athenaeum_museum_id - - claim_P2847_google__id - - claim_P2851_payment_types_accepted - - claim_postal_code - - claim_phone - - claim_described_at_url - - claim_topic_category - - claim_P6155_sotheby_s_museum_network_id - - claim_street_address - - claim_P5208_bag_building_id - - claim_P6782_ror_id - - claim_P1343_described_by_source - - claim_P7561_category_for_the_interior_of_the_item - - claim_member_of - - claim_P1619_date_of_official_opening - - claim_P8519_rkd_thesaurus_id - - claim_P1687_main_wikidata_property - - claim_P8596_category_for_the_exterior_of_the_item - - claim_P8687_social_media_followers - - claim_P6698_japan_search_name_id - - claim_P7014_terms_of_service_url - - claim_P8189_national_library_of_israel_j9u_id - - claim_P2652_partnership_with - - claim_P5021_assessment - - claim_P166_award_received - - claim_P10419_lastdodo_area_id - - claim_P2283_uses - - claim_P8768_online_catalog_url - - claim_P1015_noraf_id - - claim_P8179_canadiana_name_authority_id - - claim_P271_nacsis_cat_author_id - - claim_P1207_nukat_id - - claim_P3065_rero_id__legacy_ - - claim_headquarters - - claim_P1365_replaces - - claim_P11496_cinii_research_id - - claim_P11693_openstreetmap_node_id - - claim_P12086_wikikids_id - - claim_P4839_wolfram_language_entity_code - - claim_P13591__yale_lux_id - - claim_P11245_youtube_handle - - claim_P5436_number_of_viewers_listeners - google_maps: - - source_type: google_maps_api - fetch_timestamp: '2025-11-28T09:54:52.009292+00:00' - api_endpoint: https://maps.googleapis.com/maps/api/place/textsearch - place_id: ChIJT9i3G8EJxkcR8mvIlXqnQXc - claims_extracted: - - coordinates - - formatted_address - - address_components - - business_status - - website - - phone - - rating - - reviews - - opening_hours - youtube: - - source_type: youtube_data_api - fetch_timestamp: '2025-12-03T12:49:37.601076+00:00' - api_endpoint: https://www.googleapis.com/youtube/v3 - channel_id: UCTSvV_dNJD5WUe3gd--PUDA - claims_extracted: - - channel_info - - subscriber_count - - video_count - - view_count - - recent_videos (421 videos) - - video_comments (72 comments from 41 videos) - genealogiewerkbalk: - - source_type: genealogiewerkbalk_registry - fetch_timestamp: '2025-12-03T13:50:38.987518+00:00' - data_url: https://docs.google.com/spreadsheets/d/1rS_Z5L6L2vvfGLS6eHI8wfyiwB-KUfHEr7W1VNY3rpg/export?format=csv - match_method: plaatsnaam_bezoekadres - claims_extracted: - - municipality_name - - municipality_code - - municipal_archive_name - - municipal_archive_website - - municipal_archive_isil - - province_name - - province_code - - provincial_archive_name - - provincial_archive_website - data_tier_summary: - TIER_1_AUTHORITATIVE: - - original_entry (NDE CSV) - TIER_2_VERIFIED: - - wikidata_api - - google_maps_api - - genealogiewerkbalk_registry - TIER_3_CROWD_SOURCED: [] - TIER_4_INFERRED: - - website_scrape - - exa_web_search - notes: - - Provenance tracking added retroactively - - claim_level_provenance available in sources section - - Canonical location normalized on 2025-12-09T12:54:07Z -qp_resolution_timestamp: '2025-11-27T20:16:10.283293+00:00' -google_maps_enrichment: - place_id: ChIJT9i3G8EJxkcR8mvIlXqnQXc - name: Amsterdam Museum - fetch_timestamp: '2025-11-28T09:54:52.009292+00:00' - api_status: OK - coordinates: - latitude: 52.365771699999996 - longitude: 4.9027821 - formatted_address: Amstel 51, 1018 EH Amsterdam - short_address: Amstel 51, Amsterdam - address_components: - - long_name: '51' - short_name: '51' - types: - - street_number - - long_name: Amstel - short_name: Amstel - types: - - route - - long_name: Amsterdam-Centrum - short_name: Amsterdam-Centrum - types: - - sublocality_level_1 - - sublocality - - political - - long_name: Amsterdam - short_name: Amsterdam - types: - - locality - - political - - long_name: Amsterdam - short_name: Amsterdam - types: - - administrative_area_level_2 - - political - - long_name: Noord-Holland - short_name: NH - types: - - administrative_area_level_1 - - political - - long_name: Nederland - short_name: NL - types: - - country - - political - - long_name: 1018 EH - short_name: 1018 EH - types: - - postal_code - phone_local: 020 523 1822 - phone_international: +31 20 523 1822 - website: https://www.amsterdammuseum.nl/ - google_place_types: - - tourist_attraction - - museum - - point_of_interest - - establishment - primary_type: museum - business_status: OPERATIONAL - opening_hours: - open_now: true - periods: - - open: - day: 0 - hour: 10 - minute: 0 - close: - day: 0 - hour: 17 - minute: 0 - - open: - day: 1 - hour: 10 - minute: 0 - close: - day: 1 - hour: 17 - minute: 0 - - open: - day: 2 - hour: 10 - minute: 0 - close: - day: 2 - hour: 17 - minute: 0 - - open: - day: 3 - hour: 10 - minute: 0 - close: - day: 3 - hour: 17 - minute: 0 - - open: - day: 4 - hour: 10 - minute: 0 - close: - day: 4 - hour: 17 - minute: 0 - - open: - day: 5 - hour: 10 - minute: 0 - close: - day: 5 - hour: 17 - minute: 0 - - open: - day: 6 - hour: 10 - minute: 0 - close: - day: 6 - hour: 17 - minute: 0 - weekday_text: - - 'maandag: 10:00–17:00' - - 'dinsdag: 10:00–17:00' - - 'woensdag: 10:00–17:00' - - 'donderdag: 10:00–17:00' - - 'vrijdag: 10:00–17:00' - - 'zaterdag: 10:00–17:00' - - 'zondag: 10:00–17:00' - rating: 4.3 - total_ratings: 6601 - reviews: - - author_name: John Bakkes - author_uri: https://www.google.com/maps/contrib/105322482956169165750/reviews - rating: 5 - relative_time_description: een maand geleden - text: Museum H'Art, vlak bij het Waterlooplein. Ik had er nog nooit van gehoord. Na het lezen van een recensie besloten - daar een kijkje te nemen. Het werd een bijzonder plezierige ervaring. Alleen al het enorme gebouw met de binnentuinen! - Een heerlijke oase van rust in de hectiek van de grote stad. Uren langs allerlei tentoonstellingen gezworven. Prima - gegeten in het ruime restaurant. Zeer de moeite waard. - publish_time: '2025-10-13T06:38:17.936936402Z' - - author_name: Emelly Velasco - author_uri: https://www.google.com/maps/contrib/113185846235304988457/reviews - rating: 5 - relative_time_description: 7 maanden geleden - text: 'Ik was aanwezig bij het VIP-evenement voor Amsterdamse vrouwen ter ere van het historisch archief van vrouwen in - Amsterdam, erg blij, ik voelde me vereerd en vergezeld, alle vrouwen zijn uniek, dapper en respectvol. - - Het personeel en het evenement waren zeer gevarieerd, met conferenties, workshops, toasts en persoonlijkheden van de - culturele samenleving in Nederland, nu meer dan ooit moeten we samenwerken mannen en vrouwen; het talent van vrouwen - benadrukken en er waarde aan geven.' - publish_time: '2025-04-08T13:05:59.974275Z' - - author_name: Loek van Bruggen - author_uri: https://www.google.com/maps/contrib/115373693363007151358/reviews - rating: 5 - relative_time_description: 7 maanden geleden - text: 'Voorheen Hermitage heeft nu de naam H art eigenlijk best leuk verzonnen. Naast de "reguliere" exposities heeft - museum een uitwisseling met centre Pompidu uit Parijs alwaar een schitterende hoeveelheid werk van Wassily Kandinsky - welk het museum van de weduwe van Kandisky geschonken heeft gekregen. - - Naast het mooie werk is er ook een bijzonder uitleg over het werk en zijn levensloop met verklaringen voor zijn ontwikkeling.Terug - kijkend naar die tijd en Kandinsky als mens en kunstenaar. De expositie geeft antwoorden op heel veel ontwikkelingen, - verklaring voor de soms zeer uitbundige kleuren en de kunstige manier van ontwerpen. Het werk van in Rusland gebleven kunstenaars, - die door hun werk dissident werden, stilistisch heel herkenbaar is Nukus Savetsky Museum in Oesbekistan te zien alwaar - een prachtige collectie te aanschouwen is. Deze expositie hier in Amsterdam is zeker de moeite waard en zeer leerzaam - en aan het einde ook diep ontroerend.' - publish_time: '2025-04-04T21:32:26.297286Z' - - author_name: REIS J.E. - author_uri: https://www.google.com/maps/contrib/101091208093846435374/reviews - rating: 4 - relative_time_description: 9 maanden geleden - text: Prima rustig museum. Bezocht op een zonnige zondag. De Ode aan de Vrouw tentoonstelling viel wel iets tegen. Verder - mooi museum. Zeer schoon sanitair. - publish_time: '2025-02-02T21:25:58.739050Z' - - author_name: ted bunnik - author_uri: https://www.google.com/maps/contrib/112779902616277178310/reviews - rating: 5 - relative_time_description: een jaar geleden - text: Fantastische lijn door het leven van Kandinsky gepresenteerd. Doordat je alle jaren zijn kunst en ontwikkeling kunt - volgen, maak je zelf favorieten aan . Zijn eerste kleuren en zijn grote schilderijen vlak na zijn Bauhaus periode,waren - mijn favoriete werken. Je wordt de schilderijen ingezogen. - publish_time: '2024-07-02T15:08:12.319849Z' - editorial_summary: Voormalig weeshuis met kunst, voorwerpen en interactieve exposities over de geschiedenis van de stad. - photo_urls: - - https://places.googleapis.com/v1/places/ChIJT9i3G8EJxkcR8mvIlXqnQXc/photos/AWn5SU57iEjmom_8HSGc0a-Jyu_9yRZe4Z5gWK3Il1sbF9cpIKEyNEag-LqR8lk0BMSFDna-tyHtBUtpBGLMgPLppF6qXtzJhFOC3JFmiVkJXa77JiPz7DcoP3z70D6VylbiquDG_8T3tqy-kMAP5s1LEirBBaGrVofBM0AAxiNE2qLh58ZLydvbPOLdC0XnUTBF53csy1apIu2C-xw9_-Uw_zWjda6Md_3weZjgZL0_wnwVnaKv0KmTE2S94y-mgqzEAYfpH6vtfzI1E03fJuZs7JSKt70ciHdWxNDYkGnpkpG5Ev-ZzpAqr_PAUq9SX4t0kpaNw7sqCfyLeZuxTxb1iezuPydSjnECddmt1RV7M41LZAMWIaE3E482Scu6ukED1GiIRnj53Yhch-RRDyLVWJ5jUIvwIjxmB7rKMbsLixLTLuY/media?maxWidthPx=800&key=AIzaSyAHuazNth9ZvfRFYk5-v49CwXwhABH8Ri0 - - https://places.googleapis.com/v1/places/ChIJT9i3G8EJxkcR8mvIlXqnQXc/photos/AWn5SU4IInSO_AGD7npiyprX9fmGSqhyBmy_EjCug7wLYuf8gJUl54SkjeXNvEgtoLbsGWsZR5Aua3E2ANlxtBGjSmpi2H9sjjR43fHHiEA1lN7N260qpppUAuyP3Dsrpw0SdrO-j11ucn4I9zFV6dz30BRWx38x8Jx62VCD6uXJoJXr_Vdhi50_GhPqviquytYAPISO7sqxy2tH3oTif9BgVJHBSg1WLcwhwy7gi_ZHUGI2WgbXvMuDBe_wCgIsidfDUCC_kzio9FvPVZK5cCxrMHhLnNfJYUus5D6W8HJHbtuyZ1vBU9yajM7XJnO_Ckl5itcF7yJDsoonfrHGzdVFTk5s2xJoI14q7KcCumxZMXNZst7qnjpv32_4M7w8Mw1MVR8FgDa_kFJPh3U51JYdWdrqvP3r32Varjtj5jG5DN5VcKdy/media?maxWidthPx=800&key=AIzaSyAHuazNth9ZvfRFYk5-v49CwXwhABH8Ri0 - - https://places.googleapis.com/v1/places/ChIJT9i3G8EJxkcR8mvIlXqnQXc/photos/AWn5SU5XhQPKtU9y6gNV7uhubHiJuk6j7Uf1rt-wGwHf7r9K3qjDnqzXbhEPKweMX3zYFKE0D_4_JHEOu5q24soOqTSPD9MeX0aewicJFcoFEyajrI6xQ7eCg8Uk9kZ9SCtObKpamgU45RkvItN8ROyE7Kt_T0zrp0w3SKuxtSPtY5bNfe8EXSqDTrjWa9WJULpTUMEjoAFHSbgb7y-J4aOVT3XkWWroGAoVF2_6ct4sFswdMye-8waQ4BlJ2sk8t-n0BkokO9yeTQuKSIHp6lczAmceuzHXLx6_6COZTpvxt7LftDV4HbuSewTY49VjJdSdAADa7qiE3KV4k_N7_8w3dTdWT64DVoCbiunPPhHx9dvFko9SpVmyvO-vTrXtnIP0Q4yv3t7ncYypms051LAbbRjN1vWng4q1vEfkGRd8U04mHA/media?maxWidthPx=800&key=AIzaSyAHuazNth9ZvfRFYk5-v49CwXwhABH8Ri0 - - https://places.googleapis.com/v1/places/ChIJT9i3G8EJxkcR8mvIlXqnQXc/photos/AWn5SU5HSqathKn9mw7eUQ8h2CKOaxfEP6-NFIC6T6NY9e_jFX98FFwNE9OMvtmUZ3JbK0GP3LovN_KmKynIfkPbvMd4l3BIdxdWbIr-9o2Syy6os5vspPL1fRZ_mGSUpr3Fr1oIlywbTeG7kewvshGoA4OeVheUQuAo3TXM4KvEfEHXQQUEo3pqlpKh2D3iAs5rrWkkxWFezJkI6UurxlXWHJummlRZm6kmVIeYYi58opIpjtGlCshOZFPtXcg6u0be7fDoB_pXM4uSx8hNqt2uatuH_5jPtuMUZHqhWLd_fdgGXZPws6631-1mujHhCqpoAQ0X2THHpDdpIWP7xwGwsMLjsQeuHCKLro-3pAUIOnV6nPbZF6RyBjEKq1TuEG5C7xPnZ6VG772j-gARuzInig80yFYVcohR5P4p9DdseJOpMVIh/media?maxWidthPx=800&key=AIzaSyAHuazNth9ZvfRFYk5-v49CwXwhABH8Ri0 - - https://places.googleapis.com/v1/places/ChIJT9i3G8EJxkcR8mvIlXqnQXc/photos/AWn5SU4sWQ2uxYOD6IvhTMCULYs2OHkKCF9-vhcQomcNv24wJdL3YMwn3RFB6JNDxUjaTBpFwdB9SFOAi3uRI99yizuVwX8ytoiHe0FLJmpVeCNaoSm2vPBIIt_CpGjQr1cgYH3jjpNs2-6Bdr9D6qE3Fm2LIdKLgHmZCJi4qBXyiAL89L-WShj51pgT1uFYbNEcteR8weDVLk0Tz2efum_9Lsflx6q6HH0_RT-kYawAhpKptmJGpKnjwt5Z2G4xFaggZFPnLfb5Ck8BL7C1k5nySZIL2l2eptwlXTdId4QNyUBWyiQQWYNEu2C93D3TfCopDKdf5QNJUSbJBjWaWW64OwSN3or9oNgcjECGtiAuP1eNDdvMUT06sozfvCN87pFF85qjJKY6BiR9cb3GR4D1ZNRpH8GrXjGGzwvc3fca3mAHkg/media?maxWidthPx=800&key=AIzaSyAHuazNth9ZvfRFYk5-v49CwXwhABH8Ri0 - photos_metadata: - - name: places/ChIJT9i3G8EJxkcR8mvIlXqnQXc/photos/AWn5SU57iEjmom_8HSGc0a-Jyu_9yRZe4Z5gWK3Il1sbF9cpIKEyNEag-LqR8lk0BMSFDna-tyHtBUtpBGLMgPLppF6qXtzJhFOC3JFmiVkJXa77JiPz7DcoP3z70D6VylbiquDG_8T3tqy-kMAP5s1LEirBBaGrVofBM0AAxiNE2qLh58ZLydvbPOLdC0XnUTBF53csy1apIu2C-xw9_-Uw_zWjda6Md_3weZjgZL0_wnwVnaKv0KmTE2S94y-mgqzEAYfpH6vtfzI1E03fJuZs7JSKt70ciHdWxNDYkGnpkpG5Ev-ZzpAqr_PAUq9SX4t0kpaNw7sqCfyLeZuxTxb1iezuPydSjnECddmt1RV7M41LZAMWIaE3E482Scu6ukED1GiIRnj53Yhch-RRDyLVWJ5jUIvwIjxmB7rKMbsLixLTLuY - height: 2736 - width: 3648 - author_attributions: - - displayName: Giuseppe Cosentino - uri: https://maps.google.com/maps/contrib/109028187688090885577 - photoUri: https://lh3.googleusercontent.com/a-/ALV-UjUxcP0n5tq0JAPss2_rMH_NZBjZXXoVPPsi82p5ae7X3vc7hyzbpw=s100-p-k-no-mo - - name: places/ChIJT9i3G8EJxkcR8mvIlXqnQXc/photos/AWn5SU4IInSO_AGD7npiyprX9fmGSqhyBmy_EjCug7wLYuf8gJUl54SkjeXNvEgtoLbsGWsZR5Aua3E2ANlxtBGjSmpi2H9sjjR43fHHiEA1lN7N260qpppUAuyP3Dsrpw0SdrO-j11ucn4I9zFV6dz30BRWx38x8Jx62VCD6uXJoJXr_Vdhi50_GhPqviquytYAPISO7sqxy2tH3oTif9BgVJHBSg1WLcwhwy7gi_ZHUGI2WgbXvMuDBe_wCgIsidfDUCC_kzio9FvPVZK5cCxrMHhLnNfJYUus5D6W8HJHbtuyZ1vBU9yajM7XJnO_Ckl5itcF7yJDsoonfrHGzdVFTk5s2xJoI14q7KcCumxZMXNZst7qnjpv32_4M7w8Mw1MVR8FgDa_kFJPh3U51JYdWdrqvP3r32Varjtj5jG5DN5VcKdy - height: 4032 - width: 3024 - author_attributions: - - displayName: Summer Lee - uri: https://maps.google.com/maps/contrib/106979114507181990212 - photoUri: https://lh3.googleusercontent.com/a-/ALV-UjVLMVkDBApYZWmD67xCDzMBLpX_IoOHtZWRHTr1RhjxaHF3nlNFeA=s100-p-k-no-mo - - name: places/ChIJT9i3G8EJxkcR8mvIlXqnQXc/photos/AWn5SU5XhQPKtU9y6gNV7uhubHiJuk6j7Uf1rt-wGwHf7r9K3qjDnqzXbhEPKweMX3zYFKE0D_4_JHEOu5q24soOqTSPD9MeX0aewicJFcoFEyajrI6xQ7eCg8Uk9kZ9SCtObKpamgU45RkvItN8ROyE7Kt_T0zrp0w3SKuxtSPtY5bNfe8EXSqDTrjWa9WJULpTUMEjoAFHSbgb7y-J4aOVT3XkWWroGAoVF2_6ct4sFswdMye-8waQ4BlJ2sk8t-n0BkokO9yeTQuKSIHp6lczAmceuzHXLx6_6COZTpvxt7LftDV4HbuSewTY49VjJdSdAADa7qiE3KV4k_N7_8w3dTdWT64DVoCbiunPPhHx9dvFko9SpVmyvO-vTrXtnIP0Q4yv3t7ncYypms051LAbbRjN1vWng4q1vEfkGRd8U04mHA - height: 2736 - width: 3648 - author_attributions: - - displayName: Yosi Weiss - uri: https://maps.google.com/maps/contrib/109454548149993783774 - photoUri: https://lh3.googleusercontent.com/a-/ALV-UjWF4Af96QZ1cqF_nAofaq2Llg3Gh7iFH55zyc2oQe5p2UdM_ZRm5Q=s100-p-k-no-mo - - name: places/ChIJT9i3G8EJxkcR8mvIlXqnQXc/photos/AWn5SU5HSqathKn9mw7eUQ8h2CKOaxfEP6-NFIC6T6NY9e_jFX98FFwNE9OMvtmUZ3JbK0GP3LovN_KmKynIfkPbvMd4l3BIdxdWbIr-9o2Syy6os5vspPL1fRZ_mGSUpr3Fr1oIlywbTeG7kewvshGoA4OeVheUQuAo3TXM4KvEfEHXQQUEo3pqlpKh2D3iAs5rrWkkxWFezJkI6UurxlXWHJummlRZm6kmVIeYYi58opIpjtGlCshOZFPtXcg6u0be7fDoB_pXM4uSx8hNqt2uatuH_5jPtuMUZHqhWLd_fdgGXZPws6631-1mujHhCqpoAQ0X2THHpDdpIWP7xwGwsMLjsQeuHCKLro-3pAUIOnV6nPbZF6RyBjEKq1TuEG5C7xPnZ6VG772j-gARuzInig80yFYVcohR5P4p9DdseJOpMVIh - height: 2700 - width: 4800 - author_attributions: - - displayName: Olivier Lourdais - uri: https://maps.google.com/maps/contrib/109203461498797743504 - photoUri: https://lh3.googleusercontent.com/a-/ALV-UjVydD4qa2HNX3D_si6o2KR7Jy9HMWgxOeFUal2-q6xXhfWXpLDT=s100-p-k-no-mo - - name: places/ChIJT9i3G8EJxkcR8mvIlXqnQXc/photos/AWn5SU4sWQ2uxYOD6IvhTMCULYs2OHkKCF9-vhcQomcNv24wJdL3YMwn3RFB6JNDxUjaTBpFwdB9SFOAi3uRI99yizuVwX8ytoiHe0FLJmpVeCNaoSm2vPBIIt_CpGjQr1cgYH3jjpNs2-6Bdr9D6qE3Fm2LIdKLgHmZCJi4qBXyiAL89L-WShj51pgT1uFYbNEcteR8weDVLk0Tz2efum_9Lsflx6q6HH0_RT-kYawAhpKptmJGpKnjwt5Z2G4xFaggZFPnLfb5Ck8BL7C1k5nySZIL2l2eptwlXTdId4QNyUBWyiQQWYNEu2C93D3TfCopDKdf5QNJUSbJBjWaWW64OwSN3or9oNgcjECGtiAuP1eNDdvMUT06sozfvCN87pFF85qjJKY6BiR9cb3GR4D1ZNRpH8GrXjGGzwvc3fca3mAHkg - height: 4032 - width: 3024 - author_attributions: - - displayName: Ervin Zarka - uri: https://maps.google.com/maps/contrib/110685045108809791223 - photoUri: https://lh3.googleusercontent.com/a-/ALV-UjXmc9Q7-ORnhT65FQ8XXgv7fH6sXq4EpiZs1wn_7Bz8zctQ9Dvw4A=s100-p-k-no-mo - google_maps_url: https://maps.google.com/?cid=8593333708940405746&g_mp=Cidnb29nbGUubWFwcy5wbGFjZXMudjEuUGxhY2VzLlNlYXJjaFRleHQQAhgEIAA - street_view_url: https://maps.googleapis.com/maps/api/streetview?size=600x400&location=52.365771699999996,4.9027821&key=AIzaSyAHuazNth9ZvfRFYk5-v49CwXwhABH8Ri0 - icon_mask_uri: https://maps.gstatic.com/mapfiles/place_api/icons/v2/museum_pinlet - icon_background_color: '#13B5C7' - utc_offset_minutes: 60 -google_maps_status: SUCCESS -google_maps_search_query: Amsterdam Museum, Amsterdam, Netherlands -web_enrichment: - web_archives: - - url: http://amsterdammuseum.nl/ - directory: web/0616/amsterdammuseum.nl - pages_archived: 1 - archive_method: wget_warc_deep - warc_file: archive.warc.gz - warc_size_bytes: 67015 - warc_format: ISO 28500 - full_site_archive_timestamp: '2025-11-29T16:45:46.905183+00:00' -nan_isil_enrichment: - source: Nationaal Archief ISIL Registry - source_file: ISIL-codes_2025-11-06.yaml - source_url: https://www.nationaalarchief.nl/isil - data_tier: TIER_1_AUTHORITATIVE - extraction_date: '2025-11-17T12:27:31.711541+00:00' - enrichment_timestamp: '2025-11-30T09:57:00.894497+00:00' - enrichment_method: fuzzy_name_city_match - match_confidence: 1.0 - isil_code: NL-AsdAM - nan_name: Amsterdam Museum - nan_city: Amsterdam - nan_toegekend_op: '2023-05-16' - nan_opmerking: '' -identifiers: -- identifier_scheme: ISIL - identifier_value: NL-AsdAM - identifier_url: https://isil.org/NL-AsdAM - assigned_date: '2023-05-16' - source: Nationaal Archief ISIL Registry 2025-11-06 -- identifier_scheme: GHCID - identifier_value: NL-NH-AMS-M-AM -- identifier_scheme: GHCID_UUID - identifier_value: 02715b37-ba12-53d3-85e1-f1d1ace471c4 - identifier_url: urn:uuid:02715b37-ba12-53d3-85e1-f1d1ace471c4 -- identifier_scheme: GHCID_UUID_SHA256 - identifier_value: 9ff616db-797d-845a-a698-a0643f148262 - identifier_url: urn:uuid:9ff616db-797d-845a-a698-a0643f148262 -- identifier_scheme: GHCID_NUMERIC - identifier_value: '11526425428193301594' -- identifier_scheme: RECORD_ID - identifier_value: 019adf94-6c5a-754b-97fb-13fb96e817a8 - identifier_url: urn:uuid:019adf94-6c5a-754b-97fb-13fb96e817a8 -museum_register_enrichment: - museum_name: Amsterdam Museum - website_url: https://www.amsterdammuseum.nl/ - province: Noord-Holland - registered_since: '2003-05-14' - source_provenance: - source_file: data/museum_register_nl/museumregister_nederland_20251130.yaml - source_url: https://www.museumregisternederland.nl/register-bekijken - scrape_timestamp: '2025-11-30T12:28:03.607528+00:00' - source_page: 1 - enrichment_timestamp: '2025-11-30T12:47:13.283754+00:00' +custodian_name: + emic_name: Ajax Museum + emic_name_source: linkedin +institution_type: +- M +linkedin_enrichment: + linkedin_url: https://www.linkedin.com/company/ajax-museum + linkedin_slug: ajax-museum + industry: Museums, Historical Sites, and Zoos + website: https://lnkd.in/ezz5r9nF + follower_count: 5,707 + staff_count: 1 + heritage_staff_count: 0 + heritage_staff: [] + enrichment_timestamp: '2025-12-16T21:06:39.152742+00:00' + provenance: + source: linkedin_company_scrape + original_file: data/custodian/linkedin/ajax-museum.yaml + schema_version: 1.0.0 +location: + city: Amsterdam + region: Noord-Holland + country: NL + address: Johan Cruijff Boulevard 1, 1101 AX Amsterdam ghcid: ghcid_current: NL-NH-AMS-M-AM - ghcid_original: NL-NH-AMS-M-AM + ghcid_original: NL-XX-XXX-M-AM ghcid_uuid: 02715b37-ba12-53d3-85e1-f1d1ace471c4 ghcid_uuid_sha256: 9ff616db-797d-845a-a698-a0643f148262 ghcid_numeric: 11526425428193301594 - record_id: 019adf94-6c5a-754b-97fb-13fb96e817a8 - generation_timestamp: '2025-12-02T14:56:45.615377+00:00' + record_id: 1bbc810e-b76d-4d89-8351-99e851dae39f + generation_timestamp: '2025-12-16T21:06:39.152742+00:00' ghcid_history: + - ghcid: NL-XX-XXX-M-AM + ghcid_numeric: 17454030815792942048 + valid_from: '2025-12-16T21:06:39.152742+00:00' + valid_to: '2025-12-17T09:33:15.742206+00:00' + reason: Initial GHCID assignment from LinkedIn batch import - ghcid: NL-NH-AMS-M-AM ghcid_numeric: 11526425428193301594 - valid_from: '2025-12-02T14:56:45.615377+00:00' + valid_from: '2025-12-17T09:33:15.742206+00:00' valid_to: null - reason: GHCID regenerated with Google Maps locality fix (Dec 2025) + reason: Location enriched via Exa web search - Amsterdam, Noord-Holland location_resolution: - method: GOOGLE_MAPS_LOCALITY - google_maps_locality: Amsterdam - geonames_id: 2759794 - geonames_name: Amsterdam - feature_code: PPLC - population: 741636 - admin1_code: '07' + method: EXA_WEB_SEARCH + city_code: AMS + city_name: Amsterdam region_code: NH + region_name: Noord-Holland country_code: NL - source_coordinates: - latitude: 52.365771699999996 - longitude: 4.9027821 - source: google_maps - geonames_id: 2759794 -web_claims: - extraction_timestamp: '2025-12-02T08:44:05.296866+00:00' - source_archive: web/0616/amsterdammuseum.nl - claims_count: 19 - claims: - - claim_type: org_name - claim_value: Amsterdam Museum - raw_value: Amsterdam Museum - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/head/title - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: title_tag - extraction_timestamp: '2025-12-02T08:44:05.223554+00:00' - - claim_type: description_short - claim_value: Ontdek Amsterdam opnieuw in de tijdelijke locatie Amsterdam Museum aan de Amstel. - raw_value: Ontdek Amsterdam opnieuw in de tijdelijke locatie Amsterdam Museum aan de Amstel. - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/head/meta[4] - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: meta_description - extraction_timestamp: '2025-12-02T08:44:05.224503+00:00' - - claim_type: email - claim_value: '%20webredactie@amsterdammuseum.nl' - raw_value: '%20webredactie@amsterdammuseum.nl' - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/body/div/div/main/div[3]/div/div[8]/div/div/div[2]/div/p/a - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: mailto_link - extraction_timestamp: '2025-12-02T08:44:05.225612+00:00' - - claim_type: social_instagram - claim_value: https://www.instagram.com/amsterdammuseum/ - raw_value: https://www.instagram.com/amsterdammuseum/ - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/body/div/footer/div[1]/div[2]/div[1]/ul/li[1]/a - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: social_link - extraction_timestamp: '2025-12-02T08:44:05.226006+00:00' - - claim_type: social_facebook - claim_value: https://www.facebook.com/amsterdammuseum - raw_value: https://www.facebook.com/amsterdammuseum - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/body/div/footer/div[1]/div[2]/div[1]/ul/li[2]/a - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: social_link - extraction_timestamp: '2025-12-02T08:44:05.226016+00:00' - - claim_type: social_twitter - claim_value: https://twitter.com/amsterdammuseum - raw_value: https://twitter.com/amsterdammuseum - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/body/div/footer/div[1]/div[2]/div[1]/ul/li[3]/a - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: social_link - extraction_timestamp: '2025-12-02T08:44:05.226023+00:00' - - claim_type: social_youtube - claim_value: https://www.youtube.com/@AmsterdamMuseum1 - raw_value: https://www.youtube.com/@AmsterdamMuseum1 - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/body/div/footer/div[1]/div[2]/div[1]/ul/li[4]/a - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: social_link - extraction_timestamp: '2025-12-02T08:44:05.226029+00:00' - - claim_type: social_tiktok - claim_value: https://www.tiktok.com/@amsterdam_museum - raw_value: https://www.tiktok.com/@amsterdam_museum - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/body/div/footer/div[1]/div[2]/div[1]/ul/li[6]/a - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: social_link - extraction_timestamp: '2025-12-02T08:44:05.226038+00:00' - - claim_type: gallery_detected - claim_value: slider - raw_value: 'slider: 4 elements' - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/body/div/div/main/div[3]/div/div[1]/div/div[2]/div/div - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 0.85 - extraction_method: gallery_pattern - extraction_timestamp: '2025-12-02T08:44:05.244801+00:00' - - claim_type: gallery_detected - claim_value: swiper - raw_value: 'swiper: 40 elements' - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/body/div/div/main/div[3]/div/div[1]/div/div[1]/div[1]/div[2]/button[1] - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 0.85 - extraction_method: gallery_pattern - extraction_timestamp: '2025-12-02T08:44:05.244832+00:00' - - claim_type: image_count - claim_value: '23' - raw_value: 23 images in slider container - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/body/div/div/main/div[3]/div/div[1]/div/div[2]/div/div - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 0.8 - extraction_method: gallery_image_count - extraction_timestamp: '2025-12-02T08:44:05.246187+00:00' - - claim_type: page_title - claim_value: Amsterdam Museum - raw_value: Amsterdam Museum - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/head/title - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: title_tag_full - extraction_timestamp: '2025-12-02T08:44:05.246678+00:00' - - claim_type: favicon - claim_value: /images/favicon/favicon-196x196.png - raw_value: sizes=196x196, type=image/png - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/head/link[15] - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: favicon_link - extraction_timestamp: '2025-12-02T08:44:05.246789+00:00' - - claim_type: favicon - claim_value: /images/favicon/favicon-96x96.png - raw_value: sizes=96x96, type=image/png - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/head/link[16] - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: favicon_link - extraction_timestamp: '2025-12-02T08:44:05.246800+00:00' - - claim_type: favicon - claim_value: /images/favicon/favicon-32x32.png - raw_value: sizes=32x32, type=image/png - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/head/link[17] - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: favicon_link - extraction_timestamp: '2025-12-02T08:44:05.246808+00:00' - - claim_type: favicon - claim_value: /images/favicon/favicon-16x16.png - raw_value: sizes=16x16, type=image/png - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/head/link[18] - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: favicon_link - extraction_timestamp: '2025-12-02T08:44:05.246816+00:00' - - claim_type: favicon - claim_value: /images/favicon/favicon-128.png - raw_value: sizes=128x128, type=image/png - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/head/link[19] - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: favicon_link - extraction_timestamp: '2025-12-02T08:44:05.246824+00:00' - - claim_type: logo - claim_value: /images/footer-supporters/vriendenloterij_logo_black.png - raw_value: alt=Vriendenloterij - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/body/div/footer/div[1]/div[2]/div[2]/ul/li[2]/img - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 1.0 - extraction_method: logo_img_attr - extraction_timestamp: '2025-12-02T08:44:05.247493+00:00' - - claim_type: logo - claim_value: https://assets.amsterdammuseum.nl/images/transforms/_1200x630_crop_center-center_none/Frame-1753787098.png - raw_value: https://assets.amsterdammuseum.nl/images/transforms/_1200x630_crop_center-center_none/Frame-1753787098.png - source_url: http://amsterdammuseum.nl/ - retrieved_on: '2025-11-29T16:45:46.872757+00:00' - xpath: /html/head/meta[7] - html_file: web/0616/amsterdammuseum.nl/pages/index.html - xpath_match_score: 0.7 - extraction_method: og_image - extraction_timestamp: '2025-12-02T08:44:05.249159+00:00' -custodian_name: - claim_type: custodian_name - claim_value: Amsterdam Museum - source: wikidata - confidence: 0.907 - consensus_method: true - sources_checked: 5 - sources_matched: 5 - extraction_timestamp: '2025-12-02T13:07:55.571626+00:00' - matching_sources: - - source: google_maps - name: Amsterdam Museum - score: 1.0 - - source: nan_isil - name: Amsterdam Museum - score: 1.0 - - source: original_entry - name: Amsterdam Museum - score: 1.0 - - source: web_title_tag - name: Amsterdam Museum - score: 1.0 - emic_name: Amsterdam Museum - name_language: nl - standardized_name: Amsterdam Museum -youtube_enrichment: - correction_note: 'CORRECTION APPLIED 2024-12-16: Removed 421 videos from wrong channel "Robert Pennekamp" - - (UCTSvV_dNJD5WUe3gd--PUDA). Robert Pennekamp is a contemporary artist whose personal - - art installation and punk rock videos were incorrectly associated with Amsterdam Museum. - - The youtube_channel_id field also contained a wrong channel (UCmGzfZNyTQ5LC3GotRGmd0w). - - Replaced with reference to official Amsterdam Museum YouTube channel. - - ' - status: CORRECTED - correction_date: '2024-12-16' - original_wrong_channels: - - channel_id: UCTSvV_dNJD5WUe3gd--PUDA - channel_name: Robert Pennekamp - video_count: 421 - why_wrong: Personal artist channel - videos about art installations, punk rock, personal projects unrelated to the museum - - channel_id: UCmGzfZNyTQ5LC3GotRGmd0w - why_wrong: Unknown channel incorrectly listed as youtube_channel_id - correct_channel: - channel_handle: '@AmsterdamMuseum1' - channel_name: Amsterdam Museum - channel_url: https://www.youtube.com/@AmsterdamMuseum1 - subscriber_count_approx: 1780 - verification_method: Manual search and content verification - verification_date: '2024-12-16' - verified_videos_from_correct_channel: - - video_id: m8SH5o8fbgA - title: This city is a museum - view_count_approx: 162000 - published_date: '2024-09-03' - verification_note: Official Amsterdam Museum promotional video - - video_id: 8bw-jsBDDck - title: Manahahtáanung or New Amsterdam? Introduction video - view_count_approx: 1048 - verification_note: Educational content about Amsterdam history - third_party_videos_about_organization: [] - videos_count: 0 - videos: [] -genealogiewerkbalk_enrichment: - source: Genealogiewerkbalk.nl Municipality Archives Registry - source_url: https://www.genealogiewerkbalk.nl/archieven.html - data_url: https://docs.google.com/spreadsheets/d/1rS_Z5L6L2vvfGLS6eHI8wfyiwB-KUfHEr7W1VNY3rpg/export?format=csv - data_tier: TIER_2_VERIFIED - enrichment_timestamp: '2025-12-03T13:50:38.987500+00:00' - match_method: plaatsnaam_bezoekadres - match_confidence: 1.0 - municipality: - name: Amsterdam - code: '363' - municipal_archive: - name: Stadsarchief Amsterdam - website: https://archief.amsterdam/ - isil: NL-AsdSAA - province: - name: Noord-Holland - code: '27' - provincial_archive: - name: Noord-Hollands Archief - website: https://noord-hollandsarchief.nl/ -digital_platforms: -- platform_name: Amsterdam Museum Website - platform_url: http://amsterdammuseum.nl/ - platform_type: WEBSITE - platform_category: - - Organizational website - digital_collections: municipal museum in Amsterdam, Netherlands - technology_stack: Axiell Collections? - data_standards: - - HTML5 - user_services: Exhibition information, Visit planning, Contact - sustainability_model: Institutional funding - enrichment_timestamp: '2025-12-05T11:19:13.334862+00:00' - source_method: automated_extraction -unesco_ich_enrichment: - country_code: NL - total_elements_in_country: 5 - enrichment_timestamp: '2025-12-06T20:20:35.969097+00:00' - elements: - - unesco_ich_id: '1870' - name: Rotterdam Summer Carnival - list_type: RL - list_name: Representative List of the Intangible Cultural Heritage of Humanity - inscription_year: 2023 - multinational: false - url: https://ich.unesco.org/en/RL/rotterdam-summer-carnival-01870 - description: The Rotterdam Summer Carnival is a multicultural celebration that unites participants from the Caribbean - and European Netherlands, as well as ethnic minority groups from Central and South America and Africa living in the - Netherlands. The event includes a street parade, a brass band competition and a... - - unesco_ich_id: '1979' - name: 'Traditional irrigation: knowledge, technique, and organization' - list_type: RL - list_name: Representative List of the Intangible Cultural Heritage of Humanity - inscription_year: 2023 - multinational: true - url: https://ich.unesco.org/en/RL/traditional-irrigation-knowledge-technique-and-organization-01979 - description: Traditional irrigation uses gravity and hand-made constructions such as channels and ditches to distribute - water from naturally-occurring water catchment points (such as springs, streams and glaciers) to the fields. Practitioners - choose specific days and periods to manually divert the water, and the... - - unesco_ich_id: '1707' - name: Corso culture, flower and fruit parades in the Netherlands - list_type: RL - list_name: Representative List of the Intangible Cultural Heritage of Humanity - inscription_year: 2021 - multinational: false - url: https://ich.unesco.org/en/RL/corso-culture-flower-and-fruit-parades-in-the-netherlands-01707 - description: Dating back to the late nineteenth century, a corso is an annual parade of floats or boats decorated with - flowers, fruit, vegetables and, in some cases, people in costumes. Originating in the south of France and Italy, the - practice spread to the Netherlands in the nineteenth century. The parade take... - - unesco_ich_id: '1708' - name: Falconry, a living human heritage - list_type: RL - list_name: Representative List of the Intangible Cultural Heritage of Humanity - inscription_year: 2021 - multinational: true - url: https://ich.unesco.org/en/RL/falconry-a-living-human-heritage-01708 - description: Falconry is the traditional art and practice of training and flying falcons (and sometimes eagles, hawks, - buzzards and other birds of prey). It has been practised for over 4000 years. The practice of falconry in early and - medieval periods of history is documented in many parts of the world. Original... - - unesco_ich_id: '1265' - name: Craft of the miller operating windmills and watermills - list_type: RL - list_name: Representative List of the Intangible Cultural Heritage of Humanity - inscription_year: 2017 - multinational: false - url: https://ich.unesco.org/en/RL/craft-of-the-miller-operating-windmills-and-watermills-01265 - description: The craft of the miller operating windmills and watermills involves the knowledge and skills necessary to - operate a mill and maintain it in a good state of repair. With a declining number of people earning their livelihood - from the craft, millers today also play a key role in transmitting the cultur... -unesco_mow_enrichment: - match_method: wikidata_id_direct - custodian_wikidata_id: Q1820897 - total_inscriptions_held: 1 - enrichment_timestamp: '2025-12-06T20:47:28.679546+00:00' - inscriptions: - - wikidata_id: Q135028459 - name: 'DDS: De Digitale Stad / The Digital City' - description: Memory of the World international register inscription, added 2023 - country: Netherlands - inscription_year: null - wikidata_url: http://www.wikidata.org/entity/Q135028459 - unesco_mow_url: https://www.unesco.org/en/memory-world - image_url: '' -timespan: - begin_of_the_begin: '1926-01-01T00:00:00Z' - end_of_the_begin: '1926-12-31T00:00:00Z' - begin_of_the_end: null - end_of_the_end: null + resolution_date: '2025-12-17T09:33:15.742206+00:00' + source_url: https://www.johancruijffarena.nl/ +provenance: + schema_version: 1.0.0 + generated_at: '2025-12-16T21:06:39.152742+00:00' sources: - - 'Wikidata P571 (inception): https://www.wikidata.org/wiki/Q1820897' - notes: Amsterdam Museum (formerly Amsterdams Historisch Museum) founded in 1926 -location: - latitude: 52.365771699999996 - longitude: 4.9027821 - coordinate_provenance: - source_type: GOOGLE_MAPS - source_path: google_maps_enrichment.coordinates - original_timestamp: '2025-11-28T09:54:52.009292+00:00' - entity_id: ChIJT9i3G8EJxkcR8mvIlXqnQXc - api_endpoint: https://maps.googleapis.com/maps/api/place/textsearch - city: Amsterdam - region: Noord-Holland - region_code: NH - country: NL - postal_code: 1018 EH - street_address: Amstel 51, Amsterdam - formatted_address: Amstel 51, 1018 EH Amsterdam - geonames_id: 2759794 - geonames_name: Amsterdam - feature_code: PPLC - normalization_timestamp: '2025-12-09T12:54:07.337678+00:00' -validated_entity_claims: - extraction_timestamp: '2025-12-13T19:45:14.578676+00:00' - extraction_method: hybrid_llm_pattern_layout_v1 - confidence_threshold: 0.6 - entities_count: 5 - cleanup_applied: '2025-12-13T19:49:31.077328+00:00' - claims: - - entity: Amsterdam Museum - entity_type: GRP.HER - xpath: /html/head/title - base_confidence: 0.95 - layout_score: 0.2 - pattern_score: 0.15 - final_confidence: 1.0 - layout_match: high_conf:head/title - - entity: Amsterdam - entity_type: TOP.SET - xpath: /html/head/meta[@name='description']/@content - base_confidence: 0.9 - layout_score: 0.0 - pattern_score: 0.15 - final_confidence: 1.0 - wikidata_id: Q9899 - wikidata_label: Amsterdam - - entity: https://www.amsterdammuseum.nl/ - entity_type: APP.URL - xpath: /html/head/link[@rel='canonical']/@href - base_confidence: 1.0 - layout_score: 0.0 - pattern_score: 0.0 - final_confidence: 1.0 - - entity: https://assets.amsterdammuseum.nl/images/transforms/_1200x630_crop_center-center_none/Frame-1753787098.png - entity_type: APP.URL - xpath: /html/head/meta[@property='og:image']/@content - base_confidence: 1.0 - layout_score: 0.0 - pattern_score: 0.0 - final_confidence: 1.0 - - entity: Amstel - entity_type: TOP.NAT - xpath: /html/head/meta[@name='description']/@content - base_confidence: 0.85 - layout_score: 0.0 - pattern_score: 0.0 - final_confidence: 0.85 - wikidata_linking_timestamp: '2025-12-13T22:07:37.065230' -crawl4ai_enrichment: - retrieval_timestamp: '2025-12-14T17:56:29.415924+00:00' - retrieval_agent: crawl4ai - source_url: https://www.amsterdammuseum.nl/ - status_code: null - error: Crawl failed with status None -digital_platform_v2: - transformation_metadata: - transformed_from: httpx_beautifulsoup - transformation_date: '2025-12-14T23:01:35.936361+00:00' - transformation_version: '2.1' - source_status_code: 200 - primary_platform: - platform_id: primary_website_amsterdammuseum_nl - platform_name: Amsterdam Museum Website - platform_url: https://www.amsterdammuseum.nl/ - platform_type: DISCOVERY_PORTAL - description: Als netwerkmuseum trekt het Amsterdam Museum de stad in met tentoonstellingen, publieksprogramma's, evenementen - en stadsbrede samenwerkingen, samen met partners - language: nl - og_image: null - favicon: https://www.amsterdammuseum.nl/images/favicon/favicon-196x196.png - navigation_links: - - https://www.amsterdammuseum.nl/ - - https://www.amsterdammuseum.nl/tentoonstelling/huis-willet-holthuysen/9511 - - https://www.amsterdammuseum.nl/tentoonstelling/amsterdam-in-motion/228607 - - https://www.amsterdammuseum.nl/tentoonstelling/koopman-met-tattoo/243269 - - https://www.amsterdammuseum.nl/tentoonstelling/nederland-word-beter/238143 - - https://www.amsterdammuseum.nl/tentoonstelling/boost/237194 - - https://www.amsterdammuseum.nl/tickets-bezoek - - https://www.amsterdammuseum.nl/nieuws/winnaars-open-call-refresh-amsterdam-3-imagine-the-future-bekend/245842 - - https://www.amsterdammuseum.nl/nieuws/wereldvondst-tatoeage-op-17e-eeuws-amsterdams-groepsportret/243085 - - https://www.amsterdammuseum.nl/nieuws/topstukken-amsterdam-museum-nu-te-zien-in-rijksmuseum/237237 - - https://www.amsterdammuseum.nl/nieuws/raquel-van-haver-benoemd-tot-ridder-in-de-orde-van-de-nederlandse-leeuw/244974 - - https://www.amsterdammuseum.nl/en/het-nieuwe-amsterdam-museum - - https://www.amsterdammuseum.nl/samenwerkingsproject/am-talent/86191 - - https://www.amsterdammuseum.nl/samenwerkingsproject/elja-kindermuseumlab/57572 - - https://www.amsterdammuseum.nl/samenwerkingsproject/collecting-the-city/82990 - - https://www.amsterdammuseum.nl/samenwerkingsproject/alliantie-acties-voor-zichtbaarheid/91596 - - https://www.amsterdammuseum.nl/nieuwsbrief -person_observations: - observation_metadata: - retrieval_agent: linkedin_html_parser - retrieval_timestamp: '2025-12-15T09:50:03Z' - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - html_file: null - staff_count_total: 160 - staff_count_extracted: 162 - staff_count_with_linkedin: 0 - staff_count_heritage_relevant: 127 - staff: - - person_id: amsterdam-museum_staff_0001_anna_martens - person_name: Anna Martens - role_title: Educatie en tentoonstellingen - heritage_relevant: true - heritage_type: E - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0002_emma_van_bijnen_phd - person_name: Emma van Bijnen, PhD - role_title: Research and Publications Coordinator | Editor-in-Chief - heritage_relevant: true - heritage_type: R - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0003_laura_van_hasselt - person_name: Laura Van Hasselt - role_title: Researcher and lecturer at University of Amsterdam - heritage_relevant: true - heritage_type: R - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0004_tim_verlaan - person_name: Tim Verlaan - role_title: Assistant Professor at University of Amsterdam - heritage_relevant: true - heritage_type: E - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0005_dorine_maat - person_name: Dorine Maat - role_title: Conservator Stadsgeschiedenis bij Museum Flehite - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0006_sophie_boven - person_name: Sophie Boven - role_title: Collectiemanagement | Registrar | Tentoonstellingscoördinator - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0007_denise_van_der_vegt - person_name: Denise van der Vegt - role_title: Erfgoedprofessional | Historisch kleermaker | Mannequinage - heritage_relevant: true - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0008_esmee_heil - person_name: Esmee Heil - role_title: Informatiespecialist at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0009_veronique_van_stokkom - person_name: Véronique van Stokkom - role_title: Senior medewerker bibliotheek bij Breitner Academie - heritage_relevant: true - heritage_type: L - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0010_ruben_smit - person_name: Ruben Smit - role_title: Senior Lecturer & Researcher - Programme Lead for International Knowledge Exchange Initiatives at Reinwardt - Academy - Amsterdam University of the Arts - heritage_relevant: true - heritage_type: R - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0011_seyit_sahin - person_name: Seyit Sahin - role_title: Security coördinator bij het Amsterdam museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0012_judith_van_gent - person_name: Judith van Gent - role_title: Head of collections / curator at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0013_marijke_oosterbroek - person_name: Marijke Oosterbroek - role_title: Manager digitale transformatie at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0014_petra_van_dijk - person_name: Petra van Dijk - role_title: Bestuurssecretaris bij Atria, kennisinstituut voor emancipatie en vrouwengeschiedenis - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0015_niek_van_hamburg - person_name: Niek van Hamburg - role_title: Collectiemedewerker bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0016_maren_de_wit - person_name: Maren de Wit - role_title: Conservator Stadsgeschiedenis - Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0017_maarten_jansen - person_name: Maarten Jansen - role_title: Coordinator collection aquisitions at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0018_emilia_strater - person_name: Emilia Sträter - role_title: Registrar at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0019_nikki_pootjes - person_name: Nikki Pootjes - role_title: Productieleider - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0020_fifi_kalkman - person_name: Fifi Kalkman - role_title: Development Specialist - Partnerships bij het Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0021_laura_smeets - person_name: Laura Smeets - role_title: Conservator Europese keramiek bij Fries Museum & Keramiekmuseum Princessehof - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0022_berenice_lunsingh_scheurleer - person_name: Berenice Lunsingh Scheurleer - role_title: Registrar bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0023_romy_muste_is_open_to_work - person_name: Romy Muste - role_title: Educator - art tours - yoga & meditation in museums - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0024_vanessa_vroon_najem - person_name: Vanessa Vroon-Najem - role_title: Wetenschappelijk Medewerker - Academic Staff at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0025_marysa_otte - person_name: Marysa Otte - role_title: Senior adviseur collectiezaken Amsterdam Museum at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0026_imogen_m - person_name: Imogen M. - role_title: Editor & Project manager - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0027_imara_limon - person_name: Imara Limon - role_title: Chief Curator at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0028_loes_van_lier - person_name: Loes van Lier - role_title: Marketeer @ Amsterdam Museum | Aanbidder van Niki de Saint Phalle - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0029_monique_vermeulen - person_name: Monique Vermeulen - role_title: Photographer at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0030_richard_middelman - person_name: Richard Middelman - role_title: Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0031_jules_rosier - person_name: Jules Rosier - role_title: Researcher, Editor, Agent Assistant - heritage_relevant: true - heritage_type: R - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0032_katharina_klockau - person_name: Katharina Klockau - role_title: Projectmanager at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0033_mirjam_koelewijn - person_name: Mirjam Koelewijn - role_title: Kunsthistorica | Vertrouwenspersoon | Redacteur - heritage_relevant: true - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0034_jorin_hirani - person_name: Jorin Hirani - role_title: Public Service Worker at Anne Frank Stichting | Secretary at Amsterdam Museum | BA Graduate History & International - Studies | MA International Relations - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0035_evalynn_schreuder - person_name: Evalynn Schreuder - role_title: '' - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0036_femke_awater - person_name: Femke Awater - role_title: Manager Educatie, Publiek en Interactie - heritage_relevant: true - heritage_type: E - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0037_thijs_boers - person_name: Thijs Boers - role_title: curator of applied arts at Amsterdam Museum and Museum Willet-Holthuysen - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0038_joyce_edwards - person_name: Joyce Edwards - role_title: Medewerker Kennis & Informatie bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0039_tom_van_der_molen - person_name: Tom van der Molen - role_title: Art historian, curator Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0040_hans_lentz - person_name: Hans Lentz - role_title: Museum advice and project management - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0041_kim_koopman - person_name: Kim Koopman - role_title: Corporate Communications Advisor/ Spokesperson at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0042_anne_dozy - person_name: Anne Dozy - role_title: Development Specialist | Private & Legacy Donations at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0043_remco_mol - person_name: Remco Mol - role_title: Zakelijk directeur Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0044_anne_goaitske_breteler - person_name: Anne-Goaitske Breteler - role_title: Correspondente Binnenland/Buitengebied - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0045_edo_mulder - person_name: Edo Mulder - role_title: Experienced graphic and exhibition designer at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0046_meike_le_coultre - person_name: Meike Le Coultre - role_title: Strategic Advisor Arts and Culture - heritage_relevant: true - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0047_dr_jurenne_d_hooi - person_name: dr. Jurenne D. Hooi - role_title: Adviseur - Keynote speaker - Auteur 'Eigen Schuld...' - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0048_sigi_samwel_is_open_to_work - person_name: Sigi Samwel - role_title: Curator en educator Co-creatie bij het Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0049_michiel_de_wit - person_name: Michiel de Wit - role_title: Audiovisueel technicus - heritage_relevant: true - heritage_type: D - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0050_roberto_luis_martins - person_name: Roberto Luis Martins - role_title: Curator - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0051_len_van_den_berg - person_name: Len van den Berg - role_title: collectiebeheerder bij Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0052_martijn_janssens - person_name: Martijn Janssens - role_title: Werknemer Amsterdam Museum | Student RMa Art History UU | Ambassadeur NIKI Florence - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0053_ocean_coesel - person_name: Ocean Coesel - role_title: '' - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0054_petra_keuchenius - person_name: Petra Keuchenius - role_title: Executive (team)coach, Consultant & Facilitator Mindful Leadership, CareDrives and YouAnd consultant, Strategic - advisor HR & Organization, - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0055_marije_fokkema - person_name: Marije Fokkema - role_title: Head of Development / Campaign Leader at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0056_nadine_vriend - person_name: Nadine Vriend - role_title: HR-medewerker bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0057_lidwien_van_grieken - person_name: Lidwien van Grieken - role_title: kunsthistoricus, rondleider, museummedewerker, tekstschrijver, redacteur - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0058_yuri_claudia_brewster - person_name: Yuri (Claudia) Brewster - role_title: Culturele duizendpoot/ Storyteller/ Rondleider/ Producer / Trainer/ Gespreksleider - heritage_relevant: true - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0059_nina_folkersma - person_name: Nina Folkersma - role_title: Art Professional /Senior Curator of Modern and Contemporary Art - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0060_elleke_van_uhm - person_name: Elleke van Uhm - role_title: Sustainability Advocate - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0061_ron_beers_amsterdam - person_name: Ron Beers - Amsterdam - role_title: technishe dienst at Hermitage Museum Amsterdam - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0062_suzette_van_t_hof - person_name: Suzette Van 't Hof - role_title: Kunsthistoricus - heritage_relevant: true - heritage_type: R - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0063_eden_kloos - person_name: Eden Kloos - role_title: working at Hema - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0064_rene_gerritsen - person_name: René Gerritsen - role_title: Zelfstandig kunstonderzoek fotograaf. - heritage_relevant: true - heritage_type: R - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0065_yvonne_holdorp - person_name: Yvonne Holdorp - role_title: head of secretarial office at Amsterdam Museum, sinds november 2018 directie-assistent - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0066_evina_de_graaf - person_name: evina de graaf - role_title: amsterdam museum / edams museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0067_harry_eggink - person_name: Harry Eggink - role_title: Senior projectleider bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0068_lizzy_ondaatje_she_her - person_name: Lizzy Ondaatje (she/her) - role_title: Advisor Human Resources at Amsterdam Museum - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0069_garance_reus_deelder - person_name: Garance Reus-Deelder - role_title: National Director Plan International - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0070_cas_versluijs - person_name: Cas Versluijs - role_title: Educator onderwijs bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0071_grete_simkute - person_name: Grete Simkuté - role_title: Freelance art journalist, Gallery assistant - heritage_relevant: true - heritage_type: G - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0072_linkedin_member_1 - person_name: 'LinkedIn Member #1' - role_title: Projectleider bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0073_rosanne_hilverda - person_name: Rosanne Hilverda - role_title: Fondsenwerving non-profit sector - heritage_relevant: true - heritage_type: D - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0074_emma_thoene_de_labriffe - person_name: Emma Thöene de Labriffe - role_title: Data-driven commercial strategist - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0075_ida_nijman - person_name: Ida Nijman - role_title: Masterstudent Curating Arts and Cultures / Arts of the Netherlands aan de Universiteit van Amsterdam - heritage_relevant: true - heritage_type: E - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0076_krijn_butter - person_name: Krijn Butter - role_title: Facilitymanagement & ICT bij Het Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0077_daniella_rubinovitz - person_name: Daniella Rubinovitz - role_title: Public Sculpture Artist | Open for Exhibitions, Commissions & Acquisitions | From Sketch to Monumental Form - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0078_camille_van_neer - person_name: Camille van Neer - role_title: Art, Care & Education in Every Way Thinkable - heritage_relevant: true - heritage_type: E - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0079_patrick_de_boer - person_name: Patrick De Boer - role_title: Beheerder gebouw techniek & ICT Team Facility at the Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0080_sarah_de_weijer - person_name: Sarah de Weijer - role_title: Projectleider Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0081_emma_waslander - person_name: Emma Waslander - role_title: Curator | Public Program @ Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0082_vera_blok - person_name: Vera Blok - role_title: Paintings conservator - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0083_jean_paul_dirks - person_name: Jean-Paul Dirks - role_title: Geschiedenis- en Economiestudent aan Universiteit van Amsterdam - heritage_relevant: true - heritage_type: E - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0084_herman_frehe - person_name: Herman Frehe - role_title: '' - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0085_cathelijn_otto - person_name: Cathelijn Otto - role_title: MA Student Art History - heritage_relevant: true - heritage_type: E - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0086_jeroen_rensen - person_name: Jeroen Rensen - role_title: Collectiemedewerker at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0087_dagny_van_hagen - person_name: Dagny van Hagen - role_title: Medewerker Publieksdienst at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0088_florian_gottke - person_name: Florian Göttke - role_title: artist, researcher, writer, educator - heritage_relevant: true - heritage_type: R - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0089_christina_calje - person_name: Christina Caljé - role_title: (Exited) Founder | Early-stage Investor | Board Member | Investment Committee Member | Winner Techleap ‘Giving - Back Award’ | Winner Women in Tech NL ‘Global Leadership Award’ | EUtop50 ‘Top Woman Entrepreneur’ - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0090_eliane_boreel - person_name: Eliane Boreel - role_title: 'Development specialist: Events & Capital Campaign' - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0091_sophie_op_den_kamp - person_name: Sophie Op den Kamp - role_title: Marketing Strategist | Tech | Culture | Education | Social Impact - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0092_linkedin_member_2 - person_name: 'LinkedIn Member #2' - role_title: Security Officer bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0093_patrick_de_bruin - person_name: Patrick de Bruin - role_title: Multimediale communicatie bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0094_annalies_van_eerde_is_open_to - person_name: Annalies van Eerde - role_title: Beeldend kunstenaar en docent - Bosbad-gids ( in opleiding ) - heritage_relevant: true - heritage_type: E - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0095_yvonne_hilgevoord - person_name: Yvonne Hilgevoord - role_title: Publieksmedewerkster - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0096_maurice_seleky - person_name: Maurice Seleky - role_title: Head of Communications & Marketing and MT-member at Amsterdam Museum | Author | Moderator - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0097_linkedin_member_3 - person_name: 'LinkedIn Member #3' - role_title: Security at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0098_willa_stoutenbeek_is_open_to_w - person_name: Willa Stoutenbeek - role_title: Strategic Advisor & Creative Director | Founder W.Green | Intersectional Environmentalist | TEDx Speaker | - Storyteller | Moderator - heritage_relevant: true - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0099_yahaira_gezius - person_name: Yahaira Gezius - role_title: Docent Events | Procesbegeleider Educatie - heritage_relevant: true - heritage_type: E - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0100_janine_fluyt - person_name: Janine Fluyt - role_title: COMMUNICATIE I PERS I WOORDVOERING I LOBBY I ADVIES I ai Management MARCOM I Theater NITE I Dans Club Guy - & Roni I OBA I amsterdam&partners I Sven Ratzke I Filmacademie I Art Irene Hoff I H'ART Museum I FFort Foundation - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0101_julie_becker - person_name: Julie Becker - role_title: Educator en onderwijsontwikkelaar - heritage_relevant: true - heritage_type: E - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0102_imke_ruigrok - person_name: Imke Ruigrok - role_title: 'Artistiek Directeur RE_NATURE Festival voor Kunst en Natuur (Curator: ecologie, (systeem)verandering), Ruigoord: - Oase van Verwondering, gastcurator Amsterdam Museum, kwartiermaker Draden van Ons Slavernijverleden' - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0103_dutton_r_hauhart - person_name: Dutton R. Hauhart - role_title: Wordsmith. Editing, authoring, polishing since 2010. - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0104_erno_kiljan - person_name: Erno Kiljan - role_title: Retired. Avaliable for museum work or genealogy research. - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0105_andy_ramsche - person_name: Andy Ramsche - role_title: Security coordinator bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0106_chris_haakman - person_name: Chris Haakman - role_title: Museumeducatie en foto-videografie - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0107_rosanne_van_ballegooijen - person_name: Rosanne van Ballegooijen - role_title: RMA student at the University of Amsterdam & Research and Publications Intern at the Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0108_diederik_luijt - person_name: Diederik Luijt - role_title: Coördinator Service & Hospitality at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0109_hans_besselink - person_name: Hans Besselink - role_title: Directeur bij Museum Het Oude Raadhuis - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0110_marianne_jonker_ahm - person_name: Marianne Jonker ahm - role_title: Registrar at Amsterdams Historisch Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0111_tyronn_daal - person_name: Tyronn Daal - role_title: Allround ICT Beheerder bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0112_annemarijn_van_der_kolk - person_name: Annemarijn van der Kolk - role_title: Public Program at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0113_linkedin_member_4 - person_name: 'LinkedIn Member #4' - role_title: Tekstschrijver/redacteur bij Stichting Molen Documentatie - heritage_relevant: true - heritage_type: R - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0114_nadia_grevi - person_name: Nadia Grevi - role_title: Photographic Designer - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0115_kaatje_bosma - person_name: Kaatje Bosma - role_title: MA Art History| Museum Educator | Public Program - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0116_mels_huige - person_name: Mels Huige - role_title: Partner at Active Capital Company B.V. - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0117_robert_beekelaar - person_name: Robert Beekelaar - role_title: Photographer and Visual Artist - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0118_roisin_douglas_is_open_to_work - person_name: Roísín Douglas - role_title: Freelance curator, projectmanager, fundraiser and editor | Chair Jong VNK | MA Student Curating Art and Cultures - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0119_rudolf_van_schaik - person_name: Rudolf van Schaik - role_title: Junior Employee Development at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0120_maarten_lemberger - person_name: Maarten Lemberger - role_title: at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0121_floor_van_hulsen - person_name: Floor van Hulsen - role_title: Inhoudelijk leider Talentontwikkeling & Mbo-programma | Vernieuwt organisaties met (ongeziene) jonge makers - | Verbindt momenteel jonge makers & Mbo-talent aan het Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0122_linkedin_member_5 - person_name: 'LinkedIn Member #5' - role_title: '' - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0123_judikje_kiers - person_name: Judikje Kiers - role_title: Algemeen Directeur bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0124_anneke_selsig - person_name: Anneke Selsig - role_title: Secretarieel medew bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0125_linkedin_member_6 - person_name: 'LinkedIn Member #6' - role_title: Medewerker Educatie bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0126_andy_ramsche - person_name: Andy Ramsche - role_title: Security coördinator bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0127_lola_bessa - person_name: Lola Bessa - role_title: Programmamaker, journalist, PR - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0128_natalia_pavlova - person_name: Natalia Pavlova - role_title: project medewerker bij Helicon Conservation Support - heritage_relevant: true - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0129_paul_wevers - person_name: Paul Wevers - role_title: Voorzitter bij ORAM, Bestuurder, Commissaris - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0130_mansour_awad - person_name: Mansour Awad - role_title: Marketing & Communicatie student - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0131_kristel_hulsebos - person_name: Kristel Hulsebos - role_title: Communicatieadviseur bij het Amsterdam Museum & Frans Hals Museum voor 'Gezichten van Noord-Holland' - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0132_robin_heeren - person_name: Robin Heeren - role_title: Planner en beheer Boekingen bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0133_svetlana_pavlovic - person_name: Svetlana Pavlovic - role_title: Senior Financieel medewerker - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0134_linkedin_member_7 - person_name: 'LinkedIn Member #7' - role_title: '' - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0135_linkedin_member_8 - person_name: 'LinkedIn Member #8' - role_title: Real Estate Agent at Amsterdam Museum - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0136_josje_elhorst - person_name: Josje Elhorst - role_title: Assistent Controller at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0137_suzanne_gijsen - person_name: Suzanne Gijsen - role_title: Amsterdam museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0138_jan_de_rooij - person_name: Jan de Rooij - role_title: Experienced independent (supervisory) Board Member - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0139_linkedin_member_9 - person_name: 'LinkedIn Member #9' - role_title: Manager bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0140_maartje_van_peijpe_elias - person_name: Maartje van Peijpe-Elias - role_title: Business Owner at MAART - Muziek&Musea Museumguide @ Rijksmuseum Amsterdam, Teylers Museum Haarlem and Museum - Our Lord in the Attic - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0141_micha_vitalis - person_name: Micha Vitalis - role_title: collectiebeheer en collectieregistratie - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0142_mirjam_floor_bellen - person_name: Mirjam Floor-Bellen - role_title: senior expert textiles bij Geen - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0143_linkedin_member_10 - person_name: 'LinkedIn Member #10' - role_title: Cleaning lady di Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0144_henk_markerink - person_name: Henk Markerink - role_title: Former Chairman VNO-NCW metropolitan region Amsterdam & Former CEO at Johan Cruijff ArenA - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0145_sophie_peels_is_open_to_work - person_name: Sophie Peels - role_title: Projectassistent bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0146_sydney_lowell - person_name: Sydney Lowell - role_title: Spoken word poet - voice actor - teacher - co-founfer & producer of We The People - heritage_relevant: true - heritage_type: E - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0147_judith_steketee_biermann - person_name: Judith Steketee-Biermann - role_title: Directie secretariaat bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0148_inge_jolijn_schoone - person_name: Inge Jolijn Schoone - role_title: Registrar at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0149_catherine_wolfs - person_name: Catherine Wolfs - role_title: Inhoudelijk assistent Algemeen Directeur Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0150_robbert_maruanaija - person_name: Robbert Maruanaija - role_title: Personal Development Coach and Facilitator & Creative Consultant - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0151_sacha_knezevic - person_name: Sacha Knežević - role_title: Medewerker Floormanagement bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0152_facilitair_hermitage_amsterdam - person_name: Facilitair Hermitage Amsterdam - role_title: Technische Dienst Hermitage Museum Amsterdam - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0153_linkedin_member_11 - person_name: 'LinkedIn Member #11' - role_title: staff member Collection Department at Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0154_jesper_buursink - person_name: Jesper Buursink - role_title: Podcast- and radiomaker, illustrator, artist - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0155_mark_williams - person_name: Mark Williams - role_title: Facilitair assistent bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0156_anouschka_sewsahai - person_name: Anouschka Sewsahai - role_title: Financieel medewerker bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0157_patricia_de_weichs_de_wenne - person_name: Patricia de Weichs de Wenne - role_title: (Interim) directeur/manager, bestuurder, strategisch adviseur en toezichthouder - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0158_geer_van_der_klugt - person_name: Geer Van Der Klugt - role_title: artist/ finance at W139 - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0159_pascal_huibers - person_name: Pascal Huibers - role_title: Arnhem Fashion Week at Amsterdam Fashion Museum - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0160_linkedin_member_12 - person_name: 'LinkedIn Member #12' - role_title: Restaurator bij Amsterdam Museum - heritage_relevant: true - heritage_type: M - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0161_dirk_jan_list - person_name: Dirk-Jan List - role_title: Chairman Dok-C at Dok-C - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser - - person_id: amsterdam-museum_staff_0162_simon_kemper - person_name: Simon Kemper - role_title: Historisch Vondeldorp ontwikkelen - heritage_relevant: false - heritage_type: null - current: true - affiliation_provenance: - source_url: https://www.linkedin.com/company/amsterdam-museum/people/ - retrieved_on: '2025-12-15T09:50:03Z' - retrieval_agent: linkedin_html_parser -linkedin_enrichment: - linkedin_url: https://www.linkedin.com/company/amsterdam-museum - linkedin_slug: amsterdam-museum - industry: Museums, Historical Sites, and Zoos - follower_count: 12K - staff_count: 163 - heritage_staff_count: 104 - enrichment_timestamp: '2025-12-16T16:54:32.423085+00:00' - provenance: - source: linkedin_company_scrape - original_file: data/custodian/linkedin/amsterdam-museum.yaml - schema_version: 1.0.0 - generated_at: '2025-12-16T16:11:51.975070+00:00' - heritage_staff: - - name: Amsterdam Museum - headline: '' - heritage_type: M - - name: Anna Martens - headline: Educatie en tentoonstellingen - linkedin_url: https://www.linkedin.com/in/anna-martens-22619747 - heritage_type: E - - name: Laura Van Hasselt - headline: Researcher and lecturer at University of Amsterdam - linkedin_url: https://www.linkedin.com/in/laura-van-hasselt-0214b913 - heritage_type: R - - name: Tim Verlaan - headline: Assistant Professor at University of Amsterdam - linkedin_url: https://www.linkedin.com/in/timmyverlaan - heritage_type: E - - name: Dorine Maat - headline: Conservator Stadsgeschiedenis bij Museum Flehite - linkedin_url: https://www.linkedin.com/in/dorine-maat-175b7b8b - heritage_type: M - - name: Sophie Boven - headline: Collectiemanagement | Registrar | Tentoonstellingscoördinator - linkedin_url: https://www.linkedin.com/in/sophie-boven - heritage_type: M - - name: Denise van der Vegt - headline: Erfgoedprofessional | Historisch kleermaker | Mannequinage - linkedin_url: https://www.linkedin.com/in/denise-van-der-vegt-077b9a210 - - name: Esmee Heil - headline: Informatiespecialist at Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/esmee-heil-aaa35811 - heritage_type: M - - name: Véronique van Stokkom - headline: Senior medewerker bibliotheek bij Breitner Academie - linkedin_url: https://www.linkedin.com/in/veroniquevanstokkom - heritage_type: L - - name: Ruben Smit - headline: Senior Lecturer & Researcher - Programme Lead for International Knowledge Exchange Initiatives at Reinwardt - Academy - Amsterdam University of the Arts - linkedin_url: https://www.linkedin.com/in/rubensmit - heritage_type: R - - name: Seyit Sahin - headline: Security coördinator bij het Amsterdam museum - linkedin_url: https://www.linkedin.com/in/seyit-sahin-64a11982 - heritage_type: M - - name: Marijke Oosterbroek - headline: Manager digitale transformatie at Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/marijke-oosterbroek-44110b6 - heritage_type: M - - name: Niek van Hamburg - headline: Collectiemedewerker bij Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/niekvanhamburg - heritage_type: M - - name: Maren de Wit - headline: Conservator Stadsgeschiedenis - Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/maren-de-wit-2344771a9 - heritage_type: M - - name: Emilia Sträter - headline: Registrar at Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/emilia-str%C3%A4ter-78282514 - heritage_type: M - - name: Fifi Kalkman - headline: Development Specialist - Partnerships bij het Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/fifi-kalkman-142229140 - heritage_type: M - - name: Laura Smeets - headline: Conservator Europese keramiek bij Fries Museum & Keramiekmuseum Princessehof - linkedin_url: https://www.linkedin.com/in/laura-smeets-0976031a - heritage_type: M - - name: Berenice Lunsingh Scheurleer - headline: Registrar bij Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/lunsinghscheurleer - heritage_type: M - - name: Romy Muste - headline: Educator - art tours - yoga & meditation in museums - linkedin_url: https://www.linkedin.com/in/romy-muste-a090a81a - heritage_type: M - - name: Marysa Otte - headline: Senior adviseur collectiezaken Amsterdam Museum at Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/marysa-otte-a8632012 - heritage_type: M - - name: Imara Limon - headline: Chief Curator at Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/imaralimon - heritage_type: M - - name: Loes van Lier - headline: Marketeer @ Amsterdam Museum | Aanbidder van Niki de Saint Phalle - linkedin_url: https://www.linkedin.com/in/loes-van-lier-04386812b - heritage_type: M - - name: Monique Vermeulen - headline: Photographer at Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/monique-vermeulen-4119354 - heritage_type: M - - name: Richard Middelman - headline: Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/richard-middelman-55670317 - heritage_type: M - - name: Jules Rosier - headline: Researcher, Editor, Agent Assistant - linkedin_url: https://www.linkedin.com/in/fjrosier - heritage_type: R - - name: Katharina Klockau - headline: Projectmanager at Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/katharina-klockau - heritage_type: M - - name: Mirjam Koelewijn - headline: Kunsthistorica | Vertrouwenspersoon | Redacteur - linkedin_url: https://www.linkedin.com/in/mirjam-koelewijn-6093b9b - - name: Evalynn Schreuder - headline: '' - linkedin_url: https://www.linkedin.com/in/evalynn-schreuder-343401365 - heritage_type: M - - name: Femke Awater - headline: Manager Educatie, Publiek en Interactie - linkedin_url: https://www.linkedin.com/in/femke-awater-58040b51 - heritage_type: E - - name: Thijs Boers - headline: curator of applied arts at Amsterdam Museum and Museum Willet-Holthuysen - linkedin_url: https://www.linkedin.com/in/thijs-boers-a677165 - heritage_type: M - - name: Joyce Edwards - headline: Medewerker Kennis & Informatie bij Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/joyce-edwards-02596b67 - heritage_type: M - - name: Tom van der Molen - headline: Art historian, curator Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/tom-van-der-molen-0019844 - heritage_type: M - - name: Hans Lentz - headline: Museum advice and project management - linkedin_url: https://www.linkedin.com/in/hans-lentz-26395732 - heritage_type: M - - name: Remco Mol - headline: Zakelijk directeur Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/remco-mol-3240967 - heritage_type: M - - name: Edo Mulder - headline: Experienced graphic and exhibition designer at Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/edomulder - heritage_type: M - - name: Meike Le Coultre - headline: Strategic Advisor Arts and Culture - linkedin_url: https://www.linkedin.com/in/meike-le-coultre-1a05b514 - - name: Sigi Samwel - headline: Curator en educator Co-creatie bij het Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/sigi-samwel-377456241 - heritage_type: M - - name: Roberto Luis Martins - headline: Curator - linkedin_url: https://www.linkedin.com/in/roberto-luis-martins-4aa14a18b - heritage_type: M - - name: Len van den Berg - headline: collectiebeheerder bij Museum - linkedin_url: https://www.linkedin.com/in/len-van-den-berg-8a6b14153 - heritage_type: M - - name: Martijn Janssens - headline: Werknemer Amsterdam Museum | Student RMa Art History UU | Ambassadeur NIKI Florence - linkedin_url: https://www.linkedin.com/in/martijn-janssens-08703a256 - heritage_type: M - - name: Ocean Coesel - headline: '' - linkedin_url: https://www.linkedin.com/in/ocean-coesel-1621811a5 - heritage_type: M - - name: Marije Fokkema - headline: Head of Development / Campaign Leader at Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/marije-fokkema-9ba24226 - heritage_type: M - - name: Nadine Vriend - headline: HR-medewerker bij Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/nadine-vriend-9391491a1 - heritage_type: M - - name: Lidwien van Grieken - headline: kunsthistoricus, rondleider, museummedewerker, tekstschrijver, redacteur - linkedin_url: https://www.linkedin.com/in/lidwien-van-grieken-771ba219 - heritage_type: M - - name: Yuri (Claudia) Brewster - headline: Culturele duizendpoot/ Storyteller/ Rondleider/ Producer / Trainer/ Gespreksleider - linkedin_url: https://www.linkedin.com/in/yuri-claudia-brewster-42b01824 - - name: Nina Folkersma - headline: Art Professional /Senior Curator of Modern and Contemporary Art - linkedin_url: https://www.linkedin.com/in/ninafolkersma - heritage_type: M - - name: Ron Beers - Amsterdam - headline: technishe dienst at Hermitage Museum Amsterdam - linkedin_url: https://www.linkedin.com/in/ron-beers-amsterdam-3b903083 - heritage_type: M - - name: Suzette Van 't Hof - headline: Kunsthistoricus - linkedin_url: https://www.linkedin.com/in/suzette-van-t-hof-48349a3 - heritage_type: R - - name: Yvonne Holdorp - headline: head of secretarial office at Amsterdam Museum, sinds november 2018 directie-assistent - linkedin_url: https://www.linkedin.com/in/yvonne-holdorp-61190545 - heritage_type: M - - name: evina de graaf - headline: amsterdam museum / edams museum - linkedin_url: https://www.linkedin.com/in/evina-de-graaf-9350266a - heritage_type: M - - name: Harry Eggink - headline: Senior projectleider bij Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/harry-eggink-007b5515 - heritage_type: M - - name: Cas Versluijs - headline: Educator onderwijs bij Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/cas-versluijs-b63464214 - heritage_type: M - - name: 'LinkedIn Member #1' - headline: Projectleider bij Amsterdam Museum - heritage_type: M - - name: Krijn Butter - headline: Facilitymanagement & ICT bij Het Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/krijn-butter-91b54812a - heritage_type: M - - name: Camille van Neer - headline: Art, Care & Education in Every Way Thinkable - linkedin_url: https://www.linkedin.com/in/camillevanneer - heritage_type: E - - name: Patrick De Boer - headline: Beheerder gebouw techniek & ICT Team Facility at the Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/patrick-de-boer-bb016b3a - heritage_type: M - - name: Sarah de Weijer - headline: Projectleider Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/sarah-de-weijer-8122523b - heritage_type: M - - name: Emma Waslander - headline: Curator | Public Program @ Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/emma-waslander-3207745b - heritage_type: M - - name: Vera Blok - headline: Paintings conservator - linkedin_url: https://www.linkedin.com/in/vera-blok - heritage_type: M - - name: Jean-Paul Dirks - headline: Geschiedenis- en Economiestudent aan Universiteit van Amsterdam - linkedin_url: https://www.linkedin.com/in/jean-paul-dirks-a9486225a - heritage_type: E - - name: Herman Frehe - headline: '' - linkedin_url: https://www.linkedin.com/in/herman-frehe-43807a85 - heritage_type: M - - name: Cathelijn Otto - headline: MA Student Art History - linkedin_url: https://www.linkedin.com/in/cathelijn-otto-5b5361210 - heritage_type: E - - name: Jeroen Rensen - headline: Collectiemedewerker at Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/jeroen-rensen-3290b162 - heritage_type: M - - name: Dagny van Hagen - headline: Medewerker Publieksdienst at Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/dagny-van-hagen-81a0a041 - heritage_type: M - - name: Florian Göttke - headline: artist, researcher, writer, educator - linkedin_url: https://www.linkedin.com/in/florian-g%C3%B6ttke-394857b - heritage_type: R - - name: 'LinkedIn Member #2' - headline: Security Officer bij Amsterdam Museum - heritage_type: M - - name: Patrick de Bruin - headline: Multimediale communicatie bij Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/debruinpatrick - heritage_type: M - - name: 'LinkedIn Member #3' - headline: Security at Amsterdam Museum - heritage_type: M - - name: Willa Stoutenbeek - headline: Strategic Advisor & Creative Director | Founder W.Green | Intersectional Environmentalist | TEDx Speaker | Storyteller - | Moderator - linkedin_url: https://www.linkedin.com/in/willa-stoutenbeek-a6487219 - - name: Yahaira Gezius - headline: Docent Events | Procesbegeleider Educatie - linkedin_url: https://www.linkedin.com/in/yahaira-gezius-9b0301b0 - heritage_type: E - - name: Julie Becker - headline: Educator en onderwijsontwikkelaar - linkedin_url: https://www.linkedin.com/in/julie-becker-627087151 - heritage_type: E - - name: Erno Kiljan - headline: Retired. Avaliable for museum work or genealogy research. - linkedin_url: https://www.linkedin.com/in/erno-kiljan-6436743 - heritage_type: M - - name: Chris Haakman - headline: Museumeducatie en foto-videografie - linkedin_url: https://www.linkedin.com/in/chris-haakman-720aa9221 - heritage_type: M - - name: Hans Besselink - headline: Directeur bij Museum Het Oude Raadhuis - linkedin_url: https://www.linkedin.com/in/hans-besselink-1b112560 - heritage_type: M - - name: Marianne Jonker ahm - headline: Registrar at Amsterdams Historisch Museum - linkedin_url: https://www.linkedin.com/in/marianne-jonker-ahm-21829717 - heritage_type: M - - name: Tyronn Daal - headline: Allround ICT Beheerder bij Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/tyronn-daal-5363b1173 - heritage_type: M - - name: Annemarijn van der Kolk - headline: Public Program at Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/annemarijn-van-der-kolk-469617195 - heritage_type: M - - name: Kaatje Bosma - headline: MA Art History| Museum Educator | Public Program - linkedin_url: https://www.linkedin.com/in/kaatje-bosma-939052208 - heritage_type: M - - name: Rudolf van Schaik - headline: Junior Employee Development at Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/rudolf-van-schaik-21b247135 - heritage_type: M - - name: Maarten Lemberger - headline: at Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/maarten-lemberger-970ba814 - heritage_type: M - - name: 'LinkedIn Member #5' - headline: '' - heritage_type: M - - name: Judikje Kiers - headline: Algemeen Directeur bij Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/judikje - heritage_type: M - - name: Anneke Selsig - headline: Secretarieel medew bij Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/anneke-selsig-b86aaba1 - heritage_type: M - - name: 'LinkedIn Member #6' - headline: Medewerker Educatie bij Amsterdam Museum - heritage_type: M - - name: Andy Ramsche - headline: Security coördinator bij Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/andy-ramsche-bb65b8162 - heritage_type: M - - name: Natalia Pavlova - headline: project medewerker bij Helicon Conservation Support - linkedin_url: https://www.linkedin.com/in/natalia-pavlova-228567134 - - name: Robin Heeren - headline: Planner en beheer Boekingen bij Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/robin-heeren-2091a7161 - heritage_type: M - - name: 'LinkedIn Member #7' - headline: '' - heritage_type: M - - name: Josje Elhorst - headline: Assistent Controller at Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/josje-elhorst-55936b12 - heritage_type: M - - name: Suzanne Gijsen - headline: Amsterdam museum - linkedin_url: https://www.linkedin.com/in/suzanne-gijsen-2661a111 - heritage_type: M - - name: 'LinkedIn Member #9' - headline: Manager bij Amsterdam Museum - heritage_type: M - - name: Maartje van Peijpe-Elias - headline: Business Owner at MAART - Muziek&Musea Museumguide @ Rijksmuseum Amsterdam, Teylers Museum Haarlem and Museum - Our Lord in the Attic - linkedin_url: https://www.linkedin.com/in/maartje-van-peijpe-elias-ab15108 - heritage_type: M - - name: Micha Vitalis - headline: collectiebeheer en collectieregistratie - linkedin_url: https://www.linkedin.com/in/micha-vitalis-0065051b8 - heritage_type: M - - name: Sophie Peels - headline: Projectassistent bij Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/sophie-peels-739568100 - heritage_type: M - - name: Sydney Lowell - headline: Spoken word poet - voice actor - teacher - co-founfer & producer of We The People - linkedin_url: https://www.linkedin.com/in/sydney-lowell-130462115 - heritage_type: E - - name: Judith Steketee-Biermann - headline: Directie secretariaat bij Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/judith-steketee-biermann-99345ab - heritage_type: M - - name: Inge Jolijn Schoone - headline: Registrar at Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/inge-jolijn-schoone-b242843a - heritage_type: M - - name: Catherine Wolfs - headline: Inhoudelijk assistent Algemeen Directeur Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/catherinewolfs - heritage_type: M - - name: Sacha Knežević - headline: Medewerker Floormanagement bij Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/sacha-kne%C5%BEevi%C4%87-811a2b93 - heritage_type: M - - name: Facilitair Hermitage Amsterdam - headline: Technische Dienst Hermitage Museum Amsterdam - linkedin_url: https://www.linkedin.com/in/facilitair-hermitage-amsterdam-32190889 - heritage_type: M - - name: 'LinkedIn Member #11' - headline: staff member Collection Department at Amsterdam Museum - heritage_type: M - - name: Mark Williams - headline: Facilitair assistent bij Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/mark-williams-739927160 - heritage_type: M - - name: Anouschka Sewsahai - headline: Financieel medewerker bij Amsterdam Museum - linkedin_url: https://www.linkedin.com/in/anouschka-sewsahai-458a9968 - heritage_type: M - - name: 'LinkedIn Member #12' - headline: Restaurator bij Amsterdam Museum - heritage_type: M + linkedin: + - source_type: linkedin_company_profile + data_tier: TIER_4_INFERRED + source_file: data/custodian/linkedin/ajax-museum.yaml + extraction_timestamp: '2025-12-16T21:06:39.152742+00:00' + claims_extracted: + - name + - industry + - location + - website + - staff_count + - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.johancruijffarena.nl/ + extraction_timestamp: '2025-12-17T09:33:15.742206+00:00' + claims_extracted: + - city + - region + - address + data_tier_summary: + TIER_4_INFERRED: + - linkedin_company_profile + notes: + - Created from unmatched LinkedIn company profile + - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Amsterdam, Noord-Holland' diff --git a/data/custodian/NL-XX-XXX-M-APM-allard_pierson_museum.yaml b/data/custodian/NL-NH-AMS-M-APM-allard_pierson_museum.yaml similarity index 60% rename from data/custodian/NL-XX-XXX-M-APM-allard_pierson_museum.yaml rename to data/custodian/NL-NH-AMS-M-APM-allard_pierson_museum.yaml index fd636b9200..b4cd9b9c5d 100644 --- a/data/custodian/NL-XX-XXX-M-APM-allard_pierson_museum.yaml +++ b/data/custodian/NL-NH-AMS-M-APM-allard_pierson_museum.yaml @@ -18,23 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/allard-pierson-museum.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Amsterdam + region: Noord-Holland country: NL + address: Oude Turfmarkt 127, 1012 GC Amsterdam ghcid: - ghcid_current: NL-XX-XXX-M-APM-allard_pierson_museum + ghcid_current: NL-NH-AMS-M-APM-allard_pierson_museum ghcid_original: NL-XX-XXX-M-APM-allard_pierson_museum - ghcid_uuid: 48392b8c-36a8-53a6-a03d-271eaf106bb4 - ghcid_uuid_sha256: e9b99db6-f222-8dc7-bbbe-18ed689ad863 - ghcid_numeric: 16841665690600619463 + ghcid_uuid: 0ec4308c-0f54-5138-99c6-809709534df8 + ghcid_uuid_sha256: 4f66990b-cd99-83cd-9376-1c589d0ffbb1 + ghcid_numeric: 5721428652593849293 record_id: ffc23f4f-a760-406f-b103-46f70b81736a generation_timestamp: '2025-12-16T21:06:45.602986+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-APM-allard_pierson_museum ghcid_numeric: 16841665690600619463 valid_from: '2025-12-17T08:44:25.980684+00:00' - valid_to: null + valid_to: '2025-12-17T09:17:11.075305+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-NH-AMS-M-APM-allard_pierson_museum + ghcid_numeric: 5721428652593849293 + valid_from: '2025-12-17T09:17:11.075305+00:00' + valid_to: null + reason: Location enriched via Exa web search - Amsterdam, Noord-Holland + location_resolution: + method: EXA_WEB_SEARCH + city_code: AMS + city_name: Amsterdam + region_code: NH + region_name: Noord-Holland + country_code: NL + resolution_date: '2025-12-17T09:17:11.075305+00:00' + source_url: https://www.allardpierson.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:45.602986+00:00' @@ -51,6 +66,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.allardpierson.nl/ + extraction_timestamp: '2025-12-17T09:17:11.075305+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -59,3 +83,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Amsterdam, Noord-Holland' diff --git a/data/custodian/NL-XX-XXX-M-CM-cow_museum.yaml b/data/custodian/NL-NH-AMS-M-CM-cow_museum.yaml similarity index 60% rename from data/custodian/NL-XX-XXX-M-CM-cow_museum.yaml rename to data/custodian/NL-NH-AMS-M-CM-cow_museum.yaml index 0f9bee83a9..d602f17761 100644 --- a/data/custodian/NL-XX-XXX-M-CM-cow_museum.yaml +++ b/data/custodian/NL-NH-AMS-M-CM-cow_museum.yaml @@ -18,28 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/cow-museum.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Amsterdam + region: Noord-Holland country: NL + address: Leliegracht 4, Amsterdam ghcid: - ghcid_current: NL-XX-XXX-M-CM-cow_museum + ghcid_current: NL-NH-AMS-M-CM-cow_museum ghcid_original: NL-XX-XXX-M-CM-cow_museum - ghcid_uuid: 9590fe8f-c06b-55d1-a4f0-8a497b9a9d6b - ghcid_uuid_sha256: 7748f0fe-3dc8-8f0f-b5d3-6e253897ec97 - ghcid_numeric: 8595384863585521423 + ghcid_uuid: 552df309-3f63-5bce-ba90-0a8cd7fab8c1 + ghcid_uuid_sha256: 6e182c92-bd64-882a-9adc-0a40d4b7ab19 + ghcid_numeric: 7933139752367454250 record_id: 5ae057ba-c6a2-43d0-a200-1285bcb507a7 generation_timestamp: '2025-12-16T21:06:42.129981+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-CM-cow_museum ghcid_numeric: 8595384863585521423 valid_from: '2025-12-16T21:06:42.129981+00:00' - valid_to: null + valid_to: '2025-12-17T09:17:11.106062+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-NH-AMS-M-CM-cow_museum + ghcid_numeric: 7933139752367454250 + valid_from: '2025-12-17T09:17:11.106062+00:00' + valid_to: null + reason: Location enriched via Exa web search - Amsterdam, Noord-Holland location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: AMS + city_name: Amsterdam + region_code: NH + region_name: Noord-Holland country_code: NL + resolution_date: '2025-12-17T09:17:11.106062+00:00' + source_url: https://cowmuseum.amsterdam/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:42.129981+00:00' @@ -56,9 +66,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://cowmuseum.amsterdam/ + extraction_timestamp: '2025-12-17T09:17:11.106062+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Amsterdam, Noord-Holland' diff --git a/data/custodian/NL-XX-XXX-M-CM.yaml b/data/custodian/NL-NH-AMS-M-CM.yaml similarity index 60% rename from data/custodian/NL-XX-XXX-M-CM.yaml rename to data/custodian/NL-NH-AMS-M-CM.yaml index 2e46e9f6fc..d9875de6df 100644 --- a/data/custodian/NL-XX-XXX-M-CM.yaml +++ b/data/custodian/NL-NH-AMS-M-CM.yaml @@ -18,28 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/cacao-museum.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Amsterdam + region: Noord-Holland country: NL + address: Amsterdam, Netherlands ghcid: - ghcid_current: NL-XX-XXX-M-CM + ghcid_current: NL-NH-AMS-M-CM ghcid_original: NL-XX-XXX-M-CM - ghcid_uuid: 583583d1-81e1-58c3-93fb-c5e26dd537b3 - ghcid_uuid_sha256: 9a9161f8-d0d2-8a31-a4cd-762b71024dc4 - ghcid_numeric: 11137791074747161137 + ghcid_uuid: 47f14c04-b37a-5e60-aa25-de2ed442b7ff + ghcid_uuid_sha256: 3411844b-6dbc-869e-8f22-4cc95c99b917 + ghcid_numeric: 3751925424074823326 record_id: 1241c462-d2b4-4afa-b46c-e2b0f3c22fde generation_timestamp: '2025-12-16T21:06:40.671775+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-CM ghcid_numeric: 11137791074747161137 valid_from: '2025-12-16T21:06:40.671775+00:00' - valid_to: null + valid_to: '2025-12-17T09:25:04.103278+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-NH-AMS-M-CM + ghcid_numeric: 3751925424074823326 + valid_from: '2025-12-17T09:25:04.103278+00:00' + valid_to: null + reason: Location enriched via Exa web search - Amsterdam, Noord-Holland location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: AMS + city_name: Amsterdam + region_code: NH + region_name: Noord-Holland country_code: NL + resolution_date: '2025-12-17T09:25:04.103278+00:00' + source_url: https://www.cacaomuseum.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:40.671775+00:00' @@ -56,9 +66,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.cacaomuseum.nl/ + extraction_timestamp: '2025-12-17T09:25:04.103278+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Amsterdam, Noord-Holland' diff --git a/data/custodian/NL-XX-XXX-M-DDGD.yaml b/data/custodian/NL-NH-AMS-M-DDGD.yaml similarity index 61% rename from data/custodian/NL-XX-XXX-M-DDGD.yaml rename to data/custodian/NL-NH-AMS-M-DDGD.yaml index 93f3433a9e..8509f0b21b 100644 --- a/data/custodian/NL-XX-XXX-M-DDGD.yaml +++ b/data/custodian/NL-NH-AMS-M-DDGD.yaml @@ -21,23 +21,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/dutch-directors-guild-ddg.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Amsterdam + region: Noord-Holland country: NL + address: De Lairessestraat 125 sous, 1075 HH Amsterdam ghcid: - ghcid_current: NL-XX-XXX-M-DDGD + ghcid_current: NL-NH-AMS-M-DDGD ghcid_original: NL-XX-XXX-M-DDGD - ghcid_uuid: dfc8ca6f-3c25-5bd7-9444-fc482affad31 - ghcid_uuid_sha256: 122993cf-061a-8925-b3a5-bdb49e87451f - ghcid_numeric: 1308739684097775909 + ghcid_uuid: 918191cb-0b1b-52ef-9f89-a91876e7b672 + ghcid_uuid_sha256: a132b2a0-d58a-8be6-b7e0-bf41b618d481 + ghcid_numeric: 11615542792789044198 record_id: e3bb2498-22cf-48e3-8d5c-9c5dc0c398bb generation_timestamp: '2025-12-16T21:06:46.065288+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-DDGD ghcid_numeric: 1308739684097775909 valid_from: '2025-12-17T08:44:26.036192+00:00' - valid_to: null + valid_to: '2025-12-17T10:06:03.451255+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-NH-AMS-M-DDGD + ghcid_numeric: 11615542792789044198 + valid_from: '2025-12-17T10:06:03.451255+00:00' + valid_to: null + reason: Location enriched via Exa web search - Amsterdam, Noord-Holland + location_resolution: + method: EXA_WEB_SEARCH + city_code: AMS + city_name: Amsterdam + region_code: NH + region_name: Noord-Holland + country_code: NL + resolution_date: '2025-12-17T10:06:03.451255+00:00' + source_url: https://www.directorsguild.nl/contact/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:46.065288+00:00' @@ -54,6 +69,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.directorsguild.nl/contact/ + extraction_timestamp: '2025-12-17T10:06:03.451255+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -62,3 +86,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Amsterdam, Noord-Holland' diff --git a/data/custodian/NL-XX-XXX-M-EEM.yaml b/data/custodian/NL-NH-AMS-M-EEM.yaml similarity index 60% rename from data/custodian/NL-XX-XXX-M-EEM.yaml rename to data/custodian/NL-NH-AMS-M-EEM.yaml index dccfc60e15..66010083b0 100644 --- a/data/custodian/NL-XX-XXX-M-EEM.yaml +++ b/data/custodian/NL-NH-AMS-M-EEM.yaml @@ -18,28 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/eddie-the-eagle-museum.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Amsterdam + region: Noord-Holland country: NL + address: Amsterdam, Netherlands ghcid: - ghcid_current: NL-XX-XXX-M-EEM + ghcid_current: NL-NH-AMS-M-EEM ghcid_original: NL-XX-XXX-M-EEM - ghcid_uuid: 13bc9959-7082-5d46-bd65-825b494a755f - ghcid_uuid_sha256: 4a81f985-bb1f-8275-98cf-b5550faf1698 - ghcid_numeric: 5368846583567700597 + ghcid_uuid: ca8ffd5a-ae44-5a97-aa5f-b470c2889849 + ghcid_uuid_sha256: 0b19894f-1307-8a1a-828a-3f5550e5bc6d + ghcid_numeric: 799821381549623834 record_id: bd5b97ab-2d9b-411a-87ef-4190f7694ea5 generation_timestamp: '2025-12-16T21:06:36.344748+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-EEM ghcid_numeric: 5368846583567700597 valid_from: '2025-12-16T21:06:36.344748+00:00' - valid_to: null + valid_to: '2025-12-17T09:25:04.153616+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-NH-AMS-M-EEM + ghcid_numeric: 799821381549623834 + valid_from: '2025-12-17T09:25:04.153616+00:00' + valid_to: null + reason: Location enriched via Exa web search - Amsterdam, Noord-Holland location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: AMS + city_name: Amsterdam + region_code: NH + region_name: Noord-Holland country_code: NL + resolution_date: '2025-12-17T09:25:04.153616+00:00' + source_url: https://www.eddie-the-eagle-museum.com/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:36.344748+00:00' @@ -56,9 +66,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.eddie-the-eagle-museum.com/ + extraction_timestamp: '2025-12-17T09:25:04.153616+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Amsterdam, Noord-Holland' diff --git a/data/custodian/NL-XX-XXX-M-EM-erotisch_museum.yaml b/data/custodian/NL-NH-AMS-M-EM-erotisch_museum.yaml similarity index 59% rename from data/custodian/NL-XX-XXX-M-EM-erotisch_museum.yaml rename to data/custodian/NL-NH-AMS-M-EM-erotisch_museum.yaml index d440925fec..0f9fc991fc 100644 --- a/data/custodian/NL-XX-XXX-M-EM-erotisch_museum.yaml +++ b/data/custodian/NL-NH-AMS-M-EM-erotisch_museum.yaml @@ -18,28 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/erotisch-museum.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Amsterdam + region: Noord-Holland country: NL + address: Oudezijds Achterburgwal 54, 1012 DP Amsterdam ghcid: - ghcid_current: NL-XX-XXX-M-EM-erotisch_museum + ghcid_current: NL-NH-AMS-M-EM-erotisch_museum ghcid_original: NL-XX-XXX-M-EM-erotisch_museum - ghcid_uuid: bb4cab24-67cd-5fd5-81ae-a23a875e15b6 - ghcid_uuid_sha256: 7e6cc478-4325-8950-8c84-78ec611b00c8 - ghcid_numeric: 9109872167065323856 + ghcid_uuid: 5f62f68f-f9fa-5300-8be8-e189faf31ea4 + ghcid_uuid_sha256: fff75562-9984-8ad1-87c7-cf7a85b16c89 + ghcid_numeric: 18444304680889912017 record_id: b35f2b5c-438b-4f53-98e8-6836db080fdd generation_timestamp: '2025-12-16T21:06:40.810369+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-EM-erotisch_museum ghcid_numeric: 9109872167065323856 valid_from: '2025-12-16T21:06:40.810369+00:00' - valid_to: null + valid_to: '2025-12-17T09:57:11.842394+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-NH-AMS-M-EM-erotisch_museum + ghcid_numeric: 18444304680889912017 + valid_from: '2025-12-17T09:57:11.842394+00:00' + valid_to: null + reason: Location enriched via Exa web search - Amsterdam, Noord-Holland location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: AMS + city_name: Amsterdam + region_code: NH + region_name: Noord-Holland country_code: NL + resolution_date: '2025-12-17T09:57:11.842394+00:00' + source_url: https://erotisch-museum.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:40.810369+00:00' @@ -56,9 +66,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://erotisch-museum.nl/ + extraction_timestamp: '2025-12-17T09:57:11.842394+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Amsterdam, Noord-Holland' diff --git a/data/custodian/NL-XX-XXX-M-GMEBV.yaml b/data/custodian/NL-NH-AMS-M-GMEBV.yaml similarity index 60% rename from data/custodian/NL-XX-XXX-M-GMEBV.yaml rename to data/custodian/NL-NH-AMS-M-GMEBV.yaml index 6cf986b566..1eae745d3d 100644 --- a/data/custodian/NL-XX-XXX-M-GMEBV.yaml +++ b/data/custodian/NL-NH-AMS-M-GMEBV.yaml @@ -18,28 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/van-gogh-museum-enterprises-b-v.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Amsterdam + region: Noord-Holland country: NL + address: Gabriel Metsustraat 8, 1071 EA Amsterdam ghcid: - ghcid_current: NL-XX-XXX-M-GMEBV + ghcid_current: NL-NH-AMS-M-GMEBV ghcid_original: NL-XX-XXX-M-GMEBV - ghcid_uuid: c08ffbd9-798e-5759-99a9-6ebcca90eaf6 - ghcid_uuid_sha256: d180b682-bda8-8c1b-a59b-23d28bbadf01 - ghcid_numeric: 15096266623589833755 + ghcid_uuid: 37b64938-f8fa-5c8e-9491-518df13f6217 + ghcid_uuid_sha256: b111cb97-78ad-8caa-88f5-ee638ae4422c + ghcid_numeric: 12759203070742441130 record_id: 1b2f11f2-09a6-4238-9ece-7ecf802f2bf6 generation_timestamp: '2025-12-16T21:06:39.631236+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-GMEBV ghcid_numeric: 15096266623589833755 valid_from: '2025-12-16T21:06:39.631236+00:00' - valid_to: null + valid_to: '2025-12-17T09:57:11.875121+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-NH-AMS-M-GMEBV + ghcid_numeric: 12759203070742441130 + valid_from: '2025-12-17T09:57:11.875121+00:00' + valid_to: null + reason: Location enriched via Exa web search - Amsterdam, Noord-Holland location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: AMS + city_name: Amsterdam + region_code: NH + region_name: Noord-Holland country_code: NL + resolution_date: '2025-12-17T09:57:11.875121+00:00' + source_url: https://www.vangoghmuseum.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:39.631236+00:00' @@ -56,9 +66,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.vangoghmuseum.nl/ + extraction_timestamp: '2025-12-17T09:57:11.875121+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Amsterdam, Noord-Holland' diff --git a/data/custodian/NL-XX-XXX-M-MGR.yaml b/data/custodian/NL-NH-DEB-M-MGR.yaml similarity index 62% rename from data/custodian/NL-XX-XXX-M-MGR.yaml rename to data/custodian/NL-NH-DEB-M-MGR.yaml index 287a86046f..db866f5fc5 100644 --- a/data/custodian/NL-XX-XXX-M-MGR.yaml +++ b/data/custodian/NL-NH-DEB-M-MGR.yaml @@ -21,23 +21,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/museum-galerie-rat.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Den Burg + region: Noord-Holland country: NL + address: Burgwal 20, 1791 Den Burg, Texel ghcid: - ghcid_current: NL-XX-XXX-M-MGR + ghcid_current: NL-NH-DEB-M-MGR ghcid_original: NL-XX-XXX-M-MGR - ghcid_uuid: 429368ac-f508-5f8a-85c9-45a0e2f17ede - ghcid_uuid_sha256: e316442c-29a1-85ba-8466-96b219533229 - ghcid_numeric: 16363341252565001658 + ghcid_uuid: 181eacab-1bc0-5d2e-9cb3-323d13d4af7d + ghcid_uuid_sha256: 62635b76-af7b-8348-a0c4-3e807eb3c11b + ghcid_numeric: 7089610803719668552 record_id: ac9f145d-7a7a-433d-871a-3f2b6d08b418 generation_timestamp: '2025-12-16T21:06:38.459660+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-MGR ghcid_numeric: 16363341252565001658 valid_from: '2025-12-17T08:44:26.014402+00:00' - valid_to: null + valid_to: '2025-12-17T10:56:09.466192+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-NH-DEB-M-MGR + ghcid_numeric: 7089610803719668552 + valid_from: '2025-12-17T10:56:09.466192+00:00' + valid_to: null + reason: Location enriched via Exa web search - Den Burg, Noord-Holland + location_resolution: + method: EXA_WEB_SEARCH + city_code: DEB + city_name: Den Burg + region_code: NH + region_name: Noord-Holland + country_code: NL + resolution_date: '2025-12-17T10:56:09.466192+00:00' + source_url: https://www.mapquest.com/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:38.459660+00:00' @@ -54,6 +69,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.mapquest.com/ + extraction_timestamp: '2025-12-17T10:56:09.466192+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -62,3 +86,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Den Burg, Noord-Holland' diff --git a/data/custodian/NL-XX-XXX-M-FM-flessenscheepjes_museum.yaml b/data/custodian/NL-NH-ENK-M-FM-flessenscheepjes_museum.yaml similarity index 59% rename from data/custodian/NL-XX-XXX-M-FM-flessenscheepjes_museum.yaml rename to data/custodian/NL-NH-ENK-M-FM-flessenscheepjes_museum.yaml index adf5b2ef08..9c7574d444 100644 --- a/data/custodian/NL-XX-XXX-M-FM-flessenscheepjes_museum.yaml +++ b/data/custodian/NL-NH-ENK-M-FM-flessenscheepjes_museum.yaml @@ -18,28 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/flessenscheepjes-museum.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Enkhuizen + region: Noord-Holland country: NL + address: Zuiderspui 1, 1601 GN Enkhuizen ghcid: - ghcid_current: NL-XX-XXX-M-FM-flessenscheepjes_museum + ghcid_current: NL-NH-ENK-M-FM-flessenscheepjes_museum ghcid_original: NL-XX-XXX-M-FM-flessenscheepjes_museum - ghcid_uuid: 97c8b3fd-d3fe-56f8-8347-200b16870c5a - ghcid_uuid_sha256: ac6ed3ce-d178-8ef6-aa8b-809066354c99 - ghcid_numeric: 12425101307192844022 + ghcid_uuid: 9b9ca02a-fdf6-56d6-b459-606fbeb06876 + ghcid_uuid_sha256: 200ffdc7-eea1-8fc5-8519-21259ce03cf6 + ghcid_numeric: 2310344169008254917 record_id: cbc2e3fa-e583-45d3-a439-9068faa1ad07 generation_timestamp: '2025-12-16T21:06:40.027467+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-FM-flessenscheepjes_museum ghcid_numeric: 12425101307192844022 valid_from: '2025-12-16T21:06:40.027467+00:00' - valid_to: null + valid_to: '2025-12-17T09:25:04.131278+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-NH-ENK-M-FM-flessenscheepjes_museum + ghcid_numeric: 2310344169008254917 + valid_from: '2025-12-17T09:25:04.131278+00:00' + valid_to: null + reason: Location enriched via Exa web search - Enkhuizen, Noord-Holland location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: ENK + city_name: Enkhuizen + region_code: NH + region_name: Noord-Holland country_code: NL + resolution_date: '2025-12-17T09:25:04.131278+00:00' + source_url: https://www.flessenscheepjesmuseum.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:40.027467+00:00' @@ -56,9 +66,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.flessenscheepjesmuseum.nl/ + extraction_timestamp: '2025-12-17T09:25:04.131278+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Enkhuizen, Noord-Holland' diff --git a/data/custodian/NL-XX-XXX-M-CM-c1000_museum.yaml b/data/custodian/NL-OV-HEL-M-CM-c1000_museum.yaml similarity index 60% rename from data/custodian/NL-XX-XXX-M-CM-c1000_museum.yaml rename to data/custodian/NL-OV-HEL-M-CM-c1000_museum.yaml index b6c041939d..2361cb86bf 100644 --- a/data/custodian/NL-XX-XXX-M-CM-c1000_museum.yaml +++ b/data/custodian/NL-OV-HEL-M-CM-c1000_museum.yaml @@ -18,28 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/c1000-museum.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Hellendoorn + region: Overijssel country: NL + address: Katenhorstweg 2, 7447 RN Hellendoorn ghcid: - ghcid_current: NL-XX-XXX-M-CM-c1000_museum + ghcid_current: NL-OV-HEL-M-CM-c1000_museum ghcid_original: NL-XX-XXX-M-CM-c1000_museum - ghcid_uuid: 1ca741dc-8ca8-5e04-a15f-3d12fbcef31d - ghcid_uuid_sha256: b92c4170-b851-81f2-8aa3-b844c73b7104 - ghcid_numeric: 13343111748376396274 + ghcid_uuid: 23ca8d87-2929-59d3-a67d-9a70e3a30e81 + ghcid_uuid_sha256: 13ca320c-b106-895a-a8a2-7cf17e62a22b + ghcid_numeric: 1426007262107171162 record_id: 1428fc8d-3fcf-41a4-b9cf-f000c2cee234 generation_timestamp: '2025-12-16T21:06:46.862264+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-CM-c1000_museum ghcid_numeric: 13343111748376396274 valid_from: '2025-12-16T21:06:46.862264+00:00' - valid_to: null + valid_to: '2025-12-17T09:33:15.763818+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-OV-HEL-M-CM-c1000_museum + ghcid_numeric: 1426007262107171162 + valid_from: '2025-12-17T09:33:15.763818+00:00' + valid_to: null + reason: Location enriched via Exa web search - Hellendoorn, Overijssel location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: HEL + city_name: Hellendoorn + region_code: OV + region_name: Overijssel country_code: NL + resolution_date: '2025-12-17T09:33:15.763818+00:00' + source_url: https://www.c1000museum.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:46.862264+00:00' @@ -56,9 +66,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.c1000museum.nl/ + extraction_timestamp: '2025-12-17T09:33:15.763818+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Hellendoorn, Overijssel' diff --git a/data/custodian/NL-XX-XXX-M-MEH.yaml b/data/custodian/NL-OV-HEL-M-MEH.yaml similarity index 61% rename from data/custodian/NL-XX-XXX-M-MEH.yaml rename to data/custodian/NL-OV-HEL-M-MEH.yaml index e634d3adad..2ec81c72d5 100644 --- a/data/custodian/NL-XX-XXX-M-MEH.yaml +++ b/data/custodian/NL-OV-HEL-M-MEH.yaml @@ -18,23 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/museum-erve-hofman.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Hellendoorn + region: Overijssel country: NL + address: Hofmanstraat 2, 7447 AS Hellendoorn ghcid: - ghcid_current: NL-XX-XXX-M-MEH + ghcid_current: NL-OV-HEL-M-MEH ghcid_original: NL-XX-XXX-M-MEH - ghcid_uuid: c3289aa2-9498-57b6-b7f9-02e6680143b4 - ghcid_uuid_sha256: fb2403ee-f058-84a1-8014-d00e7832e0fc - ghcid_numeric: 18096593527450940577 + ghcid_uuid: c48fb5e7-c5cc-544d-a446-cbaf423febc6 + ghcid_uuid_sha256: f974021f-883b-8c6c-bb8f-18ee6041b691 + ghcid_numeric: 17974994347195337836 record_id: aafc1760-7283-4a18-8aea-ff347f86bcd5 generation_timestamp: '2025-12-16T21:06:37.002843+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-MEH ghcid_numeric: 18096593527450940577 valid_from: '2025-12-17T08:44:26.021837+00:00' - valid_to: null + valid_to: '2025-12-17T10:41:01.945830+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-OV-HEL-M-MEH + ghcid_numeric: 17974994347195337836 + valid_from: '2025-12-17T10:41:01.945830+00:00' + valid_to: null + reason: Location enriched via Exa web search - Hellendoorn, Overijssel + location_resolution: + method: EXA_WEB_SEARCH + city_code: HEL + city_name: Hellendoorn + region_code: OV + region_name: Overijssel + country_code: NL + resolution_date: '2025-12-17T10:41:01.945830+00:00' + source_url: https://www.oaldheldern.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:37.002843+00:00' @@ -51,6 +66,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.oaldheldern.nl/ + extraction_timestamp: '2025-12-17T10:41:01.945830+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -59,3 +83,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Hellendoorn, Overijssel' diff --git a/data/custodian/NL-XX-XXX-M-MAFS.yaml b/data/custodian/NL-OV-SCK-M-MAFS.yaml similarity index 63% rename from data/custodian/NL-XX-XXX-M-MAFS.yaml rename to data/custodian/NL-OV-SCK-M-MAFS.yaml index 18d680f9df..5b3bfe643a 100644 --- a/data/custodian/NL-XX-XXX-M-MAFS.yaml +++ b/data/custodian/NL-OV-SCK-M-MAFS.yaml @@ -21,23 +21,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/museum-averlo-frieswijk-schalkhaar.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Schalkhaar + region: Overijssel country: NL + address: Frieswijkerweg 7, 7433 RB Schalkhaar ghcid: - ghcid_current: NL-XX-XXX-M-MAFS + ghcid_current: NL-OV-SCK-M-MAFS ghcid_original: NL-XX-XXX-M-MAFS - ghcid_uuid: a0095672-8164-5162-bbeb-1326d8c47c2e - ghcid_uuid_sha256: 418c9005-af59-8721-aff7-09d320097bdc - ghcid_numeric: 4723308463295911713 + ghcid_uuid: 55dcd23c-2bde-524f-b846-b568f848c489 + ghcid_uuid_sha256: 65d5a742-39a5-845f-81de-a188a31e9760 + ghcid_numeric: 7337955070746895455 record_id: cf3d0896-1d2a-49d1-94a2-a5962c995d76 generation_timestamp: '2025-12-16T21:06:45.760441+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-MAFS ghcid_numeric: 4723308463295911713 valid_from: '2025-12-17T08:44:26.071718+00:00' - valid_to: null + valid_to: '2025-12-17T10:56:09.477040+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-OV-SCK-M-MAFS + ghcid_numeric: 7337955070746895455 + valid_from: '2025-12-17T10:56:09.477040+00:00' + valid_to: null + reason: Location enriched via Exa web search - Schalkhaar, Overijssel + location_resolution: + method: EXA_WEB_SEARCH + city_code: SCK + city_name: Schalkhaar + region_code: OV + region_name: Overijssel + country_code: NL + resolution_date: '2025-12-17T10:56:09.477040+00:00' + source_url: https://www.museum-afs.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:45.760441+00:00' @@ -54,6 +69,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.museum-afs.nl/ + extraction_timestamp: '2025-12-17T10:56:09.477040+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -62,3 +86,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Schalkhaar, Overijssel' diff --git a/data/custodian/NL-XX-XXX-M-MDH.yaml b/data/custodian/NL-UT-SCH-M-MDH.yaml similarity index 62% rename from data/custodian/NL-XX-XXX-M-MDH.yaml rename to data/custodian/NL-UT-SCH-M-MDH.yaml index a1ee733e28..86ca050eca 100644 --- a/data/custodian/NL-XX-XXX-M-MDH.yaml +++ b/data/custodian/NL-UT-SCH-M-MDH.yaml @@ -21,23 +21,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/museum-dijkmagazijn-de-heul.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Schalkwijk + region: Utrecht country: NL + address: Provincialeweg 70, 3998 JK Schalkwijk ghcid: - ghcid_current: NL-XX-XXX-M-MDH + ghcid_current: NL-UT-SCH-M-MDH ghcid_original: NL-XX-XXX-M-MDH - ghcid_uuid: 9a5ac714-4ad1-59f8-9262-72cc6d85edeb - ghcid_uuid_sha256: f2883142-38d3-88b3-87c8-2eaa798c5d80 - ghcid_numeric: 17476272514502215859 + ghcid_uuid: c9455255-b55c-5df9-ac7d-b2dcebd80af4 + ghcid_uuid_sha256: 9fc9707e-9dda-8a57-b694-011dc66da335 + ghcid_numeric: 11513857611465906775 record_id: a8300219-47d6-4b17-b9da-5e8e5e96ce49 generation_timestamp: '2025-12-16T21:06:45.958015+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-MDH ghcid_numeric: 17476272514502215859 valid_from: '2025-12-17T08:44:26.064337+00:00' - valid_to: null + valid_to: '2025-12-17T10:41:01.934919+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-UT-SCH-M-MDH + ghcid_numeric: 11513857611465906775 + valid_from: '2025-12-17T10:41:01.934919+00:00' + valid_to: null + reason: Location enriched via Exa web search - Schalkwijk, Utrecht + location_resolution: + method: EXA_WEB_SEARCH + city_code: SCH + city_name: Schalkwijk + region_code: UT + region_name: Utrecht + country_code: NL + resolution_date: '2025-12-17T10:41:01.934919+00:00' + source_url: https://www.museuminschalkwijk.nl/contact.html provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:45.958015+00:00' @@ -54,6 +69,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.museuminschalkwijk.nl/contact.html + extraction_timestamp: '2025-12-17T10:41:01.934919+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -62,3 +86,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Schalkwijk, Utrecht' diff --git a/data/custodian/NL-XX-XXX-M-AM.yaml b/data/custodian/NL-XX-XXX-M-AM.yaml deleted file mode 100644 index ea7b3bdf82..0000000000 --- a/data/custodian/NL-XX-XXX-M-AM.yaml +++ /dev/null @@ -1,64 +0,0 @@ -custodian_name: - emic_name: Ajax Museum - emic_name_source: linkedin -institution_type: -- M -linkedin_enrichment: - linkedin_url: https://www.linkedin.com/company/ajax-museum - linkedin_slug: ajax-museum - industry: Museums, Historical Sites, and Zoos - website: https://lnkd.in/ezz5r9nF - follower_count: 5,707 - staff_count: 1 - heritage_staff_count: 0 - heritage_staff: [] - enrichment_timestamp: '2025-12-16T21:06:39.152742+00:00' - provenance: - source: linkedin_company_scrape - original_file: data/custodian/linkedin/ajax-museum.yaml - schema_version: 1.0.0 -location: - city: '' - region: XX - country: NL -ghcid: - ghcid_current: NL-XX-XXX-M-AM - ghcid_original: NL-XX-XXX-M-AM - ghcid_uuid: 44e6a20c-0e8e-509c-a126-749148b44831 - ghcid_uuid_sha256: f2392c8d-320f-8be0-9a91-2e8d6d706953 - ghcid_numeric: 17454030815792942048 - record_id: 1bbc810e-b76d-4d89-8351-99e851dae39f - generation_timestamp: '2025-12-16T21:06:39.152742+00:00' - ghcid_history: - - ghcid: NL-XX-XXX-M-AM - ghcid_numeric: 17454030815792942048 - valid_from: '2025-12-16T21:06:39.152742+00:00' - valid_to: null - reason: Initial GHCID assignment from LinkedIn batch import - location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX - country_code: NL -provenance: - schema_version: 1.0.0 - generated_at: '2025-12-16T21:06:39.152742+00:00' - sources: - linkedin: - - source_type: linkedin_company_profile - data_tier: TIER_4_INFERRED - source_file: data/custodian/linkedin/ajax-museum.yaml - extraction_timestamp: '2025-12-16T21:06:39.152742+00:00' - claims_extracted: - - name - - industry - - location - - website - - staff_count - - heritage_staff - data_tier_summary: - TIER_4_INFERRED: - - linkedin_company_profile - notes: - - Created from unmatched LinkedIn company profile - - 'Location resolution method: UNRESOLVED' diff --git a/data/custodian/NL-XX-XXX-M-HKM.yaml b/data/custodian/NL-XX-XXX-M-HKM.yaml deleted file mode 100644 index 9fa5b44eef..0000000000 --- a/data/custodian/NL-XX-XXX-M-HKM.yaml +++ /dev/null @@ -1,64 +0,0 @@ -custodian_name: - emic_name: Hollands Kaas Museum - emic_name_source: linkedin -institution_type: -- M -linkedin_enrichment: - linkedin_url: https://www.linkedin.com/company/hollands-kaas-museum - linkedin_slug: hollands-kaas-museum - industry: Museums, Historical Sites, and Zoos - website: null - follower_count: 5,618,343 - staff_count: 1 - heritage_staff_count: 0 - heritage_staff: [] - enrichment_timestamp: '2025-12-16T21:06:41.385742+00:00' - provenance: - source: linkedin_company_scrape - original_file: data/custodian/linkedin/hollands-kaas-museum.yaml - schema_version: 1.0.0 -location: - city: '' - region: XX - country: NL -ghcid: - ghcid_current: NL-XX-XXX-M-HKM - ghcid_original: NL-XX-XXX-M-HKM - ghcid_uuid: b936825d-f6f5-5f75-9693-59ffe0983b6e - ghcid_uuid_sha256: bfd2770a-451a-80ec-8095-a0315a56c4eb - ghcid_numeric: 13822241092346228972 - record_id: b51e4aff-c0c7-40da-b064-3f308125b650 - generation_timestamp: '2025-12-16T21:06:41.385742+00:00' - ghcid_history: - - ghcid: NL-XX-XXX-M-HKM - ghcid_numeric: 13822241092346228972 - valid_from: '2025-12-16T21:06:41.385742+00:00' - valid_to: null - reason: Initial GHCID assignment from LinkedIn batch import - location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX - country_code: NL -provenance: - schema_version: 1.0.0 - generated_at: '2025-12-16T21:06:41.385742+00:00' - sources: - linkedin: - - source_type: linkedin_company_profile - data_tier: TIER_4_INFERRED - source_file: data/custodian/linkedin/hollands-kaas-museum.yaml - extraction_timestamp: '2025-12-16T21:06:41.385742+00:00' - claims_extracted: - - name - - industry - - location - - website - - staff_count - - heritage_staff - data_tier_summary: - TIER_4_INFERRED: - - linkedin_company_profile - notes: - - Created from unmatched LinkedIn company profile - - 'Location resolution method: UNRESOLVED' diff --git a/data/custodian/NL-XX-XXX-M-KM.yaml b/data/custodian/NL-ZH-BOD-M-KM.yaml similarity index 60% rename from data/custodian/NL-XX-XXX-M-KM.yaml rename to data/custodian/NL-ZH-BOD-M-KM.yaml index c75bbac7ab..5ddece0d35 100644 --- a/data/custodian/NL-XX-XXX-M-KM.yaml +++ b/data/custodian/NL-ZH-BOD-M-KM.yaml @@ -18,28 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/het-kaas-museum.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Bodegraven + region: Zuid-Holland country: NL + address: Marktstraat 1, 2411 BE Bodegraven ghcid: - ghcid_current: NL-XX-XXX-M-KM + ghcid_current: NL-ZH-BOD-M-KM ghcid_original: NL-XX-XXX-M-KM - ghcid_uuid: 7846a559-0853-5206-b4b9-466f633e8f37 - ghcid_uuid_sha256: cb461ec7-5b09-808f-9bc2-1c805d2534dd - ghcid_numeric: 14647428679643816079 + ghcid_uuid: a36d9483-7116-5e2a-97fe-182b3517f1ef + ghcid_uuid_sha256: 2c53af73-8d88-8c89-b68d-cc86cc3491bb + ghcid_numeric: 3194089471566462089 record_id: 91fffa60-6f4f-4cb9-9579-385811b087a6 generation_timestamp: '2025-12-16T21:06:36.526045+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-KM ghcid_numeric: 14647428679643816079 valid_from: '2025-12-16T21:06:36.526045+00:00' - valid_to: null + valid_to: '2025-12-17T10:08:05.564102+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-ZH-BOD-M-KM + ghcid_numeric: 3194089471566462089 + valid_from: '2025-12-17T10:08:05.564102+00:00' + valid_to: null + reason: Location enriched via Exa web search - Bodegraven, Zuid-Holland location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: BOD + city_name: Bodegraven + region_code: ZH + region_name: Zuid-Holland country_code: NL + resolution_date: '2025-12-17T10:08:05.564102+00:00' + source_url: https://www.hetkaasmuseum.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:36.526045+00:00' @@ -56,9 +66,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.hetkaasmuseum.nl/ + extraction_timestamp: '2025-12-17T10:08:05.564102+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Bodegraven, Zuid-Holland' diff --git a/data/custodian/NL-XX-XXX-E-APADD.yaml b/data/custodian/NL-ZH-DHA-E-APADD.yaml similarity index 84% rename from data/custodian/NL-XX-XXX-E-APADD.yaml rename to data/custodian/NL-ZH-DHA-E-APADD.yaml index b0ad128187..df7575a912 100644 --- a/data/custodian/NL-XX-XXX-E-APADD.yaml +++ b/data/custodian/NL-ZH-DHA-E-APADD.yaml @@ -16,12 +16,14 @@ linkedin_enrichment: headline: '' heritage_type: M - name: Oumaima Hajri أميمة حاجري - headline: AI Ethicist/Data Scientist | Sr. International Advisor, Dutch DPA | AI Ethics & Society, University of Cambridge - | Elsevier 30 under 30 | Public speaker + headline: AI Ethicist/Data Scientist | Sr. International Advisor, Dutch DPA | + AI Ethics & Society, University of Cambridge | Elsevier 30 under 30 | Public + speaker linkedin_url: https://www.linkedin.com/in/oumaima-hajri heritage_type: S - name: Annemarie Bloemen-Patberg - headline: Senior Strategic Advisor AI law @Dutch DCA / AI for Business @Oxford University Saïd Business School + headline: Senior Strategic Advisor AI law @Dutch DCA / AI for Business @Oxford + University Saïd Business School linkedin_url: https://www.linkedin.com/in/annemarie-bloemen-patberg-2203bb5 heritage_type: E - name: Mies Beljaars - Snellen van Vollenhoven @@ -60,7 +62,8 @@ linkedin_enrichment: linkedin_url: https://www.linkedin.com/in/samira-farouk-0b2520b6 heritage_type: R - name: Emma-Julia Vuijk - headline: Double Master Student Law and Technology & International and European Law - Werkstudent Autoriteit Persoonsgegevens + headline: Double Master Student Law and Technology & International and European + Law - Werkstudent Autoriteit Persoonsgegevens linkedin_url: https://www.linkedin.com/in/emmajuliavuijk heritage_type: E - name: Melike Yeniay @@ -140,7 +143,8 @@ linkedin_enrichment: linkedin_url: https://www.linkedin.com/in/mr-anne-loes-van-den-brand-valk-73583557 heritage_type: R - name: Ruqaya Zaki - headline: BSc Law Student at Leiden University | Judicial supporter @ Dutch Data Protection Authority + headline: BSc Law Student at Leiden University | Judicial supporter @ Dutch Data + Protection Authority linkedin_url: https://www.linkedin.com/in/ruqaya-zaki heritage_type: E - name: Tessa van Wickevoort Crommelin-van Velzen @@ -160,28 +164,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/autoriteit-persoonsgegevens-ap-dutch-dpa.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Den Haag + region: Zuid-Holland country: NL + address: Bezuidenhoutseweg 30, 2594 AV Den Haag ghcid: - ghcid_current: NL-XX-XXX-E-APADD + ghcid_current: NL-ZH-DHA-E-APADD ghcid_original: NL-XX-XXX-E-APADD - ghcid_uuid: d5ccddb8-f488-5cf8-98e1-bd7343c9a0fd - ghcid_uuid_sha256: c6433cf3-6117-812b-ae67-99c499d6eb42 - ghcid_numeric: 14286329458952962347 + ghcid_uuid: 370a68bc-969d-53a9-811a-ee3b1d2ef12b + ghcid_uuid_sha256: 237c1e87-0bb9-8f2e-a36d-36d950cbe0a3 + ghcid_numeric: 2556952253805727534 record_id: acf11347-204a-40e8-8098-6ad5ea33e6f3 generation_timestamp: '2025-12-16T21:06:42.375776+00:00' ghcid_history: - ghcid: NL-XX-XXX-E-APADD ghcid_numeric: 14286329458952962347 valid_from: '2025-12-16T21:06:42.375776+00:00' - valid_to: null + valid_to: '2025-12-17T09:57:11.740348+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-ZH-DHA-E-APADD + ghcid_numeric: 2556952253805727534 + valid_from: '2025-12-17T09:57:11.740348+00:00' + valid_to: null + reason: Location enriched via Exa web search - Den Haag, Zuid-Holland location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: DHA + city_name: Den Haag + region_code: ZH + region_name: Zuid-Holland country_code: NL + resolution_date: '2025-12-17T09:57:11.740348+00:00' + source_url: https://autoriteitpersoonsgegevens.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:42.375776+00:00' @@ -198,9 +212,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://autoriteitpersoonsgegevens.nl/ + extraction_timestamp: '2025-12-17T09:57:11.740348+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Den Haag, Zuid-Holland' diff --git a/data/custodian/NL-XX-XXX-E-IJV.yaml b/data/custodian/NL-ZH-DHA-E-IJV.yaml similarity index 76% rename from data/custodian/NL-XX-XXX-E-IJV.yaml rename to data/custodian/NL-ZH-DHA-E-IJV.yaml index c393a49fd4..35dc6725df 100644 --- a/data/custodian/NL-XX-XXX-E-IJV.yaml +++ b/data/custodian/NL-ZH-DHA-E-IJV.yaml @@ -35,7 +35,8 @@ linkedin_enrichment: linkedin_url: https://www.linkedin.com/in/anna-holties-771939152 heritage_type: M - name: Lianne Sleutjes - headline: Woordvoerder Inspectie Justitie en Veiligheid at Ministerie van Justitie en Veiligheid + headline: Woordvoerder Inspectie Justitie en Veiligheid at Ministerie van Justitie + en Veiligheid linkedin_url: https://www.linkedin.com/in/lianne-sleutjes-a805338 heritage_type: O - name: Daman Jafra @@ -43,7 +44,8 @@ linkedin_enrichment: linkedin_url: https://www.linkedin.com/in/daman-jafra-32b1bb236 heritage_type: E - name: Selene Fagel - headline: Coördinerend specialistisch inspecteur (PhD) Familie inspecteur Vertrouwenspersoon Inspectie Justitie en Veiligheid + headline: Coördinerend specialistisch inspecteur (PhD) Familie inspecteur Vertrouwenspersoon + Inspectie Justitie en Veiligheid linkedin_url: https://www.linkedin.com/in/selene-fagel-1287645 heritage_type: E - name: Kirsten Van Noort @@ -51,7 +53,8 @@ linkedin_enrichment: linkedin_url: https://www.linkedin.com/in/kirsten-van-noort-4385812b7 heritage_type: M - name: Wieger van der Heide - headline: Senior inspecteur bij het Ministerie van VenJ / Inspectie Veiligheid en Justitie + headline: Senior inspecteur bij het Ministerie van VenJ / Inspectie Veiligheid + en Justitie linkedin_url: https://www.linkedin.com/in/wieger-van-der-heide-91857478 heritage_type: O - name: Madhu R. @@ -72,28 +75,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/inspectie-justitie-en-veiligheid.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Den Haag + region: Zuid-Holland country: NL + address: Hoge Nieuwstraat 8, 2514 EL Den Haag ghcid: - ghcid_current: NL-XX-XXX-E-IJV + ghcid_current: NL-ZH-DHA-E-IJV ghcid_original: NL-XX-XXX-E-IJV - ghcid_uuid: f17d729f-be1d-544f-846f-893be1caf69c - ghcid_uuid_sha256: 236e4c6e-f6da-885a-9aa7-2c0be92d8a2a - ghcid_numeric: 2553062078237304922 + ghcid_uuid: f7fc9fb4-146c-51e9-a5e8-c8fea8c7c34c + ghcid_uuid_sha256: 1251c359-7bcf-8c90-8a5e-1718a915cafe + ghcid_numeric: 1320050954892979344 record_id: 4c890a50-1738-45fd-b173-a38eb7fffa3f generation_timestamp: '2025-12-16T21:06:47.359970+00:00' ghcid_history: - ghcid: NL-XX-XXX-E-IJV ghcid_numeric: 2553062078237304922 valid_from: '2025-12-16T21:06:47.359970+00:00' - valid_to: null + valid_to: '2025-12-17T09:57:11.821589+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-ZH-DHA-E-IJV + ghcid_numeric: 1320050954892979344 + valid_from: '2025-12-17T09:57:11.821589+00:00' + valid_to: null + reason: Location enriched via Exa web search - Den Haag, Zuid-Holland location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: DHA + city_name: Den Haag + region_code: ZH + region_name: Zuid-Holland country_code: NL + resolution_date: '2025-12-17T09:57:11.821589+00:00' + source_url: https://www.inspectie-jenv.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:47.359970+00:00' @@ -110,9 +123,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.inspectie-jenv.nl/ + extraction_timestamp: '2025-12-17T09:57:11.821589+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Den Haag, Zuid-Holland' diff --git a/data/custodian/NL-XX-XXX-E-RC.yaml b/data/custodian/NL-ZH-DHA-E-RC.yaml similarity index 88% rename from data/custodian/NL-XX-XXX-E-RC.yaml rename to data/custodian/NL-ZH-DHA-E-RC.yaml index b592460ede..3341a43e7a 100644 --- a/data/custodian/NL-XX-XXX-E-RC.yaml +++ b/data/custodian/NL-ZH-DHA-E-RC.yaml @@ -30,7 +30,8 @@ linkedin_enrichment: linkedin_url: https://www.linkedin.com/in/pieter-bots-78140a22 heritage_type: E - name: Annet Pasveer - headline: Architectuurhistoricus | Senior beleidsadviseur Monumenten & Archeologie bij Raad voor Cultuur + headline: Architectuurhistoricus | Senior beleidsadviseur Monumenten & Archeologie + bij Raad voor Cultuur linkedin_url: https://www.linkedin.com/in/annetpasveer heritage_type: R - name: Mirjam Sneeuwloper @@ -38,7 +39,8 @@ linkedin_enrichment: linkedin_url: https://www.linkedin.com/in/mirjamsneeuwloper heritage_type: M - name: Kiran Sukul - headline: Sr. beleidsadviseur musea Raad voor Cultuur • Kunst, Cultuur & Erfgoed • Governance + headline: Sr. beleidsadviseur musea Raad voor Cultuur • Kunst, Cultuur & Erfgoed + • Governance linkedin_url: https://www.linkedin.com/in/sukul13881 heritage_type: M - name: Ronald Nijboer @@ -55,7 +57,8 @@ linkedin_enrichment: linkedin_url: https://www.linkedin.com/in/philippine-jenster-15567156 heritage_type: L - name: Kirsten de Graaff - headline: Specialist/adviseur cultuureducatie, cultuurmakers en woordkunst. Beleidsmatig, strategisch en uitvoerend. + headline: Specialist/adviseur cultuureducatie, cultuurmakers en woordkunst. Beleidsmatig, + strategisch en uitvoerend. linkedin_url: https://www.linkedin.com/in/kirsten-de-graaff-76467a2 heritage_type: E - name: Marc de Beyer @@ -66,7 +69,8 @@ linkedin_enrichment: headline: Bureau of the Dutch Council for Culture, The Hague linkedin_url: https://www.linkedin.com/in/marieke-van-ommeren-b6206438 - name: Christien Bok - headline: creatieve initiator van innovaties voor veilig en toegankelijk onderwijs van hoge kwaliteit + headline: creatieve initiator van innovaties voor veilig en toegankelijk onderwijs + van hoge kwaliteit linkedin_url: https://www.linkedin.com/in/christienbok heritage_type: E - name: Lejo Schenk @@ -84,7 +88,8 @@ linkedin_enrichment: linkedin_url: https://www.linkedin.com/in/evakleeman heritage_type: M - name: Judi Mesman - headline: Distinguished professor societal responsibility and impact, author of Leadership in color (Leiderschap in kleur) + headline: Distinguished professor societal responsibility and impact, author of + Leadership in color (Leiderschap in kleur) linkedin_url: https://www.linkedin.com/in/judi-mesman-64279b140 heritage_type: E - name: Madelon Van Wandelen @@ -125,7 +130,8 @@ linkedin_enrichment: linkedin_url: https://www.linkedin.com/in/gwen-parry-7923ba13b heritage_type: R - name: Femke van Hest - headline: Strategisch adviseur cultuur gemeente ‘s-Hertogenbosch | Adviseur Raad voor Cultuur + headline: Strategisch adviseur cultuur gemeente ‘s-Hertogenbosch | Adviseur Raad + voor Cultuur linkedin_url: https://www.linkedin.com/in/femkevanhest heritage_type: O - name: Ellen Hardy @@ -146,8 +152,8 @@ linkedin_enrichment: headline: directeur-bestuurder bij Cultuurkwadraat / directeur Cultuurconsortium linkedin_url: https://www.linkedin.com/in/josje-de-regt-0a018b52 - name: Wilbert Mutsaers - headline: CEO/Algemeen Directeur Agents After All | Kroonlid Raad voor Cultuur | ex-Spotify, Mojo/Live Nation, NPO 3FM/FunX, - Universal Music & Sony Music + headline: CEO/Algemeen Directeur Agents After All | Kroonlid Raad voor Cultuur + | ex-Spotify, Mojo/Live Nation, NPO 3FM/FunX, Universal Music & Sony Music linkedin_url: https://www.linkedin.com/in/wilbert-mutsaers-22256a - name: Lies Wijnterp PhD headline: Researcher, cultural manager @@ -160,11 +166,13 @@ linkedin_enrichment: headline: Zakelijk leider in de culturele sector | Lerende bij De Metselarij linkedin_url: https://www.linkedin.com/in/elisiape%C3%A7as - name: Otto Berg - headline: Auditor bij CBCT - Certificeringsorganisatie Bibliotheekwerk, Cultuur en Taal + headline: Auditor bij CBCT - Certificeringsorganisatie Bibliotheekwerk, Cultuur + en Taal linkedin_url: https://www.linkedin.com/in/otto-berg-30686410 heritage_type: L - name: Vanessa Lann - headline: Head of Composition for Film and Theatre, at ArtEZ University of the Arts + headline: Head of Composition for Film and Theatre, at ArtEZ University of the + Arts linkedin_url: https://www.linkedin.com/in/vanessa-lann-a51724276 heritage_type: E - name: Ilonka Kolthof @@ -179,7 +187,8 @@ linkedin_enrichment: linkedin_url: https://www.linkedin.com/in/joepvossebeld heritage_type: M - name: Edo Righini - headline: Director of de Doelen; Crown Member of the Dutch Council for Culture. EMBA HEC Paris + headline: Director of de Doelen; Crown Member of the Dutch Council for Culture. + EMBA HEC Paris linkedin_url: https://www.linkedin.com/in/edo-righini-7b303129 - name: Marc Versteeg headline: voor de culturele sector @@ -254,28 +263,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/raad-voor-cultuur.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Den Haag + region: Zuid-Holland country: NL + address: Prins Willem Alexanderhof 20, 2595 BE Den Haag ghcid: - ghcid_current: NL-XX-XXX-E-RC + ghcid_current: NL-ZH-DHA-E-RC ghcid_original: NL-XX-XXX-E-RC - ghcid_uuid: de024a36-abbe-53d1-b137-9a2518941e40 - ghcid_uuid_sha256: dcb4a290-0d37-8352-a637-cacbd563e68f - ghcid_numeric: 15903514923732800338 + ghcid_uuid: 1c22d683-b4d0-5fc4-afec-ad60ef82995f + ghcid_uuid_sha256: 7d58a26e-c63a-8a79-8643-8117147c1b10 + ghcid_numeric: 9032147649347328633 record_id: 716f5d24-baa6-409c-a708-9c07f0241568 generation_timestamp: '2025-12-16T21:06:42.755062+00:00' ghcid_history: - ghcid: NL-XX-XXX-E-RC ghcid_numeric: 15903514923732800338 valid_from: '2025-12-16T21:06:42.755062+00:00' - valid_to: null + valid_to: '2025-12-17T09:57:11.795457+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-ZH-DHA-E-RC + ghcid_numeric: 9032147649347328633 + valid_from: '2025-12-17T09:57:11.795457+00:00' + valid_to: null + reason: Location enriched via Exa web search - Den Haag, Zuid-Holland location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: DHA + city_name: Den Haag + region_code: ZH + region_name: Zuid-Holland country_code: NL + resolution_date: '2025-12-17T09:57:11.795457+00:00' + source_url: https://raadvoorcultuur.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:42.755062+00:00' @@ -292,9 +311,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://raadvoorcultuur.nl/ + extraction_timestamp: '2025-12-17T09:57:11.795457+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Den Haag, Zuid-Holland' diff --git a/data/custodian/NL-XX-XXX-M-C-codart.yaml b/data/custodian/NL-ZH-DHA-M-C-codart.yaml similarity index 70% rename from data/custodian/NL-XX-XXX-M-C-codart.yaml rename to data/custodian/NL-ZH-DHA-M-C-codart.yaml index 259eca0bc0..a8f6da771b 100644 --- a/data/custodian/NL-XX-XXX-M-C-codart.yaml +++ b/data/custodian/NL-ZH-DHA-M-C-codart.yaml @@ -28,7 +28,8 @@ linkedin_enrichment: linkedin_url: https://www.linkedin.com/in/jannekevanasperen heritage_type: M - name: Tamar van Riessen - headline: PhD-Candidate Art History & Visual Culture | Curator 17th-Century Paintings | Art Historian + headline: PhD-Candidate Art History & Visual Culture | Curator 17th-Century Paintings + | Art Historian linkedin_url: https://www.linkedin.com/in/tamar-van-riessen-959248177 heritage_type: M - name: Femke van Leeuwen-Jansen @@ -44,28 +45,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/codart.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Den Haag + region: Zuid-Holland country: NL + address: Koninginnegracht 15, 2514 AB Den Haag ghcid: - ghcid_current: NL-XX-XXX-M-C-codart + ghcid_current: NL-ZH-DHA-M-C-codart ghcid_original: NL-XX-XXX-M-C-codart - ghcid_uuid: 8cf5c2ed-b8fe-523f-89e5-e996147f2943 - ghcid_uuid_sha256: 9d0c059d-9b9e-8965-9c08-705eef0556ee - ghcid_numeric: 11316426138154068325 + ghcid_uuid: 932104a7-6e72-57c3-a4d1-f3c6218f277e + ghcid_uuid_sha256: 11cb3492-54b6-8435-ab01-46e83370b99f + ghcid_numeric: 1282176322008179765 record_id: 0afab665-c130-445d-a2e0-4c79f1ed1759 generation_timestamp: '2025-12-16T21:06:44.128751+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-C-codart ghcid_numeric: 11316426138154068325 valid_from: '2025-12-16T21:06:44.128751+00:00' - valid_to: null + valid_to: '2025-12-17T09:33:15.796477+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-ZH-DHA-M-C-codart + ghcid_numeric: 1282176322008179765 + valid_from: '2025-12-17T09:33:15.796477+00:00' + valid_to: null + reason: Location enriched via Exa web search - Den Haag, Zuid-Holland location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: DHA + city_name: Den Haag + region_code: ZH + region_name: Zuid-Holland country_code: NL + resolution_date: '2025-12-17T09:33:15.796477+00:00' + source_url: https://www.codart.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:44.128751+00:00' @@ -82,9 +93,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.codart.nl/ + extraction_timestamp: '2025-12-17T09:33:15.796477+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Den Haag, Zuid-Holland' diff --git a/data/custodian/NL-XX-XXX-M-C.yaml b/data/custodian/NL-ZH-DHA-M-C.yaml similarity index 83% rename from data/custodian/NL-XX-XXX-M-C.yaml rename to data/custodian/NL-ZH-DHA-M-C.yaml index 02f9659eb8..3cd96aae70 100644 --- a/data/custodian/NL-XX-XXX-M-C.yaml +++ b/data/custodian/NL-ZH-DHA-M-C.yaml @@ -103,23 +103,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/cultuurschakel.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Den Haag + region: Zuid-Holland country: NL + address: Den Haag, Netherlands ghcid: - ghcid_current: NL-XX-XXX-M-C + ghcid_current: NL-ZH-DHA-M-C ghcid_original: NL-XX-XXX-M-C - ghcid_uuid: a1434c1d-73d9-5630-a0b7-2f2a87bdcdec - ghcid_uuid_sha256: e5e6fc5b-a7f2-8ea3-8625-eeab02101858 - ghcid_numeric: 16566205749918891683 + ghcid_uuid: 65f3c875-a26d-5d51-acdb-f534a44aeecc + ghcid_uuid_sha256: 426f1a86-c2b5-8d14-a981-320d7e1211da + ghcid_numeric: 4787074095012740372 record_id: a97e198d-10ca-4595-9b13-073a8b741f07 generation_timestamp: '2025-12-16T21:06:38.738101+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-C ghcid_numeric: 16566205749918891683 valid_from: '2025-12-17T08:44:25.966336+00:00' - valid_to: null + valid_to: '2025-12-17T09:33:15.877796+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-ZH-DHA-M-C + ghcid_numeric: 4787074095012740372 + valid_from: '2025-12-17T09:33:15.877796+00:00' + valid_to: null + reason: Location enriched via Exa web search - Den Haag, Zuid-Holland + location_resolution: + method: EXA_WEB_SEARCH + city_code: DHA + city_name: Den Haag + region_code: ZH + region_name: Zuid-Holland + country_code: NL + resolution_date: '2025-12-17T09:33:15.877796+00:00' + source_url: https://www.cultuurschakel.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:38.738101+00:00' @@ -136,6 +151,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.cultuurschakel.nl/ + extraction_timestamp: '2025-12-17T09:33:15.877796+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -144,3 +168,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Den Haag, Zuid-Holland' diff --git a/data/custodian/NL-XX-XXX-M-KM-kresse_museum.yaml b/data/custodian/NL-ZH-GOU-M-KM-kresse_museum.yaml similarity index 60% rename from data/custodian/NL-XX-XXX-M-KM-kresse_museum.yaml rename to data/custodian/NL-ZH-GOU-M-KM-kresse_museum.yaml index 6e1907542d..e182d8258c 100644 --- a/data/custodian/NL-XX-XXX-M-KM-kresse_museum.yaml +++ b/data/custodian/NL-ZH-GOU-M-KM-kresse_museum.yaml @@ -18,28 +18,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/kresse-museum.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Gouda + region: Zuid-Holland country: NL + address: Achter de Kerk 14, 2801 JX Gouda ghcid: - ghcid_current: NL-XX-XXX-M-KM-kresse_museum + ghcid_current: NL-ZH-GOU-M-KM-kresse_museum ghcid_original: NL-XX-XXX-M-KM-kresse_museum - ghcid_uuid: 6b8e1a47-41dc-5654-9b67-84c813805af0 - ghcid_uuid_sha256: b0d1df63-6965-8cbe-8184-25ee491660e4 - ghcid_numeric: 12741210438870891710 + ghcid_uuid: f4fe63e9-9e94-5cbd-83b9-4744f5262e8b + ghcid_uuid_sha256: 8c0997a3-e194-8d2d-9beb-882f3022388a + ghcid_numeric: 10090763170220346669 record_id: 3c3397e5-cde3-4cd9-91e8-4b55728a88af generation_timestamp: '2025-12-16T21:06:43.981200+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-KM-kresse_museum ghcid_numeric: 12741210438870891710 valid_from: '2025-12-16T21:06:43.981200+00:00' - valid_to: null + valid_to: '2025-12-17T09:57:11.866127+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-ZH-GOU-M-KM-kresse_museum + ghcid_numeric: 10090763170220346669 + valid_from: '2025-12-17T09:57:11.866127+00:00' + valid_to: null + reason: Location enriched via Exa web search - Gouda, Zuid-Holland location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: GOU + city_name: Gouda + region_code: ZH + region_name: Zuid-Holland country_code: NL + resolution_date: '2025-12-17T09:57:11.866127+00:00' + source_url: https://www.kressemuseum.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:43.981200+00:00' @@ -56,9 +66,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.kressemuseum.nl/ + extraction_timestamp: '2025-12-17T09:57:11.866127+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Gouda, Zuid-Holland' diff --git a/data/custodian/NL-XX-XXX-M-AM-atlantikwall_museum.yaml b/data/custodian/NL-ZH-NRW-M-AM-atlantikwall_museum.yaml similarity index 62% rename from data/custodian/NL-XX-XXX-M-AM-atlantikwall_museum.yaml rename to data/custodian/NL-ZH-NRW-M-AM-atlantikwall_museum.yaml index e87c532fac..7ca1d8af3c 100644 --- a/data/custodian/NL-XX-XXX-M-AM-atlantikwall_museum.yaml +++ b/data/custodian/NL-ZH-NRW-M-AM-atlantikwall_museum.yaml @@ -25,23 +25,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/atlantikwall-museum.yaml schema_version: 1.0.0 location: - city: null - region: null + city: Noordwijk + region: Zuid-Holland country: NL + address: Noordwijk, Zuid-Holland, Netherlands ghcid: - ghcid_current: NL-XX-XXX-M-AM-atlantikwall_museum + ghcid_current: NL-ZH-NRW-M-AM-atlantikwall_museum ghcid_original: NL-XX-XXX-M-AM-atlantikwall_museum - ghcid_uuid: 73fb4ed0-8683-5f49-871a-7e38d3876855 - ghcid_uuid_sha256: 5203625a-77fe-8dd0-baa4-1154287a2d72 - ghcid_numeric: 5909675276739976656 + ghcid_uuid: af7ac4a4-ffe3-5edc-850f-b31a18c67b95 + ghcid_uuid_sha256: 5b8a41e9-fc43-8522-80bc-a47b6e5ed0a6 + ghcid_numeric: 6596157077453010210 record_id: e0c12c4e-b088-48d4-a5dd-d2a7a73ca493 generation_timestamp: '2025-12-16T21:06:41.396388+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-AM-atlantikwall_museum ghcid_numeric: 5909675276739976656 valid_from: '2025-12-17T08:44:26.007952+00:00' - valid_to: null + valid_to: '2025-12-17T09:25:04.226988+00:00' reason: Reverted incorrect LinkedIn HTML extraction - original XX-XXX restored + - ghcid: NL-ZH-NRW-M-AM-atlantikwall_museum + ghcid_numeric: 6596157077453010210 + valid_from: '2025-12-17T09:25:04.226988+00:00' + valid_to: null + reason: Location enriched via Exa web search - Noordwijk, Zuid-Holland + location_resolution: + method: EXA_WEB_SEARCH + city_code: NRW + city_name: Noordwijk + region_code: ZH + region_name: Zuid-Holland + country_code: NL + resolution_date: '2025-12-17T09:25:04.226988+00:00' + source_url: https://www.atlantikwallmuseum.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:41.396388+00:00' @@ -58,6 +73,15 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://www.atlantikwallmuseum.nl/ + extraction_timestamp: '2025-12-17T09:25:04.226988+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile @@ -66,3 +90,4 @@ provenance: - 'Location resolution method: UNRESOLVED' - Reverted incorrect location enrichment on 2025-12-17 - LinkedIn HTML extraction was extracting wrong company's data + - 'Location enriched on 2025-12-17 via Exa web search: Noordwijk, Zuid-Holland' diff --git a/data/custodian/NL-XX-XXX-A-MA.yaml b/data/custodian/NL-ZH-ROT-A-MA.yaml similarity index 70% rename from data/custodian/NL-XX-XXX-A-MA.yaml rename to data/custodian/NL-ZH-ROT-A-MA.yaml index a3ddebd904..f1426fb32a 100644 --- a/data/custodian/NL-XX-XXX-A-MA.yaml +++ b/data/custodian/NL-ZH-ROT-A-MA.yaml @@ -43,28 +43,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/moslim-archief.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Rotterdam + region: Zuid-Holland country: NL + address: Rotterdam, Netherlands ghcid: - ghcid_current: NL-XX-XXX-A-MA + ghcid_current: NL-ZH-ROT-A-MA ghcid_original: NL-XX-XXX-A-MA - ghcid_uuid: 7215318b-74db-57ce-9921-09db2d6b8e20 - ghcid_uuid_sha256: 50024496-b73c-85c0-938d-b77e01e80c85 - ghcid_numeric: 5765245887097644480 + ghcid_uuid: 18570ab5-c0f9-5bb4-8e4c-11e35cfdebb8 + ghcid_uuid_sha256: 92b222fc-d21c-8eb2-8ff4-01400305db5e + ghcid_numeric: 10570549744644181682 record_id: d2e14ba0-55d0-42c1-b324-1b4b6226d836 generation_timestamp: '2025-12-16T21:06:36.624598+00:00' ghcid_history: - ghcid: NL-XX-XXX-A-MA ghcid_numeric: 5765245887097644480 valid_from: '2025-12-16T21:06:36.624598+00:00' - valid_to: null + valid_to: '2025-12-17T09:33:15.780333+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-ZH-ROT-A-MA + ghcid_numeric: 10570549744644181682 + valid_from: '2025-12-17T09:33:15.780333+00:00' + valid_to: null + reason: Location enriched via Exa web search - Rotterdam, Zuid-Holland location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: ROT + city_name: Rotterdam + region_code: ZH + region_name: Zuid-Holland country_code: NL + resolution_date: '2025-12-17T09:33:15.780333+00:00' + source_url: https://moslimarchief.nl/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:36.624598+00:00' @@ -81,9 +91,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://moslimarchief.nl/ + extraction_timestamp: '2025-12-17T09:33:15.780333+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Rotterdam, Zuid-Holland' diff --git a/data/custodian/NL-XX-XXX-M-DPM.yaml b/data/custodian/NL-ZH-ROT-M-DPM.yaml similarity index 62% rename from data/custodian/NL-XX-XXX-M-DPM.yaml rename to data/custodian/NL-ZH-ROT-M-DPM.yaml index 9e63838a91..54d613e5d0 100644 --- a/data/custodian/NL-XX-XXX-M-DPM.yaml +++ b/data/custodian/NL-ZH-ROT-M-DPM.yaml @@ -21,28 +21,38 @@ linkedin_enrichment: original_file: data/custodian/linkedin/dutch-pinball-museum.yaml schema_version: 1.0.0 location: - city: '' - region: XX + city: Rotterdam + region: Zuid-Holland country: NL + address: Voorhaven 17, 3024 RC Rotterdam ghcid: - ghcid_current: NL-XX-XXX-M-DPM + ghcid_current: NL-ZH-ROT-M-DPM ghcid_original: NL-XX-XXX-M-DPM - ghcid_uuid: 9c34f38d-168a-5223-9726-799e16461c0c - ghcid_uuid_sha256: 17c1e31a-45c8-8454-8fa4-db8bdc7d464f - ghcid_numeric: 1711899035356951636 + ghcid_uuid: ec309d57-2eac-5371-a08c-360af34e4b08 + ghcid_uuid_sha256: 43c4854a-6502-8ffb-a89c-bbf1b151ff96 + ghcid_numeric: 4883174450545205243 record_id: 49ba58fd-88c2-47fb-9ca5-b2b694147e0e generation_timestamp: '2025-12-16T21:06:43.663154+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-DPM ghcid_numeric: 1711899035356951636 valid_from: '2025-12-16T21:06:43.663154+00:00' - valid_to: null + valid_to: '2025-12-17T09:17:11.091657+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: NL-ZH-ROT-M-DPM + ghcid_numeric: 4883174450545205243 + valid_from: '2025-12-17T09:17:11.091657+00:00' + valid_to: null + reason: Location enriched via Exa web search - Rotterdam, Zuid-Holland location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX + method: EXA_WEB_SEARCH + city_code: ROT + city_name: Rotterdam + region_code: ZH + region_name: Zuid-Holland country_code: NL + resolution_date: '2025-12-17T09:17:11.091657+00:00' + source_url: https://dutchpinballmuseum.com/ provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:43.663154+00:00' @@ -59,9 +69,19 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_3_CROWD_SOURCED + source_url: https://dutchpinballmuseum.com/ + extraction_timestamp: '2025-12-17T09:17:11.091657+00:00' + claims_extracted: + - city + - region + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Location enriched on 2025-12-17 via Exa web search: Rotterdam, Zuid-Holland' diff --git a/data/custodian/NL-XX-XXX-M-MG.yaml b/data/custodian/PS-GZ-GAZ-O-MG.yaml similarity index 55% rename from data/custodian/NL-XX-XXX-M-MG.yaml rename to data/custodian/PS-GZ-GAZ-O-MG.yaml index efb1f7dca1..2ec851ad24 100644 --- a/data/custodian/NL-XX-XXX-M-MG.yaml +++ b/data/custodian/PS-GZ-GAZ-O-MG.yaml @@ -2,7 +2,7 @@ custodian_name: emic_name: Municipality of Gaza emic_name_source: linkedin institution_type: -- M +- O linkedin_enrichment: linkedin_url: https://www.linkedin.com/company/municipality-of-gaza linkedin_slug: municipality-of-gaza @@ -18,28 +18,40 @@ linkedin_enrichment: original_file: data/custodian/linkedin/municipality-of-gaza.yaml schema_version: 1.0.0 location: - city: '' - region: XX - country: NL + city: Gaza City + region: Gaza Strip + country: PS ghcid: - ghcid_current: NL-XX-XXX-M-MG - ghcid_original: NL-XX-XXX-M-MG - ghcid_uuid: 38ca88a9-b9da-55b8-80b0-f3d223ceb625 - ghcid_uuid_sha256: b26a272e-97aa-8e77-96fa-3a370b897bb8 - ghcid_numeric: 12856131167348993655 + ghcid_current: PS-GZ-GAZ-O-MG + ghcid_original: PS-GZ-GAZ-O-MG + ghcid_uuid: 2657ff95-d637-595a-88aa-541c7020c8d5 + ghcid_uuid_sha256: 2e49ae93-4105-89bb-9667-65aac87ec550 + ghcid_numeric: 3335388946518841787 record_id: ea2d7d50-d449-4959-9bf6-8f00e2bddeb1 generation_timestamp: '2025-12-16T21:06:41.550370+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-MG ghcid_numeric: 12856131167348993655 valid_from: '2025-12-16T21:06:41.550370+00:00' - valid_to: null + valid_to: '2025-12-17T09:53:29.215327+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: PS-GZ-GAZ-O-MG + ghcid_numeric: 3335388946518841787 + valid_from: '2025-12-17T09:53:29.215327+00:00' + valid_to: null + reason: 'Country code corrected: NL -> PS (Palestine). Location: Gaza City, Gaza + Strip' location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX - country_code: NL + method: EXA_WEB_SEARCH + city_code: GAZ + city_name: Gaza City + region_code: GZ + region_name: Gaza Strip + country_code: PS + resolution_date: '2025-12-17T09:53:29.215327+00:00' + source_url: https://www.gaza-city.org + notes: Municipal government, founded 1898. Type corrected from M (Museum) to O + (Official Institution) provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:41.550370+00:00' @@ -56,9 +68,21 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_2_VERIFIED + source_url: https://www.gaza-city.org + extraction_timestamp: '2025-12-17T09:53:29.215327+00:00' + claims_extracted: + - country + - region + - city + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Country code corrected on 2025-12-17: NL was incorrect, institution is in Palestine + (PS)' diff --git a/data/custodian/NL-XX-XXX-M-FM-ford_museum.yaml b/data/custodian/US-MI-GRA-O-FM-ford_museum.yaml similarity index 54% rename from data/custodian/NL-XX-XXX-M-FM-ford_museum.yaml rename to data/custodian/US-MI-GRA-O-FM-ford_museum.yaml index c3ff6cb454..cb2482b38a 100644 --- a/data/custodian/NL-XX-XXX-M-FM-ford_museum.yaml +++ b/data/custodian/US-MI-GRA-O-FM-ford_museum.yaml @@ -2,7 +2,7 @@ custodian_name: emic_name: Ford museum emic_name_source: linkedin institution_type: -- M +- O linkedin_enrichment: linkedin_url: https://www.linkedin.com/company/ford-museum linkedin_slug: ford-museum @@ -21,28 +21,40 @@ linkedin_enrichment: original_file: data/custodian/linkedin/ford-museum.yaml schema_version: 1.0.0 location: - city: '' - region: XX - country: NL + city: Grand Rapids + region: Michigan + country: US + address: 303 Pearl Street NW, Grand Rapids, MI 49504 ghcid: - ghcid_current: NL-XX-XXX-M-FM-ford_museum - ghcid_original: NL-XX-XXX-M-FM-ford_museum - ghcid_uuid: 4be08f3c-3b19-5820-9dc7-522026b51400 - ghcid_uuid_sha256: cf7d92d4-f6c8-81d0-a27d-128f93e68e0b - ghcid_numeric: 14951267781310939600 + ghcid_current: US-MI-GRA-O-FM-ford_museum + ghcid_original: US-MI-GRA-O-FM-ford_museum + ghcid_uuid: fb8e145b-80ae-5b68-9fbd-93240bd798a9 + ghcid_uuid_sha256: 8dd63d17-5941-825f-a6b4-872358ea25eb + ghcid_numeric: 10220423574854939231 record_id: 89d83d98-3121-4969-bd7e-a06f14edc812 generation_timestamp: '2025-12-16T21:06:42.087370+00:00' ghcid_history: - ghcid: NL-XX-XXX-M-FM-ford_museum ghcid_numeric: 14951267781310939600 valid_from: '2025-12-16T21:06:42.087370+00:00' - valid_to: null + valid_to: '2025-12-17T09:41:23.620522+00:00' reason: Initial GHCID assignment from LinkedIn batch import + - ghcid: US-MI-GRA-O-FM-ford_museum + ghcid_numeric: 10220423574854939231 + valid_from: '2025-12-17T09:41:23.620522+00:00' + valid_to: null + reason: 'Country code corrected: NL -> US (United States). Location: Grand Rapids, + Michigan' location_resolution: - method: UNRESOLVED - city_code: XXX - region_code: XX - country_code: NL + method: EXA_WEB_SEARCH + city_code: GRA + city_name: Grand Rapids + region_code: MI + region_name: Michigan + country_code: US + resolution_date: '2025-12-17T09:41:23.620522+00:00' + source_url: https://www.fordlibrarymuseum.gov/visit/museum + notes: Part of National Archives system, commemorates 38th US President provenance: schema_version: 1.0.0 generated_at: '2025-12-16T21:06:42.087370+00:00' @@ -59,9 +71,21 @@ provenance: - website - staff_count - heritage_staff + web_search: + - source_type: exa_web_search + data_tier: TIER_2_VERIFIED + source_url: https://www.fordlibrarymuseum.gov/visit/museum + extraction_timestamp: '2025-12-17T09:41:23.620522+00:00' + claims_extracted: + - country + - region + - city + - address data_tier_summary: TIER_4_INFERRED: - linkedin_company_profile notes: - Created from unmatched LinkedIn company profile - 'Location resolution method: UNRESOLVED' + - 'Country code corrected on 2025-12-17: NL was incorrect, institution is in United + States (US)' diff --git a/data/custodian/NL-XX-XXX-M-DA.yaml b/data/custodian/archive/non_heritage_removed/NL-XX-XXX-M-DA.yaml similarity index 100% rename from data/custodian/NL-XX-XXX-M-DA.yaml rename to data/custodian/archive/non_heritage_removed/NL-XX-XXX-M-DA.yaml diff --git a/data/custodian/NL-XX-XXX-M-HF.yaml b/data/custodian/archive/non_heritage_removed/NL-XX-XXX-M-HF.yaml similarity index 100% rename from data/custodian/NL-XX-XXX-M-HF.yaml rename to data/custodian/archive/non_heritage_removed/NL-XX-XXX-M-HF.yaml diff --git a/data/custodian/NL-XX-XXX-M-MA.yaml b/data/custodian/archive/non_heritage_removed/NL-XX-XXX-M-MA.yaml similarity index 100% rename from data/custodian/NL-XX-XXX-M-MA.yaml rename to data/custodian/archive/non_heritage_removed/NL-XX-XXX-M-MA.yaml diff --git a/frontend/public/schemas/20251121/linkml/manifest.json b/frontend/public/schemas/20251121/linkml/manifest.json index 6979767e39..153f296485 100644 --- a/frontend/public/schemas/20251121/linkml/manifest.json +++ b/frontend/public/schemas/20251121/linkml/manifest.json @@ -1,5 +1,5 @@ { - "generated": "2025-12-17T08:54:52.876Z", + "generated": "2025-12-17T10:54:35.492Z", "version": "1.0.0", "categories": [ { diff --git a/frontend/src/components/conversation/ConversationEmbeddingPanel.css b/frontend/src/components/conversation/ConversationEmbeddingPanel.css index c78f0eddbc..554b615f36 100644 --- a/frontend/src/components/conversation/ConversationEmbeddingPanel.css +++ b/frontend/src/components/conversation/ConversationEmbeddingPanel.css @@ -363,6 +363,10 @@ to { transform: rotate(360deg); } } +.conversation-embedding-panel__spinning { + animation: spin 1s linear infinite; +} + .conversation-embedding-panel__empty svg { color: #999; } diff --git a/frontend/src/components/conversation/ConversationEmbeddingPanel.tsx b/frontend/src/components/conversation/ConversationEmbeddingPanel.tsx index f715384bc5..ebcea389fa 100644 --- a/frontend/src/components/conversation/ConversationEmbeddingPanel.tsx +++ b/frontend/src/components/conversation/ConversationEmbeddingPanel.tsx @@ -28,6 +28,8 @@ import { Info, Globe, Target, + Settings, + Download, } from 'lucide-react'; import { EmbeddingProjector, type EmbeddingPoint } from '../database/EmbeddingProjector'; import { isTargetInsideAny } from '../../utils/dom'; @@ -94,6 +96,12 @@ export interface ConversationEmbeddingPanelProps { onModeChange?: (mode: 'global' | 'context') => void; /** Number of context points available (for badge display) */ contextPointsCount?: number; + /** Total points in the collection (for Load All display) */ + totalPointsCount?: number; + /** Called when user clicks Load All */ + onLoadAll?: () => void; + /** Whether Load All is currently in progress */ + isLoadingAll?: boolean; } /** @@ -116,6 +124,9 @@ const ConversationEmbeddingPanelComponent: React.FC { const panelRef = useRef(null); @@ -456,9 +467,26 @@ const ConversationEmbeddingPanelComponent: React.FC - - {simpleMode ? '◧' : '▣'} - + + + )} + + {/* Load All button */} + {onLoadAll && mode === 'global' && ( + )} diff --git a/frontend/src/components/database/EmbeddingProjector.tsx b/frontend/src/components/database/EmbeddingProjector.tsx index 3b5d7ab4ca..8f29ed902e 100644 --- a/frontend/src/components/database/EmbeddingProjector.tsx +++ b/frontend/src/components/database/EmbeddingProjector.tsx @@ -1276,11 +1276,13 @@ export function EmbeddingProjector({ positions[i * 3 + 1] = point.y; positions[i * 3 + 2] = point.z ?? 0; - // Get color for point (initial color without selection) - const color = new THREE.Color(getPointColor(point.originalIndex)); - colors[i * 3] = color.r; - colors[i * 3 + 1] = color.g; - colors[i * 3 + 2] = color.b; + // Use default color - actual colors will be set by the color update effect + // This avoids having getPointColor as a dependency which would recreate + // the scene (and reset camera) when selection/highlighting changes + const defaultColor = new THREE.Color(COLORS[0]); + colors[i * 3] = defaultColor.r; + colors[i * 3 + 1] = defaultColor.g; + colors[i * 3 + 2] = defaultColor.b; // Initial size (will be updated by selection effect) sizes[i] = 4; @@ -1458,7 +1460,11 @@ export function EmbeddingProjector({ highlightedHalosRef.current = null; } }; - }, [viewMode, projectedPoints, getPointColor]); + // Note: getPointColor is intentionally NOT a dependency here. + // Colors are initialized with a default and updated by the separate color/size effect. + // Including getPointColor would recreate the scene (reset camera) on selection changes. + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [viewMode, projectedPoints]); // Update point sizes and colors when selection changes (without recreating the scene) useEffect(() => { diff --git a/frontend/src/components/database/QdrantPanel.tsx b/frontend/src/components/database/QdrantPanel.tsx index 92c830b6b5..f9b6cc0b31 100644 --- a/frontend/src/components/database/QdrantPanel.tsx +++ b/frontend/src/components/database/QdrantPanel.tsx @@ -207,6 +207,45 @@ export function QdrantPanel({ compact = false }: QdrantPanelProps) { } }, [selectedCollection, nextOffset, scrollPoints]); + // Load ALL points from the collection (for visualization/search) + const loadAllPoints = useCallback(async () => { + if (!selectedCollection) return; + + setIsLoadingPoints(true); + try { + const allPoints: QdrantPoint[] = []; + let currentOffset: string | number | null = null; + const batchSize = 500; // Load in larger batches for efficiency + + // Scroll through all points + while (true) { + const result = await scrollPoints( + selectedCollection.name, + batchSize, + currentOffset + ); + + allPoints.push(...result.points); + + // Update UI with progress + setPoints([...allPoints]); + + if (!result.nextOffset) { + break; // No more points + } + currentOffset = result.nextOffset; + } + + setPoints(allPoints); + setNextOffset(null); // All loaded + console.log(`[QdrantPanel] Loaded all ${allPoints.length} points from collection`); + } catch (err) { + console.error('Failed to load all points:', err); + } finally { + setIsLoadingPoints(false); + } + }, [selectedCollection, scrollPoints]); + // Select a collection const selectCollection = useCallback(async (collection: QdrantCollection) => { setSelectedCollection(collection); @@ -641,13 +680,23 @@ export function QdrantPanel({ compact = false }: QdrantPanelProps) { )} {nextOffset !== null && points.length > 0 && ( - + <> + + + )} )} diff --git a/frontend/src/components/mapping/MappingExplorer.css b/frontend/src/components/mapping/MappingExplorer.css index c5b073a0c9..268920b83e 100644 --- a/frontend/src/components/mapping/MappingExplorer.css +++ b/frontend/src/components/mapping/MappingExplorer.css @@ -96,6 +96,7 @@ font-family: 'Roboto', Helvetica, Arial, sans-serif; cursor: pointer; transition: border-color 0.2s; + min-width: 220px; } .mapping-explorer__category-select:focus { diff --git a/frontend/src/components/mapping/MappingExplorer.tsx b/frontend/src/components/mapping/MappingExplorer.tsx index 42c88b50d6..cb8b2a387f 100644 --- a/frontend/src/components/mapping/MappingExplorer.tsx +++ b/frontend/src/components/mapping/MappingExplorer.tsx @@ -17,11 +17,13 @@ import { getCategoryForSourceByType, getStatisticsForDataSource, exportToLinkMLMapYaml, + CATEGORY_GROUP_LABELS, type EnrichmentSourceMapping, type FieldMapping, type TransformationType, type DataSourceType, type MappingStatus, + type CategoryGroup, } from '../../lib/linkml/custodian-data-mappings'; import './MappingExplorer.css'; @@ -760,11 +762,19 @@ export const MappingExplorer: React.FC = ({ language = 'en onChange={(e) => setSelectedCategory(e.target.value || null)} > - {currentCategories.map(cat => ( - - ))} + {(Object.keys(CATEGORY_GROUP_LABELS) as CategoryGroup[]).map(group => { + const groupCategories = currentCategories.filter(c => c.group === group); + if (groupCategories.length === 0) return null; + return ( + + {groupCategories.map(cat => ( + + ))} + + ); + })} + {/* Show refresh prompt if limit changed from cached value */} + {hasRdfCache && cachedRdfLimitRef.current !== null && cachedRdfLimitRef.current !== rdfLimit && ( + + )} {totalCustodiansAvailable && (

{rdfNodeCount > 0 ? rdfNodeCount : rdfLimit} {t('showingOf')} {totalCustodiansAvailable.toLocaleString()} {t('custodiansAvailable')} @@ -1200,6 +1283,70 @@ export function Visualize() { {rdfLimit > 1000 && (

{t('performanceWarning')}

)} + + {/* Query Mode Selector */} +
+

{t('queryMode')}

+

{t('queryModeDesc')}

+
+ + + +
+ {/* Show Apply button if mode changed from cached value */} + {hasRdfCache && cachedRdfQueryModeRef.current !== null && cachedRdfQueryModeRef.current !== rdfQueryMode && ( + + )} +
)} diff --git a/scripts/apply_verified_enrichments.py b/scripts/apply_verified_enrichments.py new file mode 100644 index 0000000000..9d7faf23a9 --- /dev/null +++ b/scripts/apply_verified_enrichments.py @@ -0,0 +1,291 @@ +#!/usr/bin/env python3 +""" +Apply verified location enrichments to XXX files and rename them. + +This script: +1. Updates ghcid_current with the correct region/city codes +2. Updates location with city/region +3. Adds ghcid_history entry +4. Updates provenance notes +5. Renames file to match new GHCID +""" + +import yaml +import os +import re +import uuid +import hashlib +from datetime import datetime, timezone +from pathlib import Path + +# Verified enrichments from Exa web search +# History: +# - Batch 1 (2025-12-17): 4 files - Crypto Museum, Allard Pierson, DPM Rotterdam, Cow Museum +# - Batch 2 (2025-12-17): 8 files - Bierreclame, Cacao, Edah, Flessenscheepjes, Eddie the Eagle, Jopie Huisman, Fortuna, Atlantikwall +# - Batch 3 (2025-12-17): 7 files - Ajax, C1000, Moslim Archief, CODART, Blik Trommel, Klompenmakerij, CultuurSchakel +# - Batch 4 (2025-12-17): 7 files - Autoriteit Persoonsgegevens, Raad voor Cultuur, IJV, Erotisch Museum, Hollands Kaas Museum, Kresse Museum, Van Gogh Museum Enterprises +# - Batch 5 (2025-12-17): 4 files - Huis73, Dutch Directors Guild, Het Kaas Museum (Bodegraven), Stichting Abrahamdag +# - Batch 6 (2025-12-17): 2 files - Museum 1939-1945, Brandkas van Henny +# - Batch 7 (2025-12-17): 5 files - Frans Maas Museum, Museum Buitenlust, Museum De Canonije, Museum Dijkmagazijn De Heul, Museumboerderij Erve Hofman +# - Batch 8 (2025-12-17): 7 files - Museum Janning, Museum Geelvinck Hinlopen Huis, Museumboerderij De Grote Glind, Museum Galerie RAT, Museum Averlo-Frieswijk-Schalkhaar, Museum Ceuclum, Museum van Brabantse Mutsen en Poffers +# Total enriched: 44 files +# Remaining: ~133 NL-XX-XXX files +# +# All previously processed entries have been removed from VERIFIED_ENRICHMENTS. +# Only add new entries that have not been processed yet. + +VERIFIED_ENRICHMENTS = [ + # Batch 8 - 2025-12-17 + { + 'old_filename': 'NL-XX-XXX-M-MJ-museum_janning.yaml', + 'institution_name': 'Museum Janning', + 'city': 'Nieuw Schoonebeek', + 'region': 'Drenthe', + 'region_code': 'DR', + 'city_code': 'NIS', + 'address': 'Europaweg 143a, 7766 AE Nieuw Schoonebeek', + 'source': 'exa_web_search', + 'source_url': 'https://www.museumjanning.nl/', + }, + { + 'old_filename': 'NL-XX-XXX-M-MGHH.yaml', + 'institution_name': 'Museum Geelvinck Hinlopen Huis', + 'city': 'Heerde', + 'region': 'Gelderland', + 'region_code': 'GE', + 'city_code': 'HEE', + 'address': 'Kamperweg 23, 8181 CS Heerde', + 'source': 'exa_web_search', + 'source_url': 'https://geelvinck.nl/', + }, + { + 'old_filename': 'NL-XX-XXX-M-MGG.yaml', + 'institution_name': 'Museumboerderij De Grote Glind', + 'city': 'Barneveld', + 'region': 'Gelderland', + 'region_code': 'GE', + 'city_code': 'BAR', + 'address': 'Scherpenzeelseweg 158, 3772 MG Barneveld', + 'source': 'exa_web_search', + 'source_url': 'https://www.degroteglind.nl/', + }, + { + 'old_filename': 'NL-XX-XXX-M-MGR.yaml', + 'institution_name': 'Museum Galerie RAT', + 'city': 'Den Burg', + 'region': 'Noord-Holland', + 'region_code': 'NH', + 'city_code': 'DEB', + 'address': 'Burgwal 20, 1791 Den Burg, Texel', + 'source': 'exa_web_search', + 'source_url': 'https://www.mapquest.com/', + }, + { + 'old_filename': 'NL-XX-XXX-M-MAFS.yaml', + 'institution_name': 'Museum Averlo-Frieswijk-Schalkhaar', + 'city': 'Schalkhaar', + 'region': 'Overijssel', + 'region_code': 'OV', + 'city_code': 'SCK', + 'address': 'Frieswijkerweg 7, 7433 RB Schalkhaar', + 'source': 'exa_web_search', + 'source_url': 'https://www.museum-afs.nl/', + }, + { + 'old_filename': 'NL-XX-XXX-M-MC.yaml', + 'institution_name': 'Museum Ceuclum', + 'city': 'Cuijk', + 'region': 'Noord-Brabant', + 'region_code': 'NB', + 'city_code': 'CUI', + 'address': 'Castellum 1, 5431 EM Cuijk', + 'source': 'exa_web_search', + 'source_url': 'https://www.museumceuclum.nl/', + }, + { + 'old_filename': 'NL-XX-XXX-M-MBMP.yaml', + 'institution_name': 'Museum van Brabantse Mutsen en Poffers', + 'city': 'Sint-Oedenrode', + 'region': 'Noord-Brabant', + 'region_code': 'NB', + 'city_code': 'SOR', + 'address': 'Kerkstraat 20, 5492 AH Sint-Oedenrode', + 'source': 'exa_web_search', + 'source_url': 'https://mutsenmuseum.nl/', + }, +] + +def generate_ghcid_uuid(ghcid_string: str) -> str: + """Generate UUID v5 from GHCID string.""" + GLAM_NAMESPACE = uuid.UUID('6ba7b810-9dad-11d1-80b4-00c04fd430c8') # DNS namespace + return str(uuid.uuid5(GLAM_NAMESPACE, ghcid_string)) + +def generate_ghcid_numeric(ghcid_string: str) -> int: + """Generate 64-bit numeric ID from GHCID string.""" + sha256_hash = hashlib.sha256(ghcid_string.encode()).digest() + return int.from_bytes(sha256_hash[:8], byteorder='big') + +def generate_ghcid_uuid_sha256(ghcid_string: str) -> str: + """Generate UUID v8 (SHA-256 based) from GHCID string.""" + sha256_hash = hashlib.sha256(ghcid_string.encode()).digest() + # Create UUID v8 format + uuid_bytes = bytearray(sha256_hash[:16]) + uuid_bytes[6] = (uuid_bytes[6] & 0x0F) | 0x80 # Version 8 + uuid_bytes[8] = (uuid_bytes[8] & 0x3F) | 0x80 # Variant + return str(uuid.UUID(bytes=bytes(uuid_bytes))) + +def apply_enrichment(custodian_dir: Path, enrichment: dict) -> tuple[str | None, str | None]: + """Apply enrichment to a file and return (old_path, new_path).""" + old_path = custodian_dir / enrichment['old_filename'] + + if not old_path.exists(): + print(f" ❌ File not found: {old_path}") + return None, None + + # Load YAML + with open(old_path, 'r', encoding='utf-8') as f: + data = yaml.safe_load(f) + + # Extract current GHCID components + old_ghcid = data['ghcid']['ghcid_current'] + + # Parse old GHCID to get type and abbreviation + # Format: NL-XX-XXX-{type}-{abbrev}[-{name_suffix}] + match = re.match(r'NL-XX-XXX-([A-Z])-([A-Z0-9]+)(?:-(.+))?', old_ghcid) + if not match: + print(f" ❌ Could not parse GHCID: {old_ghcid}") + return None, None + + inst_type = match.group(1) + abbrev = match.group(2) + name_suffix = match.group(3) # May be None + + # Build new GHCID + new_ghcid = f"NL-{enrichment['region_code']}-{enrichment['city_code']}-{inst_type}-{abbrev}" + if name_suffix: + new_ghcid += f"-{name_suffix}" + + # Generate new identifiers + new_uuid = generate_ghcid_uuid(new_ghcid) + new_uuid_sha256 = generate_ghcid_uuid_sha256(new_ghcid) + new_numeric = generate_ghcid_numeric(new_ghcid) + + timestamp = datetime.now(timezone.utc).isoformat() + + # Update location + data['location'] = { + 'city': enrichment['city'], + 'region': enrichment['region'], + 'country': 'NL', + } + if enrichment.get('address'): + data['location']['address'] = enrichment['address'] + + # Update ghcid + old_numeric = data['ghcid'].get('ghcid_numeric', 0) + + # Add to ghcid_history - mark old as ended + if 'ghcid_history' not in data['ghcid']: + data['ghcid_history'] = [] + + # Close out the old entry + for entry in data['ghcid']['ghcid_history']: + if entry.get('valid_to') is None: + entry['valid_to'] = timestamp + + # Add new history entry + data['ghcid']['ghcid_history'].append({ + 'ghcid': new_ghcid, + 'ghcid_numeric': new_numeric, + 'valid_from': timestamp, + 'valid_to': None, + 'reason': f"Location enriched via Exa web search - {enrichment['city']}, {enrichment['region']}" + }) + + # Update current GHCID + data['ghcid']['ghcid_current'] = new_ghcid + data['ghcid']['ghcid_uuid'] = new_uuid + data['ghcid']['ghcid_uuid_sha256'] = new_uuid_sha256 + data['ghcid']['ghcid_numeric'] = new_numeric + + # Add location_resolution + data['ghcid']['location_resolution'] = { + 'method': 'EXA_WEB_SEARCH', + 'city_code': enrichment['city_code'], + 'city_name': enrichment['city'], + 'region_code': enrichment['region_code'], + 'region_name': enrichment['region'], + 'country_code': 'NL', + 'resolution_date': timestamp, + 'source_url': enrichment.get('source_url'), + } + + # Update provenance notes + if 'provenance' not in data: + data['provenance'] = {} + if 'notes' not in data['provenance']: + data['provenance']['notes'] = [] + data['provenance']['notes'].append( + f"Location enriched on {timestamp[:10]} via Exa web search: {enrichment['city']}, {enrichment['region']}" + ) + + # Add web search source to provenance + if 'sources' not in data['provenance']: + data['provenance']['sources'] = {} + if 'web_search' not in data['provenance']['sources']: + data['provenance']['sources']['web_search'] = [] + data['provenance']['sources']['web_search'].append({ + 'source_type': 'exa_web_search', + 'data_tier': 'TIER_3_CROWD_SOURCED', + 'source_url': enrichment.get('source_url'), + 'extraction_timestamp': timestamp, + 'claims_extracted': ['city', 'region', 'address'], + }) + + # Write updated YAML to new filename + new_filename = new_ghcid.replace('/', '_') + '.yaml' + new_path = custodian_dir / new_filename + + with open(new_path, 'w', encoding='utf-8') as f: + yaml.dump(data, f, default_flow_style=False, allow_unicode=True, sort_keys=False) + + # Remove old file + if old_path != new_path: + old_path.unlink() + + return str(old_path), str(new_path) + + +def main(): + custodian_dir = Path('/Users/kempersc/apps/glam/data/custodian') + + print("=" * 60) + print("Applying Verified Location Enrichments") + print("=" * 60) + + if not VERIFIED_ENRICHMENTS: + print("\nNo enrichments to process. Add entries to VERIFIED_ENRICHMENTS list.") + return + + success_count = 0 + + for enrichment in VERIFIED_ENRICHMENTS: + print(f"\nProcessing: {enrichment['old_filename']}") + print(f" → {enrichment['city']}, {enrichment['region']} ({enrichment['region_code']}-{enrichment['city_code']})") + + old_path, new_path = apply_enrichment(custodian_dir, enrichment) + + if old_path and new_path: + old_name = os.path.basename(old_path) + new_name = os.path.basename(new_path) + print(f" ✅ Renamed: {old_name}") + print(f" → {new_name}") + success_count += 1 + + print("\n" + "=" * 60) + print(f"Summary: {success_count}/{len(VERIFIED_ENRICHMENTS)} files enriched and renamed") + print("=" * 60) + + +if __name__ == '__main__': + main() diff --git a/scripts/enrich_xxx_via_web_search.py b/scripts/enrich_xxx_via_web_search.py new file mode 100644 index 0000000000..b998758aad --- /dev/null +++ b/scripts/enrich_xxx_via_web_search.py @@ -0,0 +1,297 @@ +#!/usr/bin/env python3 +""" +Enrich NL-XX-XXX files with correct location data via web search. + +The LinkedIn HTML extraction method was flawed - it extracted location data from +wrong companies in the HTML. This script uses web search to find correct locations. + +Strategy: +1. Read custodian name and website from YAML file +2. Search web for "[name] Netherlands location address city" +3. Parse results to extract city/region +4. Update YAML file with correct location +5. Regenerate GHCID based on new location +""" + +import os +import re +import yaml +import json +import subprocess +from pathlib import Path +from datetime import datetime, timezone +from typing import Optional, Tuple + +# Directory containing custodian files +CUSTODIAN_DIR = Path("/Users/kempersc/apps/glam/data/custodian") + +# GeoNames database for settlement lookup +GEONAMES_DB = Path("/Users/kempersc/apps/glam/data/reference/geonames.db") + +# Dutch province mapping +PROVINCE_MAP = { + 'drenthe': 'DR', + 'friesland': 'FR', 'fryslân': 'FR', + 'gelderland': 'GE', + 'groningen': 'GR', + 'limburg': 'LI', + 'noord-brabant': 'NB', 'north brabant': 'NB', 'nordbrabant': 'NB', 'brabant': 'NB', + 'noord-holland': 'NH', 'north holland': 'NH', + 'overijssel': 'OV', + 'utrecht': 'UT', + 'zeeland': 'ZE', + 'zuid-holland': 'ZH', 'south holland': 'ZH', + 'flevoland': 'FL', +} + +# Dutch city to 3-letter code mapping (common cities) +CITY_CODES = { + 'amsterdam': 'AMS', + 'rotterdam': 'ROT', + 'den haag': 'DHA', 'the hague': 'DHA', "'s-gravenhage": 'DHA', + 'utrecht': 'UTR', + 'eindhoven': 'EIN', + 'groningen': 'GRO', + 'tilburg': 'TIL', + 'almere': 'ALM', + 'breda': 'BRE', + 'nijmegen': 'NIJ', + 'apeldoorn': 'APE', + 'haarlem': 'HAA', + 'arnhem': 'ARN', + 'enschede': 'ENS', + 'amersfoort': 'AME', + 'zaanstad': 'ZAA', + 'haarlemmermeer': 'HMM', + 'zwolle': 'ZWO', + 'leiden': 'LEI', + 'maastricht': 'MAA', + 'dordrecht': 'DOR', + 'zoetermeer': 'ZOE', + 'deventer': 'DEV', + 'delft': 'DEL', + 'alkmaar': 'ALK', + 'venlo': 'VEN', + 'leeuwarden': 'LEE', + 'heerlen': 'HEE', + 'hilversum': 'HIL', + 'assen': 'ASS', + 'schiedam': 'SCH', + 'weert': 'WEE', + 'duivendrecht': 'DUI', + 'noordwijk': 'NOO', +} + + +def get_city_code(city: str) -> str: + """Get 3-letter code for a city.""" + city_lower = city.lower().strip() + if city_lower in CITY_CODES: + return CITY_CODES[city_lower] + # Generate code from first 3 letters + clean = re.sub(r'[^a-z]', '', city_lower) + return clean[:3].upper() if len(clean) >= 3 else clean.upper().ljust(3, 'X') + + +def get_region_code(region: str) -> Optional[str]: + """Get 2-letter province code from region name.""" + region_lower = region.lower().strip() + for key, code in PROVINCE_MAP.items(): + if key in region_lower: + return code + return None + + +def extract_location_from_search_results(results: list) -> Optional[dict]: + """Extract city and region from Exa search results.""" + + # Patterns to match Dutch locations + patterns = [ + # "City, Netherlands" or "City (Province)" + r'(\w+(?:\s+\w+)?)\s*,\s*Netherlands\s*\((\w+(?:\s+\w+)?)\)', + # "in City, Province" + r'in\s+(\w+(?:\s+\w+)?)\s*,\s*(Noord-Holland|Zuid-Holland|Noord-Brabant|Gelderland|Limburg|Overijssel|Friesland|Drenthe|Groningen|Utrecht|Zeeland|Flevoland)', + # "legal seat in City" + r'legal\s+seat\s+in\s+(\w+)', + # "Address: ... City" + r'Address[:\s]+[^,]+,\s*(\d{4}\s*[A-Z]{2})\s+(\w+)', + # Dutch postal code pattern + r'(\d{4}\s*[A-Z]{2})\s+(\w+(?:\s+\w+)?)\s*,?\s*(?:Netherlands|NL)', + ] + + for result in results: + text = result.get('text', '') + ' ' + result.get('title', '') + + # Try each pattern + for pattern in patterns: + match = re.search(pattern, text, re.IGNORECASE) + if match: + groups = match.groups() + if len(groups) >= 2: + # Check if first group is postal code + if re.match(r'\d{4}\s*[A-Z]{2}', groups[0]): + city = groups[1] + region = None + else: + city = groups[0] + region = groups[1] if len(groups) > 1 else None + else: + city = groups[0] + region = None + + city = city.strip() + region_code = get_region_code(region) if region else None + + return { + 'city': city, + 'region_code': region_code, + 'source_text': text[:200] + } + + return None + + +def search_institution_location(name: str, website: Optional[str] = None) -> Optional[dict]: + """Search web for institution location using Exa.""" + + # Build search query + query = f'"{name}" Netherlands location address city' + if website and 'lnkd.in' not in website: + # Add website domain to query for better results + domain = re.sub(r'https?://(www\.)?', '', website).split('/')[0] + query = f'site:{domain} OR "{name}" Netherlands address city location' + + # Use Exa via subprocess (since we can't import the MCP client directly) + # For now, return None - we'll use the MCP tool directly in the main flow + return None + + +def find_xxx_files_needing_enrichment(): + """Find NL-XX-XXX files that need location enrichment.""" + files = [] + + for f in sorted(CUSTODIAN_DIR.glob("NL-XX-XXX-*.yaml")): + try: + with open(f, 'r', encoding='utf-8') as file: + content = yaml.safe_load(file) + + if not content: + continue + + # Get institution name + name = content.get('custodian_name', {}).get('emic_name', '') + + # Get website + website = content.get('linkedin_enrichment', {}).get('website') + + # Get LinkedIn slug + slug = content.get('linkedin_enrichment', {}).get('linkedin_slug', '') + + files.append({ + 'file': f, + 'name': name, + 'website': website, + 'slug': slug, + 'content': content + }) + except Exception as e: + print(f"Error reading {f}: {e}") + + return files + + +def update_file_with_location(file_info: dict, city: str, region_code: str, source: str): + """Update a YAML file with correct location data.""" + f = file_info['file'] + content = file_info['content'] + name = file_info['name'] + + # Get city code + city_code = get_city_code(city) + + # Update location + content['location'] = { + 'city': city, + 'region': region_code, + 'country': 'NL' + } + + # Generate new GHCID + # Extract type and abbreviation from filename + filename = f.stem + # Pattern: NL-XX-XXX-{TYPE}-{ABBREV}[-{name_suffix}] + match = re.match(r'NL-XX-XXX-([A-Z])-(.+)', filename) + if match: + inst_type = match.group(1) + abbrev_suffix = match.group(2) + + new_ghcid = f"NL-{region_code}-{city_code}-{inst_type}-{abbrev_suffix}" + + # Update GHCID + if 'ghcid' not in content: + content['ghcid'] = {} + + old_ghcid = content['ghcid'].get('ghcid_current', filename) + content['ghcid']['ghcid_current'] = new_ghcid + content['ghcid']['ghcid_original'] = old_ghcid + + # Update history + content['ghcid']['ghcid_history'] = [{ + 'ghcid': new_ghcid, + 'ghcid_numeric': content['ghcid'].get('ghcid_numeric'), + 'valid_from': datetime.now(timezone.utc).isoformat(), + 'valid_to': None, + 'reason': f'Location enriched via web search: {city}, {region_code}' + }] + + # Add location resolution + content['ghcid']['location_resolution'] = { + 'method': 'WEB_SEARCH', + 'city': city, + 'city_code': city_code, + 'region_code': region_code, + 'country_code': 'NL', + 'source': source, + 'resolution_date': datetime.now(timezone.utc).isoformat() + } + + # Add provenance note + if 'provenance' not in content: + content['provenance'] = {} + if 'notes' not in content['provenance']: + content['provenance']['notes'] = [] + content['provenance']['notes'].append( + f"Location enriched via web search on {datetime.now(timezone.utc).strftime('%Y-%m-%d')}: {city}, {region_code}" + ) + + # Write back + with open(f, 'w', encoding='utf-8') as file: + yaml.dump(content, file, default_flow_style=False, allow_unicode=True, sort_keys=False) + + return new_ghcid if match else None + + +def main(): + """Main function to list files needing enrichment.""" + print("Finding NL-XX-XXX files needing location enrichment...\n") + + files = find_xxx_files_needing_enrichment() + print(f"Found {len(files)} files\n") + + # Group by whether they have website + with_website = [f for f in files if f['website'] and 'lnkd.in' not in str(f['website'])] + without_website = [f for f in files if not f['website'] or 'lnkd.in' in str(f['website'])] + + print(f"Files with valid website: {len(with_website)}") + print(f"Files without valid website: {len(without_website)}") + + print("\n--- Sample files with websites (first 20) ---") + for f in with_website[:20]: + print(f" {f['name']}") + print(f" Website: {f['website']}") + print(f" File: {f['file'].name}") + print() + + +if __name__ == "__main__": + main() diff --git a/scripts/fix_non_dutch_institutions.py b/scripts/fix_non_dutch_institutions.py new file mode 100644 index 0000000000..76cd43aba9 --- /dev/null +++ b/scripts/fix_non_dutch_institutions.py @@ -0,0 +1,299 @@ +#!/usr/bin/env python3 +""" +Fix institutions incorrectly assigned to NL (Netherlands) that are actually in other countries. + +These institutions were imported from LinkedIn batch import but have wrong country codes. +""" + +import yaml +import os +import re +import uuid +import hashlib +from datetime import datetime, timezone +from pathlib import Path + +# Non-Dutch institutions to fix +# Verified via Exa web search 2025-12-17 +NON_DUTCH_INSTITUTIONS = [ + { + 'old_filename': 'NL-XX-XXX-A-HAEU.yaml', + 'institution_name': 'Historical Archives of the European Union', + 'country': 'IT', + 'country_name': 'Italy', + 'region': 'Tuscany', + 'region_code': '52', # Italian region code + 'city': 'Firenze', + 'city_code': 'FIR', + 'address': 'Via Bolognese 156, 50139 Firenze, Villa Salviati', + 'source_url': 'https://archives.eui.eu/en/repositories/1', + 'notes': 'Part of European University Institute, Florence' + }, + { + 'old_filename': 'NL-XX-XXX-A-VZWADEB.yaml', + 'institution_name': 'v.z.w. Archief- en Documentatiecentrum Erfgoed Binnenvaart', + 'country': 'BE', + 'country_name': 'Belgium', + 'region': 'West-Vlaanderen', + 'region_code': 'VWV', + 'city': 'Oudenburg', + 'city_code': 'OUD', + 'address': 'Vaartdijk zuid 11, 8460 Oudenburg (aboard Museumschip Tordino)', + 'source_url': 'http://binnenvaarterfgoed.be/', + 'notes': 'Belgian v.z.w. (vzw = Belgian non-profit), located aboard museum ship' + }, + { + 'old_filename': 'NL-XX-XXX-M-FM-ford_museum.yaml', + 'institution_name': 'Gerald R. Ford Presidential Museum', + 'country': 'US', + 'country_name': 'United States', + 'region': 'Michigan', + 'region_code': 'MI', + 'city': 'Grand Rapids', + 'city_code': 'GRA', + 'address': '303 Pearl Street NW, Grand Rapids, MI 49504', + 'source_url': 'https://www.fordlibrarymuseum.gov/visit/museum', + 'notes': 'Part of National Archives system, commemorates 38th US President', + # Update institution_type from M to O (Official Institution - Presidential Library) + 'new_institution_type': 'O', + }, + { + 'old_filename': 'NL-XX-XXX-M-DAJ.yaml', + 'institution_name': 'Diorama Arsip Jogja', + 'country': 'ID', + 'country_name': 'Indonesia', + 'region': 'Daerah Istimewa Yogyakarta', + 'region_code': 'YO', + 'city': 'Bantul', + 'city_code': 'BAN', + 'address': 'LT 1 Gedung DEPO ARSIP, Jl. Janti, Banguntapan, Kabupaten Bantul, Yogyakarta 55198', + 'source_url': 'https://dioramaarsip.jogjaprov.go.id/home', + 'notes': 'Digital archive diorama of Yogyakarta history, opened February 2022', + # It's actually an Archive (A), not Museum (M) + 'new_institution_type': 'A', + }, + # Batch 2: Added 2025-12-17 - More Indonesian and Palestinian institutions + { + 'old_filename': 'NL-XX-XXX-M-MBV.yaml', + 'institution_name': 'Museum Benteng Vredeburg', + 'country': 'ID', + 'country_name': 'Indonesia', + 'region': 'Daerah Istimewa Yogyakarta', + 'region_code': 'YO', + 'city': 'Yogyakarta', + 'city_code': 'YOG', + 'address': 'Jl. Margo Mulyo No.6, Ngupasan, Kec. Gondomanan, Kota Yogyakarta 55122', + 'source_url': 'https://forevervacation.com/yogyakarta/museum-benteng-vredeburg', + 'notes': 'Dutch colonial fortress converted to museum in 1992, documents Indonesian independence struggle', + }, + { + 'old_filename': 'NL-XX-XXX-M-MBP.yaml', + 'institution_name': 'Museum Batik Pekalongan', + 'country': 'ID', + 'country_name': 'Indonesia', + 'region': 'Jawa Tengah', + 'region_code': 'JT', # Central Java + 'city': 'Pekalongan', + 'city_code': 'PEK', + 'address': 'Jl. Jetayu No.1, Pekalongan 51152', + 'source_url': 'https://id.wikipedia.org/wiki/Museum_Batik_Pekalongan', + 'notes': 'UNESCO recognized museum for batik conservation, opened 12 July 2006 by President SBY', + }, + { + 'old_filename': 'NL-XX-XXX-M-MG.yaml', + 'institution_name': 'Municipality of Gaza', + 'country': 'PS', + 'country_name': 'Palestine', + 'region': 'Gaza Strip', + 'region_code': 'GZ', + 'city': 'Gaza City', + 'city_code': 'GAZ', + 'address': None, # Address not verifiable due to current situation + 'source_url': 'https://www.gaza-city.org', + 'notes': 'Municipal government, founded 1898. Type corrected from M (Museum) to O (Official Institution)', + # It's a municipality (government), not a museum + 'new_institution_type': 'O', + }, +] + + +def generate_ghcid_uuid(ghcid_string: str) -> str: + """Generate UUID v5 from GHCID string.""" + GLAM_NAMESPACE = uuid.UUID('6ba7b810-9dad-11d1-80b4-00c04fd430c8') + return str(uuid.uuid5(GLAM_NAMESPACE, ghcid_string)) + + +def generate_ghcid_numeric(ghcid_string: str) -> int: + """Generate 64-bit numeric ID from GHCID string.""" + sha256_hash = hashlib.sha256(ghcid_string.encode()).digest() + return int.from_bytes(sha256_hash[:8], byteorder='big') + + +def generate_ghcid_uuid_sha256(ghcid_string: str) -> str: + """Generate UUID v8 (SHA-256 based) from GHCID string.""" + sha256_hash = hashlib.sha256(ghcid_string.encode()).digest() + uuid_bytes = bytearray(sha256_hash[:16]) + uuid_bytes[6] = (uuid_bytes[6] & 0x0F) | 0x80 # Version 8 + uuid_bytes[8] = (uuid_bytes[8] & 0x3F) | 0x80 # Variant + return str(uuid.UUID(bytes=bytes(uuid_bytes))) + + +def fix_institution(custodian_dir: Path, inst: dict) -> tuple[str | None, str | None]: + """Fix a non-Dutch institution and return (old_path, new_path).""" + old_path = custodian_dir / inst['old_filename'] + + if not old_path.exists(): + print(f" File not found: {old_path}") + return None, None + + # Load YAML + with open(old_path, 'r', encoding='utf-8') as f: + data = yaml.safe_load(f) + + # Extract current GHCID components + old_ghcid = data['ghcid']['ghcid_current'] + + # Parse old GHCID to get type and abbreviation + # Format: NL-XX-XXX-{type}-{abbrev}[-{name_suffix}] + match = re.match(r'NL-XX-XXX-([A-Z])-([A-Z0-9]+)(?:-(.+))?', old_ghcid) + if not match: + print(f" Could not parse GHCID: {old_ghcid}") + return None, None + + inst_type = match.group(1) + abbrev = match.group(2) + name_suffix = match.group(3) # May be None + + # Check if we need to change institution type + if inst.get('new_institution_type'): + inst_type = inst['new_institution_type'] + # Also update the institution_type field + data['institution_type'] = [inst_type] + + # Build new GHCID with correct country + new_ghcid = f"{inst['country']}-{inst['region_code']}-{inst['city_code']}-{inst_type}-{abbrev}" + if name_suffix: + new_ghcid += f"-{name_suffix}" + + # Generate new identifiers + new_uuid = generate_ghcid_uuid(new_ghcid) + new_uuid_sha256 = generate_ghcid_uuid_sha256(new_ghcid) + new_numeric = generate_ghcid_numeric(new_ghcid) + + timestamp = datetime.now(timezone.utc).isoformat() + + # Update location + data['location'] = { + 'city': inst['city'], + 'region': inst['region'], + 'country': inst['country'], + } + if inst.get('address'): + data['location']['address'] = inst['address'] + + # Close out old ghcid_history entries + if 'ghcid_history' not in data['ghcid']: + data['ghcid']['ghcid_history'] = [] + + for entry in data['ghcid']['ghcid_history']: + if entry.get('valid_to') is None: + entry['valid_to'] = timestamp + + # Add new history entry + data['ghcid']['ghcid_history'].append({ + 'ghcid': new_ghcid, + 'ghcid_numeric': new_numeric, + 'valid_from': timestamp, + 'valid_to': None, + 'reason': f"Country code corrected: NL -> {inst['country']} ({inst['country_name']}). " + f"Location: {inst['city']}, {inst['region']}" + }) + + # Update current GHCID + data['ghcid']['ghcid_current'] = new_ghcid + data['ghcid']['ghcid_original'] = new_ghcid # Also update original since NL was wrong + data['ghcid']['ghcid_uuid'] = new_uuid + data['ghcid']['ghcid_uuid_sha256'] = new_uuid_sha256 + data['ghcid']['ghcid_numeric'] = new_numeric + + # Add location_resolution + data['ghcid']['location_resolution'] = { + 'method': 'EXA_WEB_SEARCH', + 'city_code': inst['city_code'], + 'city_name': inst['city'], + 'region_code': inst['region_code'], + 'region_name': inst['region'], + 'country_code': inst['country'], + 'resolution_date': timestamp, + 'source_url': inst.get('source_url'), + 'notes': inst.get('notes'), + } + + # Update provenance + if 'provenance' not in data: + data['provenance'] = {} + if 'notes' not in data['provenance']: + data['provenance']['notes'] = [] + data['provenance']['notes'].append( + f"Country code corrected on {timestamp[:10]}: NL was incorrect, " + f"institution is in {inst['country_name']} ({inst['country']})" + ) + + # Add web search source to provenance + if 'sources' not in data['provenance']: + data['provenance']['sources'] = {} + if 'web_search' not in data['provenance']['sources']: + data['provenance']['sources']['web_search'] = [] + data['provenance']['sources']['web_search'].append({ + 'source_type': 'exa_web_search', + 'data_tier': 'TIER_2_VERIFIED', # Higher tier since we verified country + 'source_url': inst.get('source_url'), + 'extraction_timestamp': timestamp, + 'claims_extracted': ['country', 'region', 'city', 'address'], + }) + + # Write updated YAML to new filename + new_filename = new_ghcid.replace('/', '_') + '.yaml' + new_path = custodian_dir / new_filename + + with open(new_path, 'w', encoding='utf-8') as f: + yaml.dump(data, f, default_flow_style=False, allow_unicode=True, sort_keys=False) + + # Remove old file + if old_path != new_path: + old_path.unlink() + + return str(old_path), str(new_path) + + +def main(): + custodian_dir = Path('/Users/kempersc/apps/glam/data/custodian') + + print("=" * 70) + print("Fixing Non-Dutch Institutions (Country Code Corrections)") + print("=" * 70) + + success_count = 0 + + for inst in NON_DUTCH_INSTITUTIONS: + print(f"\nProcessing: {inst['old_filename']}") + print(f" Institution: {inst['institution_name']}") + print(f" Correction: NL -> {inst['country']} ({inst['country_name']})") + print(f" Location: {inst['city']}, {inst['region']}") + + old_path, new_path = fix_institution(custodian_dir, inst) + + if old_path and new_path: + old_name = os.path.basename(old_path) + new_name = os.path.basename(new_path) + print(f" Renamed: {old_name}") + print(f" -> {new_name}") + success_count += 1 + + print("\n" + "=" * 70) + print(f"Summary: {success_count}/{len(NON_DUTCH_INSTITUTIONS)} institutions corrected") + print("=" * 70) + + +if __name__ == '__main__': + main() diff --git a/scripts/index_institutions_qdrant.py b/scripts/index_institutions_qdrant.py index 9634740689..b40591fcdc 100644 --- a/scripts/index_institutions_qdrant.py +++ b/scripts/index_institutions_qdrant.py @@ -202,14 +202,20 @@ def extract_metadata(data: dict[str, Any], filepath: Path) -> dict[str, Any]: metadata["country"] = loc["country"] if loc.get("city"): metadata["city"] = loc["city"] - if loc.get("region"): + # Use region_code (ISO 3166-2) for filtering, fallback to region name + if loc.get("region_code"): + metadata["region"] = loc["region_code"] # e.g., "NH" not "Noord-Holland" + elif loc.get("region"): metadata["region"] = loc["region"] elif location: if location.get("country"): metadata["country"] = location["country"] if location.get("city"): metadata["city"] = location["city"] - if location.get("region"): + # Use region_code (ISO 3166-2) for filtering, fallback to region name + if location.get("region_code"): + metadata["region"] = location["region_code"] # e.g., "NH" not "Noord-Holland" + elif location.get("region"): metadata["region"] = location["region"] # Also extract country from GHCID if not found elsewhere @@ -290,24 +296,15 @@ def extract_metadata(data: dict[str, Any], filepath: Path) -> dict[str, Any]: def find_institution_files(data_dir: Path) -> list[Path]: - """Find all institution YAML files in the data directory.""" + """Find all institution YAML files in the data directory. + + Optimized for large directories using os.listdir instead of glob. + """ + import os + files = [] - # Look for YAML files in common patterns - patterns = [ - "*.yaml", - "*.yml", - "**/*.yaml", - "**/*.yml", - ] - - for pattern in patterns: - files.extend(data_dir.glob(pattern)) - - # Deduplicate - files = list(set(files)) - - # Filter out non-institution files + # Filter patterns excluded_patterns = [ "_schema", "_config", @@ -316,12 +313,37 @@ def find_institution_files(data_dir: Path) -> list[Path]: "example_", ] - filtered = [] - for f in files: - if not any(excl in f.name.lower() for excl in excluded_patterns): - filtered.append(f) + def is_valid_file(name: str) -> bool: + """Check if file is a valid institution YAML file.""" + if not name.endswith(('.yaml', '.yml')): + return False + if name.startswith('.'): + return False + name_lower = name.lower() + return not any(excl in name_lower for excl in excluded_patterns) - return sorted(filtered) + # Get top-level YAML files (most common case - fast with os.listdir) + try: + for name in os.listdir(data_dir): + if is_valid_file(name): + filepath = data_dir / name + if filepath.is_file(): + files.append(filepath) + except PermissionError: + logger.warning(f"Permission denied accessing {data_dir}") + + # Check known subdirectories for additional files + known_subdirs = ["person", "web", "archived"] + for subdir in known_subdirs: + subdir_path = data_dir / subdir + if subdir_path.exists(): + for root, _, filenames in os.walk(subdir_path): + root_path = Path(root) + for name in filenames: + if is_valid_file(name): + files.append(root_path / name) + + return sorted(files) def main(): @@ -371,6 +393,12 @@ def main(): action="store_true", help="Parse files but don't index" ) + parser.add_argument( + "--limit", + type=int, + default=None, + help="Limit number of files to process (for testing)" + ) args = parser.parse_args() @@ -384,6 +412,11 @@ def main(): files = find_institution_files(args.data_dir) logger.info(f"Found {len(files)} institution files") + # Apply limit if specified + if args.limit: + files = files[:args.limit] + logger.info(f"Limited to {len(files)} files for processing") + if not files: logger.warning("No institution files found") sys.exit(0) diff --git a/scripts/sync/mappings.py b/scripts/sync/mappings.py new file mode 100644 index 0000000000..40410a2d50 --- /dev/null +++ b/scripts/sync/mappings.py @@ -0,0 +1,6643 @@ +""" +mappings.py - Data Transformation Mapping Documentation (Python Port) + +This module documents how raw YAML/JSON data from custodian files maps to: +1. LinkML schema classes and slots +2. TypeDB entities and attributes +3. RDF triples and predicates + +ARCHITECTURE OVERVIEW: +====================== + +The Heritage Custodian System uses a "hub architecture" where: +- CustodianHub: Abstract entity with only persistent hc_id +- CustodianObservation: Evidence/claims from a specific source +- ReconstructionActivity: Process that generates standardized aspects +- Four aspects: LegalStatus, Name, Place, Collection (independent temporal lifecycles) + +Each enrichment block in YAML (google_maps_enrichment, wikidata_enrichment, etc.) +maps to a SEPARATE CustodianObservation with its own provenance. + +DATA FLOW: +========== + + Raw YAML (data/custodian/*.yaml) + | + [Transform Layer] + | + LinkML Instance Data + | + +------+------+ + | | | + RDF TypeDB JSON-LD + +Ported from: frontend/src/lib/linkml/custodian-data-mappings.ts +Version: 1.0.0 +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from enum import Enum +from typing import Any, Optional + + +# ============================================================================ +# ENUMERATIONS +# ============================================================================ + +class TransformationType(str, Enum): + """Types of data transformations that can occur during mapping.""" + DIRECT = 'direct' # 1:1 copy, no transformation + RENAME = 'rename' # Field name change only + SPLIT = 'split' # One source field -> multiple target fields + MERGE = 'merge' # Multiple source fields -> one target field + LOOKUP = 'lookup' # Enum value lookup or reference resolution + COMPUTED = 'computed' # Derived/calculated value + NESTED = 'nested' # Nested object mapping (object -> object) + ARRAY_MAP = 'array_map' # Array transformation (array -> array with element mapping) + ARRAY_DIRECT = 'array_direct' # Direct array copy without element transformation + FLATTEN = 'flatten' # Nested structure -> flat structure + AGGREGATE = 'aggregate' # Multiple values -> single aggregate + TEMPORAL = 'temporal' # Date/time transformation + URI_CONSTRUCT = 'uri_construct' # Construct URI from components + NORMALIZE = 'normalize' # Normalize/standardize value format + CONDITIONAL = 'conditional' # Conditional transformation based on other fields + NOT_MAPPED = 'not_mapped' # Ontology property intentionally not mapped + + +class MappingStatus(str, Enum): + """Mapping status for ontology coverage documentation.""" + MAPPED = 'mapped' # Property is fully mapped to HC system + PARTIAL = 'partial' # Property is partially mapped + OUT_OF_SCOPE = 'out_of_scope' # Property is intentionally not mapped + FUTURE = 'future' # Property may be mapped in future versions + + +class DataTier(str, Enum): + """Data tier classification (per AGENTS.md).""" + TIER_1_AUTHORITATIVE = 'TIER_1_AUTHORITATIVE' # CSV registries (ISIL, Dutch orgs) + TIER_2_VERIFIED = 'TIER_2_VERIFIED' # Data from institutional websites, APIs + TIER_3_CROWD_SOURCED = 'TIER_3_CROWD_SOURCED' # Wikidata, OpenStreetMap + TIER_4_INFERRED = 'TIER_4_INFERRED' # NLP-extracted from conversations + + +# ============================================================================ +# DATACLASSES +# ============================================================================ + +@dataclass +class FieldExample: + """Example showing source -> target transformation.""" + source_value: Any + target_value: Any + typedb_value: Optional[Any] = None + rdf_triple: Optional[str] = None + + +@dataclass +class FieldValidation: + """Validation rules for a field.""" + type: str # 'string' | 'number' | 'boolean' | 'date' | 'uri' | 'enum' | 'array' + pattern: Optional[str] = None + enum_values: Optional[list[str]] = None + min_length: Optional[int] = None + max_length: Optional[int] = None + + +@dataclass +class FieldMapping: + """Mapping for a single field from source to target.""" + # JSON path in source YAML (e.g., "google_maps_enrichment.place_id"). None for unmapped. + source_path: Optional[str] + # Human-readable description of the source field + source_description: str + # LinkML class this maps to. None for unmapped ontology properties. + target_class: Optional[str] + # LinkML slot name. None for unmapped ontology properties. + target_slot: Optional[str] + # Type of transformation applied + transformation: TransformationType + # Human-readable explanation of the transformation + transformation_details: Optional[str] = None + # TypeDB entity type (snake-case with hyphens) + typedb_entity: Optional[str] = None + # TypeDB attribute name. None for unmapped ontology properties. + typedb_attribute: Optional[str] = None + # RDF predicate (CURIE format) + rdf_predicate: Optional[str] = None + # Whether this field is required + required: bool = False + # Example showing source -> target transformation + example: Optional[FieldExample] = None + # Related/dependent fields + related_fields: Optional[list[str]] = None + # Validation rules + validation: Optional[FieldValidation] = None + # Additional notes or comments about this mapping + notes: Optional[str] = None + # Mapping status for ontology coverage documentation + status: Optional[MappingStatus] = None + + +@dataclass +class Provenance: + """Provenance information for an enrichment source.""" + source_type: str + data_tier: DataTier + api_endpoint: Optional[str] = None + update_frequency: Optional[str] = None + + +@dataclass +class EnrichmentSourceMapping: + """Complete mapping for an enrichment source block.""" + # Source block name in YAML (e.g., "google_maps_enrichment") + source_block: str + # Human-readable description + description: str + # Primary LinkML class this maps to + linkml_class: str + # Primary TypeDB entity + typedb_entity: str + # Provenance information + provenance: Provenance + # All field mappings for this source + fields: list[FieldMapping] = field(default_factory=list) + # Extended description with usage notes + detailed_description: Optional[str] = None + # Classes that can be generated from this source + generated_classes: Optional[list[str]] = None + # Example YAML snippet + example_yaml: Optional[str] = None + + +@dataclass +class MappingCategory: + """Category grouping for mappings in the UI.""" + id: str + name: str + name_nl: str + description: str + description_nl: str + icon: str + sources: list[str] = field(default_factory=list) # sourceBlock names + + +# ============================================================================ +# MAPPING CATEGORIES (19 Custodian Categories) +# ============================================================================ + +MAPPING_CATEGORIES: list[MappingCategory] = [ + MappingCategory( + id='identity', + name='Identity & Identification', + name_nl='Identiteit & Identificatie', + description='Core identity fields: GHCID, names, identifiers', + description_nl='Kernidentiteitsvelden: GHCID, namen, identificatiecodes', + icon='🪪', + sources=['ghcid', 'identifiers', 'custodian_name'], + ), + MappingCategory( + id='location', + name='Location & Geography', + name_nl='Locatie & Geografie', + description='Physical location, addresses, coordinates', + description_nl='Fysieke locatie, adressen, coördinaten', + icon='📍', + sources=['location', 'google_maps_enrichment'], + ), + MappingCategory( + id='external', + name='External Data Sources', + name_nl='Externe Databronnen', + description='Enrichment from external APIs and databases', + description_nl="Verrijking van externe API's en databases", + icon='🔗', + sources=['wikidata_enrichment', 'museum_register_enrichment', 'genealogiewerkbalk_enrichment'], + ), + MappingCategory( + id='web', + name='Web & Digital Presence', + name_nl='Web & Digitale Aanwezigheid', + description='Website data, digital platforms, social media', + description_nl='Websitegegevens, digitale platformen, sociale media', + icon='🌐', + sources=['web_enrichment', 'web_claims', 'digital_platforms', 'youtube_enrichment'], + ), + MappingCategory( + id='legal', + name='Legal & Organization', + name_nl='Juridisch & Organisatie', + description='Legal status, organizational structure', + description_nl='Juridische status, organisatiestructuur', + icon='⚖️', + sources=['legal_status', 'original_entry'], + ), + MappingCategory( + id='temporal', + name='Temporal & Provenance', + name_nl='Temporeel & Herkomst', + description='Time spans, data provenance, versioning', + description_nl='Tijdspannes, data-herkomst, versiebeheer', + icon='⏱️', + sources=['timespan', 'provenance'], + ), + MappingCategory( + id='heritage', + name='Heritage Specific', + name_nl='Erfgoed Specifiek', + description='UNESCO, collections, domain-specific data', + description_nl='UNESCO, collecties, domeinspecifieke gegevens', + icon='🏛️', + sources=['unesco_ich_enrichment'], + ), + # ------------------------------------------------------------------------- + # PHASE 1 ADDITIONS: Schema Class Coverage Categories + # ------------------------------------------------------------------------- + MappingCategory( + id='archive_types', + name='Archive Types', + name_nl='Archieftypen', + description='Specialized archive classification types (97 classes): academic, audiovisual, church, municipal, national, etc.', + description_nl='Gespecialiseerde archiefclassificatietypen (97 klassen): academisch, audiovisueel, kerkelijk, gemeentelijk, nationaal, etc.', + icon='📦', + sources=[ + 'archive_type_academic', 'archive_type_audiovisual', 'archive_type_church', + 'archive_type_corporate', 'archive_type_government', 'archive_type_municipal', + 'archive_type_national', 'archive_type_regional', 'archive_type_specialized', + 'archive_type_thematic', + ], + ), + MappingCategory( + id='organizational_structure', + name='Organizational Structure', + name_nl='Organisatiestructuur', + description='Organizational hierarchy and structure classes (30+ classes): departments, divisions, branches, parent organizations', + description_nl='Organisatiehiërarchie en structuurklassen (30+ klassen): afdelingen, divisies, vestigingen, moederorganisaties', + icon='🏢', + sources=[ + 'org_structure_hierarchy', 'org_structure_administrative', 'org_structure_subdivision', + ], + ), + MappingCategory( + id='heritage_cultural', + name='Heritage & Cultural Sites', + name_nl='Erfgoed & Culturele Locaties', + description='World heritage sites, intangible heritage, cultural institutions (15+ classes)', + description_nl='Werelderfgoedlocaties, immaterieel erfgoed, culturele instellingen (15+ klassen)', + icon='🗿', + sources=[ + 'heritage_world_sites', 'heritage_intangible', 'heritage_national_treasures', + ], + ), + MappingCategory( + id='classification_types', + name='Classification Types', + name_nl='Classificatietypen', + description='Type classes for custodian classification (32 classes): MuseumType, LibraryType, ArchiveOrganizationType, etc.', + description_nl='Typeklassen voor bronhouderclassificatie (32 klassen): MuseumType, BibliotheekType, ArchiefOrganisatieType, etc.', + icon='🏷️', + sources=[ + 'type_classes_glam', 'type_classes_digital', 'type_classes_organizational', + ], + ), + # ------------------------------------------------------------------------- + # PHASE 2 ADDITIONS: Remaining Schema Class Coverage Categories + # ------------------------------------------------------------------------- + MappingCategory( + id='place_location', + name='Place & Location', + name_nl='Plaats & Locatie', + description='Geographic and spatial location classes (8 classes): settlements, countries, custodian places, feature places', + description_nl='Geografische en ruimtelijke locatieklassen (8 klassen): nederzettingen, landen, bronhouderplaatsen, kenmerkplaatsen', + icon='📍', + sources=[ + 'place_geographic', 'place_custodian_specific', + ], + ), + MappingCategory( + id='collections', + name='Collections & Holdings', + name_nl='Collecties & Bezittingen', + description='Collection management and holdings classes (6 classes): collections, special collections, collection management systems', + description_nl='Collectiebeheer en bezitklassen (6 klassen): collecties, bijzondere collecties, collectiebeheersystemen', + icon='🗃️', + sources=[ + 'collection_core', 'collection_management', + ], + ), + MappingCategory( + id='person_staff', + name='Person & Staff', + name_nl='Persoon & Personeel', + description='Person and staff-related classes (9 classes): profiles, connections, work experience, credentials', + description_nl="Persoon- en personeelgerelateerde klassen (9 klassen): profielen, connecties, werkervaring, diploma's", + icon='👥', + sources=[ + 'person_profile_extended', 'person_work_education', + ], + ), + MappingCategory( + id='digital_api', + name='Digital & API Services', + name_nl='Digitaal & API Diensten', + description='Digital platforms and API endpoint classes (11 classes): web portals, OAI-PMH, search APIs, file APIs', + description_nl="Digitale platformen en API-eindpuntklassen (11 klassen): webportalen, OAI-PMH, zoek-API's, bestand-API's", + icon='🔌', + sources=[ + 'digital_platforms_extended', 'api_endpoints', + ], + ), + MappingCategory( + id='video_media', + name='Video & Social Media', + name_nl='Video & Sociale Media', + description='Video content and social media classes (11 classes): video annotations, chapters, social media posts/profiles', + description_nl='Video-inhoud en sociale mediaklassen (11 klassen): video-annotaties, hoofdstukken, sociale media posts/profielen', + icon='🎬', + sources=[ + 'video_content', 'social_media_content', + ], + ), + MappingCategory( + id='legal_admin', + name='Legal & Administrative', + name_nl='Juridisch & Administratief', + description='Legal, policy, and administrative classes (9 classes): access policies, budgets, projects, registration', + description_nl='Juridische, beleids- en administratieve klassen (9 klassen): toegangsbeleid, budgetten, projecten, registratie', + icon='⚖️', + sources=[ + 'legal_policies', 'administrative_records', + ], + ), + MappingCategory( + id='finding_aids', + name='Finding Aids & Standards', + name_nl='Toegangen & Standaarden', + description='Finding aids, standards, and documentation classes (5 classes): finding aids, source documents, standards', + description_nl='Toegangen, standaarden en documentatieklassen (5 klassen): toegangen, brondocumenten, standaarden', + icon='📑', + sources=[ + 'finding_aids_standards', + ], + ), + MappingCategory( + id='reconstruction', + name='Reconstruction & Provenance', + name_nl='Reconstructie & Herkomst', + description='Entity reconstruction and provenance tracking classes (4 classes): reconstructed entities, activities, agents', + description_nl='Entiteitsreconstructie en herkomsttrackingklassen (4 klassen): gereconstrueerde entiteiten, activiteiten, agenten', + icon='🔄', + sources=[ + 'reconstruction_provenance', + ], + ), + MappingCategory( + id='storage_facilities', + name='Storage & Facilities', + name_nl='Opslag & Faciliteiten', + description='Storage conditions and facility classes (7 classes): storage types, conditions, education centers', + description_nl='Opslagcondities en faciliteitenklassen (7 klassen): opslagtypen, condities, onderwijscentra', + icon='🏪', + sources=[ + 'storage_facilities', + ], + ), + MappingCategory( + id='funding', + name='Funding & Grants', + name_nl='Financiering & Subsidies', + description='Funding and grant-related classes (3 classes): funding agendas, requirements, applications', + description_nl="Financiering- en subsidieklassen (3 klassen): financieringsagenda's, vereisten, aanvragen", + icon='💰', + sources=[ + 'funding_grants', + ], + ), + MappingCategory( + id='language_naming', + name='Language & Naming', + name_nl='Taal & Naamgeving', + description='Language and naming classes (4 classes): language codes, proficiency, appellations', + description_nl='Taal- en naamgevingsklassen (4 klassen): taalcodes, taalvaardigheid, benamingen', + icon='🗣️', + sources=[ + 'language_naming', + ], + ), + MappingCategory( + id='specialized_archives_intl', + name='Specialized Archives (International)', + name_nl='Gespecialiseerde Archieven (Internationaal)', + description='Country-specific specialized archive types (19 classes): German, Swedish, French, Czech archive types', + description_nl='Landspecifieke gespecialiseerde archieftypen (19 klassen): Duitse, Zweedse, Franse, Tsjechische archieftypen', + icon='🌍', + sources=[ + 'archives_german', 'archives_swedish', 'archives_french', 'archives_other', + ], + ), +] + + +# ============================================================================ +# ENRICHMENT SOURCE MAPPINGS +# ============================================================================ + +ENRICHMENT_MAPPINGS: list[EnrichmentSourceMapping] = [ + # ------------------------------------------------------------------------- + # GHCID - Global Heritage Custodian Identifier + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='ghcid', + description='Global Heritage Custodian Identifier - persistent unique identifier', + detailed_description=""" +The GHCID is the persistent unique identifier for every heritage custodian. +It follows the format: {COUNTRY}-{REGION}-{SETTLEMENT}-{TYPE}-{ABBREV} + +Example: NL-NH-AMS-M-RM (Rijksmuseum, Amsterdam, Netherlands) + +GHCIDs are deterministically generated and hashed to multiple UUID formats +for different use cases (UUID v5 for primary, UUID v8 for future-proofing). + """.strip(), + linkml_class='GHCID', + typedb_entity='ghcid', + provenance=Provenance( + source_type='computed', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + fields=[ + FieldMapping( + source_path='ghcid.ghcid_current', + source_description='Current GHCID string', + target_class='GHCID', + target_slot='ghcid_string', + transformation=TransformationType.DIRECT, + typedb_entity='ghcid', + typedb_attribute='ghcid-string', + rdf_predicate='hc:ghcidString', + required=True, + example=FieldExample( + source_value='NL-NH-AMS-M-RM', + target_value='NL-NH-AMS-M-RM', + rdf_triple=' hc:ghcidString "NL-NH-AMS-M-RM" .', + ), + ), + FieldMapping( + source_path='ghcid.ghcid_uuid', + source_description='UUID v5 derived from GHCID string', + target_class='GHCID', + target_slot='ghcid_uuid', + transformation=TransformationType.COMPUTED, + transformation_details='UUID v5 generated using SHA-1 hash of GHCID string with heritage namespace', + typedb_entity='ghcid', + typedb_attribute='ghcid-uuid', + rdf_predicate='hc:ghcidUuid', + required=True, + example=FieldExample( + source_value='550e8400-e29b-5d4f-a716-446655440000', + target_value='550e8400-e29b-5d4f-a716-446655440000', + ), + ), + FieldMapping( + source_path='ghcid.ghcid_numeric', + source_description='64-bit numeric ID for database optimization', + target_class='GHCID', + target_slot='ghcid_numeric', + transformation=TransformationType.COMPUTED, + transformation_details='SHA-256 hash truncated to 64-bit integer', + typedb_entity='ghcid', + typedb_attribute='ghcid-numeric', + required=False, + ), + FieldMapping( + source_path='ghcid.location_resolution', + source_description='GeoNames resolution metadata', + target_class='GHCID', + target_slot='location_resolution', + transformation=TransformationType.NESTED, + transformation_details='Maps to LocationResolution class with GeoNames provenance', + typedb_entity='location-resolution', + required=False, + ), + ], + example_yaml=""" +ghcid: + ghcid_current: NL-NH-AMS-M-RM + ghcid_uuid: 550e8400-e29b-5d4f-a716-446655440000 + ghcid_numeric: 213324328442227739 + location_resolution: + method: REVERSE_GEOCODE + geonames_id: 2759794 + geonames_name: Amsterdam + settlement_code: AMS + admin1_code: "07" + region_code: NH + """.strip(), + ), + + # ------------------------------------------------------------------------- + # Identifiers + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='identifiers', + description='External identifiers from various sources', + detailed_description=""" +Links to external identifier systems including: +- ISIL codes (International Standard Identifier for Libraries) +- Wikidata QIDs +- VIAF (Virtual International Authority File) +- KvK numbers (Dutch Chamber of Commerce) +- Museum Register numbers +- And more... + """.strip(), + linkml_class='Identifier', + typedb_entity='identifier', + provenance=Provenance( + source_type='registry_lookup', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + fields=[ + FieldMapping( + source_path='identifiers[].identifier_scheme', + source_description='Identifier system/scheme name', + target_class='Identifier', + target_slot='identifier_scheme', + transformation=TransformationType.LOOKUP, + transformation_details='Maps to IdentifierSchemeEnum', + typedb_entity='identifier', + typedb_attribute='scheme', + rdf_predicate='hc:identifierScheme', + required=True, + validation=FieldValidation( + type='enum', + enum_values=['GHCID', 'ISIL', 'Wikidata', 'VIAF', 'KvK', 'MuseumRegister', 'NDE', 'Website'], + ), + example=FieldExample( + source_value='ISIL', + target_value='ISIL', + ), + ), + FieldMapping( + source_path='identifiers[].identifier_value', + source_description='The identifier value/code', + target_class='Identifier', + target_slot='identifier_value', + transformation=TransformationType.DIRECT, + typedb_entity='identifier', + typedb_attribute='value', + rdf_predicate='hc:identifierValue', + required=True, + example=FieldExample( + source_value='NL-AmRM', + target_value='NL-AmRM', + ), + ), + FieldMapping( + source_path='identifiers[].identifier_url', + source_description='URL to the identifier record', + target_class='Identifier', + target_slot='identifier_url', + transformation=TransformationType.DIRECT, + typedb_entity='identifier', + typedb_attribute='url', + rdf_predicate='schema:url', + required=False, + example=FieldExample( + source_value='https://www.wikidata.org/wiki/Q190804', + target_value='https://www.wikidata.org/wiki/Q190804', + ), + ), + ], + example_yaml=""" +identifiers: + - identifier_scheme: GHCID + identifier_value: NL-NH-AMS-M-RM + - identifier_scheme: ISIL + identifier_value: NL-AmRM + - identifier_scheme: Wikidata + identifier_value: Q190804 + identifier_url: https://www.wikidata.org/wiki/Q190804 + - identifier_scheme: VIAF + identifier_value: "148691498" + """.strip(), + ), + + # ------------------------------------------------------------------------- + # Custodian Name + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='custodian_name', + description='Consensus name with confidence scoring', + detailed_description=""" +The canonical name determined through multi-source reconciliation. +Includes emic (native language) name with legal form stripped per Rule 8. +Confidence scores indicate how many sources agree on each name variant. + """.strip(), + linkml_class='CustodianName', + typedb_entity='custodian-name', + provenance=Provenance( + source_type='reconciliation', + data_tier=DataTier.TIER_2_VERIFIED, + ), + fields=[ + FieldMapping( + source_path='custodian_name.consensus_name', + source_description='Reconciled canonical name', + target_class='CustodianName', + target_slot='name_string', + transformation=TransformationType.DIRECT, + typedb_entity='custodian-name', + typedb_attribute='name-string', + rdf_predicate='skos:prefLabel', + required=True, + example=FieldExample( + source_value='Rijksmuseum', + target_value='Rijksmuseum', + rdf_triple=' skos:prefLabel "Rijksmuseum"@nl .', + ), + ), + FieldMapping( + source_path='custodian_name.emic_name', + source_description='Native language name (legal form stripped)', + target_class='CustodianName', + target_slot='emic_name', + transformation=TransformationType.NORMALIZE, + transformation_details='Legal form terms (Stichting, Foundation, etc.) removed per Rule 8', + typedb_entity='custodian-name', + typedb_attribute='emic-name', + rdf_predicate='hc:emicName', + required=False, + example=FieldExample( + source_value='Rijksmuseum Amsterdam', + target_value='Rijksmuseum Amsterdam', + ), + ), + FieldMapping( + source_path='custodian_name.confidence_score', + source_description='Confidence in name accuracy (0-1)', + target_class='CustodianName', + target_slot='confidence', + transformation=TransformationType.DIRECT, + typedb_entity='custodian-name', + typedb_attribute='confidence-score', + required=False, + validation=FieldValidation(type='number'), + example=FieldExample( + source_value=0.95, + target_value=0.95, + ), + ), + FieldMapping( + source_path='custodian_name.alternative_names', + source_description='List of alternative/historical names', + target_class='CustodianName', + target_slot='alternative_names', + transformation=TransformationType.ARRAY_DIRECT, + typedb_entity='custodian-name', + typedb_attribute='alternative-names', + rdf_predicate='skos:altLabel', + required=False, + ), + ], + example_yaml=""" +custodian_name: + consensus_name: Rijksmuseum + emic_name: Rijksmuseum Amsterdam + confidence_score: 0.95 + alternative_names: + - Rijksmuseum Amsterdam + - Netherlands State Museum + """.strip(), + ), + # ------------------------------------------------------------------------- + # Google Maps Enrichment + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='google_maps_enrichment', + description='Location and business data from Google Maps Places API', + detailed_description=""" +Rich location data including coordinates, address, opening hours, +ratings, reviews, and photos from Google Maps Places API. +Each enrichment creates a CustodianObservation with google_maps_api provenance. + """.strip(), + linkml_class='CustodianObservation', + typedb_entity='custodian-observation', + provenance=Provenance( + source_type='google_maps_api', + data_tier=DataTier.TIER_2_VERIFIED, + api_endpoint='https://maps.googleapis.com/maps/api/place/', + update_frequency='On-demand', + ), + generated_classes=['Place', 'GeoCoordinates', 'OpeningHours'], + fields=[ + FieldMapping( + source_path='google_maps_enrichment.place_id', + source_description='Google Maps Place ID', + target_class='CustodianObservation', + target_slot='external_id', + transformation=TransformationType.DIRECT, + typedb_entity='custodian-observation', + typedb_attribute='external-id', + rdf_predicate='schema:identifier', + required=True, + example=FieldExample( + source_value='ChIJ5Ra7we4JxkcRhYVAaq5zQ9U', + target_value='ChIJ5Ra7we4JxkcRhYVAaq5zQ9U', + ), + ), + FieldMapping( + source_path='google_maps_enrichment.coordinates.latitude', + source_description='Latitude coordinate', + target_class='GeoCoordinates', + target_slot='latitude', + transformation=TransformationType.NESTED, + typedb_entity='geo-coordinates', + typedb_attribute='latitude', + rdf_predicate='schema:latitude', + required=True, + validation=FieldValidation(type='number'), + example=FieldExample( + source_value=52.3599976, + target_value=52.3599976, + ), + ), + FieldMapping( + source_path='google_maps_enrichment.coordinates.longitude', + source_description='Longitude coordinate', + target_class='GeoCoordinates', + target_slot='longitude', + transformation=TransformationType.NESTED, + typedb_entity='geo-coordinates', + typedb_attribute='longitude', + rdf_predicate='schema:longitude', + required=True, + validation=FieldValidation(type='number'), + example=FieldExample( + source_value=4.8852188, + target_value=4.8852188, + ), + ), + FieldMapping( + source_path='google_maps_enrichment.formatted_address', + source_description='Human-readable formatted address', + target_class='Place', + target_slot='formatted_address', + transformation=TransformationType.DIRECT, + typedb_entity='place', + typedb_attribute='formatted-address', + rdf_predicate='schema:address', + required=False, + example=FieldExample( + source_value='Museumstraat 1, 1071 XX Amsterdam, Netherlands', + target_value='Museumstraat 1, 1071 XX Amsterdam, Netherlands', + ), + ), + FieldMapping( + source_path='google_maps_enrichment.rating', + source_description='Average rating (1-5)', + target_class='CustodianObservation', + target_slot='rating', + transformation=TransformationType.DIRECT, + typedb_entity='custodian-observation', + typedb_attribute='rating', + rdf_predicate='schema:aggregateRating', + required=False, + validation=FieldValidation(type='number'), + example=FieldExample( + source_value=4.6, + target_value=4.6, + ), + ), + FieldMapping( + source_path='google_maps_enrichment.total_ratings', + source_description='Total number of ratings', + target_class='CustodianObservation', + target_slot='review_count', + transformation=TransformationType.DIRECT, + typedb_entity='custodian-observation', + typedb_attribute='review-count', + rdf_predicate='schema:reviewCount', + required=False, + validation=FieldValidation(type='number'), + example=FieldExample( + source_value=47832, + target_value=47832, + ), + ), + FieldMapping( + source_path='google_maps_enrichment.opening_hours', + source_description='Weekly opening hours schedule', + target_class='OpeningHours', + target_slot='opening_hours_specification', + transformation=TransformationType.NESTED, + transformation_details='Maps to OpeningHoursSpecification array per day', + typedb_entity='opening-hours', + rdf_predicate='schema:openingHoursSpecification', + required=False, + ), + FieldMapping( + source_path='google_maps_enrichment.website', + source_description='Official website URL', + target_class='CustodianObservation', + target_slot='website', + transformation=TransformationType.DIRECT, + typedb_entity='custodian-observation', + typedb_attribute='website', + rdf_predicate='schema:url', + required=False, + validation=FieldValidation(type='uri'), + example=FieldExample( + source_value='https://www.rijksmuseum.nl/', + target_value='https://www.rijksmuseum.nl/', + ), + ), + FieldMapping( + source_path='google_maps_enrichment.phone', + source_description='Phone number', + target_class='CustodianObservation', + target_slot='telephone', + transformation=TransformationType.DIRECT, + typedb_entity='custodian-observation', + typedb_attribute='telephone', + rdf_predicate='schema:telephone', + required=False, + example=FieldExample( + source_value='+31 20 674 7000', + target_value='+31 20 674 7000', + ), + ), + ], + example_yaml=""" +google_maps_enrichment: + place_id: ChIJ5Ra7we4JxkcRhYVAaq5zQ9U + name: Rijksmuseum + coordinates: + latitude: 52.3599976 + longitude: 4.8852188 + formatted_address: Museumstraat 1, 1071 XX Amsterdam, Netherlands + rating: 4.6 + total_ratings: 47832 + website: https://www.rijksmuseum.nl/ + phone: +31 20 674 7000 + opening_hours: + Monday: 9:00 AM - 5:00 PM + Tuesday: 9:00 AM - 5:00 PM + # ... + """.strip(), + ), + # ------------------------------------------------------------------------- + # Wikidata Enrichment + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='wikidata_enrichment', + description='Linked data from Wikidata knowledge graph', + detailed_description=""" +Rich semantic data from Wikidata including: +- Multilingual labels and descriptions +- Sitelinks to Wikipedia articles +- Structured properties (coordinates, founding date, etc.) +- Instance-of relationships for type classification + +Creates a CustodianObservation with wikidata_api provenance. + """.strip(), + linkml_class='CustodianObservation', + typedb_entity='custodian-observation', + provenance=Provenance( + source_type='wikidata_api', + data_tier=DataTier.TIER_3_CROWD_SOURCED, + api_endpoint='https://www.wikidata.org/wiki/Special:EntityData/', + ), + generated_classes=['WikidataEntity', 'Sitelink'], + fields=[ + FieldMapping( + source_path='wikidata_enrichment.entity_id', + source_description='Wikidata Q-ID', + target_class='CustodianObservation', + target_slot='external_id', + transformation=TransformationType.DIRECT, + typedb_entity='custodian-observation', + typedb_attribute='external-id', + rdf_predicate='schema:identifier', + required=True, + example=FieldExample( + source_value='Q190804', + target_value='Q190804', + rdf_triple=' schema:identifier "Q190804" .', + ), + ), + FieldMapping( + source_path='wikidata_enrichment.labels', + source_description='Multilingual labels', + target_class='CustodianObservation', + target_slot='labels', + transformation=TransformationType.NESTED, + transformation_details='Language-tagged strings (e.g., {"en": "Rijksmuseum", "nl": "Rijksmuseum"})', + typedb_entity='custodian-observation', + rdf_predicate='rdfs:label', + required=False, + ), + FieldMapping( + source_path='wikidata_enrichment.descriptions', + source_description='Multilingual descriptions', + target_class='CustodianObservation', + target_slot='descriptions', + transformation=TransformationType.NESTED, + typedb_entity='custodian-observation', + rdf_predicate='schema:description', + required=False, + ), + FieldMapping( + source_path='wikidata_enrichment.sitelinks', + source_description='Links to Wikipedia articles', + target_class='Sitelink', + target_slot='sitelinks', + transformation=TransformationType.ARRAY_MAP, + transformation_details='Each sitelink maps to Wikipedia article URL', + typedb_entity='sitelink', + rdf_predicate='schema:sameAs', + required=False, + ), + FieldMapping( + source_path='wikidata_enrichment.instance_of', + source_description='Wikidata type classification (P31)', + target_class='CustodianObservation', + target_slot='instance_of', + transformation=TransformationType.LOOKUP, + transformation_details='Maps Q-ID to CustodianTypeEnum', + typedb_entity='custodian-observation', + typedb_attribute='wikidata-type', + rdf_predicate='wdt:P31', + required=False, + example=FieldExample( + source_value='Q33506', + target_value='MUSEUM', + ), + ), + FieldMapping( + source_path='wikidata_enrichment.coordinates', + source_description='Geographic coordinates from Wikidata (P625)', + target_class='GeoCoordinates', + target_slot='coordinates', + transformation=TransformationType.NESTED, + typedb_entity='geo-coordinates', + rdf_predicate='wdt:P625', + required=False, + ), + FieldMapping( + source_path='wikidata_enrichment.founding_date', + source_description='Date of establishment (P571)', + target_class='CustodianObservation', + target_slot='founding_date', + transformation=TransformationType.TEMPORAL, + transformation_details='Wikidata time format to ISO 8601', + typedb_entity='custodian-observation', + typedb_attribute='founding-date', + rdf_predicate='wdt:P571', + required=False, + validation=FieldValidation(type='date'), + example=FieldExample( + source_value='+1800-01-01T00:00:00Z', + target_value='1800-01-01', + ), + ), + ], + example_yaml=""" +wikidata_enrichment: + entity_id: Q190804 + labels: + en: Rijksmuseum + nl: Rijksmuseum + de: Rijksmuseum + fr: Rijksmuseum + descriptions: + en: Dutch national museum in Amsterdam + nl: Nederlands nationaal museum in Amsterdam + sitelinks: + enwiki: Rijksmuseum + nlwiki: Rijksmuseum + dewiki: Rijksmuseum + instance_of: + id: Q33506 + label: museum + coordinates: + latitude: 52.36 + longitude: 4.885 + founding_date: "+1800-01-01T00:00:00Z" + """.strip(), + ), + # ------------------------------------------------------------------------- + # Location (Canonical) + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='location', + description='Normalized canonical location', + detailed_description=""" +The authoritative location record after reconciliation from multiple sources. +This is the single source of truth for the custodian's physical location. + """.strip(), + linkml_class='Place', + typedb_entity='place', + provenance=Provenance( + source_type='reconciliation', + data_tier=DataTier.TIER_2_VERIFIED, + ), + fields=[ + FieldMapping( + source_path='location.city', + source_description='City name', + target_class='Place', + target_slot='city', + transformation=TransformationType.DIRECT, + typedb_entity='place', + typedb_attribute='city', + rdf_predicate='schema:addressLocality', + required=True, + example=FieldExample( + source_value='Amsterdam', + target_value='Amsterdam', + ), + ), + FieldMapping( + source_path='location.country', + source_description='ISO 3166-1 alpha-2 country code', + target_class='Place', + target_slot='country', + transformation=TransformationType.LOOKUP, + transformation_details='Maps to CountryCodeEnum', + typedb_entity='place', + typedb_attribute='country-code', + rdf_predicate='schema:addressCountry', + required=True, + validation=FieldValidation( + type='enum', + pattern='^[A-Z]{2}$', + ), + example=FieldExample( + source_value='NL', + target_value='NL', + ), + ), + FieldMapping( + source_path='location.region', + source_description='Region/province name', + target_class='Place', + target_slot='region', + transformation=TransformationType.DIRECT, + typedb_entity='place', + typedb_attribute='region', + rdf_predicate='schema:addressRegion', + required=False, + example=FieldExample( + source_value='North Holland', + target_value='North Holland', + ), + ), + FieldMapping( + source_path='location.postal_code', + source_description='Postal/ZIP code', + target_class='Place', + target_slot='postal_code', + transformation=TransformationType.DIRECT, + typedb_entity='place', + typedb_attribute='postal-code', + rdf_predicate='schema:postalCode', + required=False, + example=FieldExample( + source_value='1071 XX', + target_value='1071 XX', + ), + ), + FieldMapping( + source_path='location.street_address', + source_description='Street address', + target_class='Place', + target_slot='street_address', + transformation=TransformationType.DIRECT, + typedb_entity='place', + typedb_attribute='street-address', + rdf_predicate='schema:streetAddress', + required=False, + example=FieldExample( + source_value='Museumstraat 1', + target_value='Museumstraat 1', + ), + ), + ], + example_yaml=""" +location: + city: Amsterdam + country: NL + region: North Holland + postal_code: 1071 XX + street_address: Museumstraat 1 + """.strip(), + ), + # ------------------------------------------------------------------------- + # Web Enrichment + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='web_enrichment', + description='Archived website data and scraped content', + detailed_description=""" +Content extracted from the institution's website using web scraping tools. +Includes organization details, collections, exhibitions, contact info, etc. +All claims must have XPath provenance per Rule 6. + """.strip(), + linkml_class='WebObservation', + typedb_entity='web-observation', + provenance=Provenance( + source_type='web_scrape', + data_tier=DataTier.TIER_2_VERIFIED, + ), + generated_classes=['WebClaim'], + fields=[ + FieldMapping( + source_path='web_enrichment.source_url', + source_description='URL of scraped page', + target_class='WebObservation', + target_slot='source_url', + transformation=TransformationType.DIRECT, + typedb_entity='web-observation', + typedb_attribute='source-url', + rdf_predicate='prov:wasDerivedFrom', + required=True, + validation=FieldValidation(type='uri'), + ), + FieldMapping( + source_path='web_enrichment.retrieved_on', + source_description='Timestamp when page was archived', + target_class='WebObservation', + target_slot='retrieved_on', + transformation=TransformationType.TEMPORAL, + typedb_entity='web-observation', + typedb_attribute='retrieved-on', + rdf_predicate='prov:generatedAtTime', + required=True, + validation=FieldValidation(type='date'), + ), + FieldMapping( + source_path='web_enrichment.html_file', + source_description='Path to archived HTML file', + target_class='WebObservation', + target_slot='archive_path', + transformation=TransformationType.DIRECT, + typedb_entity='web-observation', + typedb_attribute='archive-path', + required=False, + ), + FieldMapping( + source_path='web_enrichment.organization_details', + source_description='Extracted organization information', + target_class='WebObservation', + target_slot='extracted_content', + transformation=TransformationType.NESTED, + typedb_entity='web-observation', + required=False, + ), + ], + example_yaml=""" +web_enrichment: + source_url: https://www.rijksmuseum.nl/en/about-us + retrieved_on: "2025-01-15T10:30:00Z" + html_file: web/NL-NH-AMS-M-RM/rijksmuseum.nl/about-us.html + retrieval_agent: firecrawl + organization_details: + mission: "To connect people with art and history" + established: "1800" + collection_size: "1 million objects" + """.strip(), + ), + # ------------------------------------------------------------------------- + # Web Claims + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='web_claims', + description='Verified claims extracted from websites with XPath provenance', + detailed_description=""" +Individual facts extracted from web pages with full provenance chain. +Each claim MUST have XPath pointer to exact location in archived HTML. +Claims without XPath provenance are fabricated and must be removed per Rule 6. + """.strip(), + linkml_class='WebClaim', + typedb_entity='web-claim', + provenance=Provenance( + source_type='web_extraction', + data_tier=DataTier.TIER_2_VERIFIED, + ), + fields=[ + FieldMapping( + source_path='web_claims[].claim_type', + source_description='Type of claim (full_name, email, phone, etc.)', + target_class='WebClaim', + target_slot='claim_type', + transformation=TransformationType.LOOKUP, + typedb_entity='web-claim', + typedb_attribute='claim-type', + rdf_predicate='hc:claimType', + required=True, + validation=FieldValidation( + type='enum', + enum_values=['full_name', 'description', 'email', 'phone', 'address', 'opening_hours', 'social_media'], + ), + ), + FieldMapping( + source_path='web_claims[].claim_value', + source_description='The extracted value', + target_class='WebClaim', + target_slot='claim_value', + transformation=TransformationType.DIRECT, + typedb_entity='web-claim', + typedb_attribute='claim-value', + rdf_predicate='rdf:value', + required=True, + ), + FieldMapping( + source_path='web_claims[].xpath', + source_description='XPath to element containing value', + target_class='WebClaim', + target_slot='xpath', + transformation=TransformationType.DIRECT, + typedb_entity='web-claim', + typedb_attribute='xpath', + rdf_predicate='hc:xpath', + required=True, + ), + FieldMapping( + source_path='web_claims[].source_url', + source_description='URL where claim was extracted', + target_class='WebClaim', + target_slot='source_url', + transformation=TransformationType.DIRECT, + typedb_entity='web-claim', + typedb_attribute='source-url', + rdf_predicate='prov:wasDerivedFrom', + required=True, + validation=FieldValidation(type='uri'), + ), + FieldMapping( + source_path='web_claims[].xpath_match_score', + source_description='Match confidence (1.0 = exact)', + target_class='WebClaim', + target_slot='match_score', + transformation=TransformationType.DIRECT, + typedb_entity='web-claim', + typedb_attribute='match-score', + required=False, + validation=FieldValidation(type='number'), + ), + ], + example_yaml=""" +web_claims: + - claim_type: full_name + claim_value: Rijksmuseum Amsterdam + source_url: https://www.rijksmuseum.nl/ + retrieved_on: "2025-01-15T10:30:00Z" + xpath: /html/body/header/div[1]/a/span + html_file: web/NL-NH-AMS-M-RM/rijksmuseum.nl/index.html + xpath_match_score: 1.0 + """.strip(), + ), + # ------------------------------------------------------------------------- + # Provenance + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='provenance', + description='Data lineage and source tracking', + detailed_description=""" +Metadata about where the data came from, when it was collected, +and how confident we are in its accuracy. + """.strip(), + linkml_class='Provenance', + typedb_entity='provenance', + provenance=Provenance( + source_type='metadata', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + fields=[ + FieldMapping( + source_path='provenance.data_source', + source_description='Origin of the data', + target_class='Provenance', + target_slot='data_source', + transformation=TransformationType.LOOKUP, + typedb_entity='provenance', + typedb_attribute='data-source', + rdf_predicate='prov:wasAttributedTo', + required=True, + validation=FieldValidation( + type='enum', + enum_values=['CSV_REGISTRY', 'CONVERSATION_NLP', 'API_ENRICHMENT', 'WEB_SCRAPE', 'MANUAL_ENTRY'], + ), + ), + FieldMapping( + source_path='provenance.data_tier', + source_description='Data quality tier', + target_class='Provenance', + target_slot='data_tier', + transformation=TransformationType.LOOKUP, + typedb_entity='provenance', + typedb_attribute='data-tier', + rdf_predicate='hc:dataTier', + required=True, + validation=FieldValidation( + type='enum', + enum_values=['TIER_1_AUTHORITATIVE', 'TIER_2_VERIFIED', 'TIER_3_CROWD_SOURCED', 'TIER_4_INFERRED'], + ), + ), + FieldMapping( + source_path='provenance.extraction_date', + source_description='When data was extracted', + target_class='Provenance', + target_slot='extraction_date', + transformation=TransformationType.TEMPORAL, + typedb_entity='provenance', + typedb_attribute='extraction-date', + rdf_predicate='prov:generatedAtTime', + required=True, + validation=FieldValidation(type='date'), + ), + FieldMapping( + source_path='provenance.confidence_score', + source_description='Confidence in data accuracy (0-1)', + target_class='Provenance', + target_slot='confidence_score', + transformation=TransformationType.DIRECT, + typedb_entity='provenance', + typedb_attribute='confidence-score', + rdf_predicate='hc:confidenceScore', + required=False, + validation=FieldValidation(type='number'), + ), + ], + example_yaml=""" +provenance: + data_source: API_ENRICHMENT + data_tier: TIER_2_VERIFIED + extraction_date: "2025-01-15T10:30:00Z" + extraction_method: "Google Maps Places API + Wikidata SPARQL" + confidence_score: 0.92 + source_files: + - google_maps_enrichment + - wikidata_enrichment + """.strip(), + ), + # ------------------------------------------------------------------------- + # Timespan + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='timespan', + description='Temporal bounds (CIDOC-CRM style)', + detailed_description=""" +Temporal information following CIDOC-CRM E52 Time-Span pattern. +Captures founding date, closure date (if applicable), and temporal bounds. + """.strip(), + linkml_class='TimeSpan', + typedb_entity='time-span', + provenance=Provenance( + source_type='derived', + data_tier=DataTier.TIER_2_VERIFIED, + ), + fields=[ + FieldMapping( + source_path='timespan.begin_of_the_begin', + source_description='Earliest possible start date', + target_class='TimeSpan', + target_slot='begin_of_the_begin', + transformation=TransformationType.TEMPORAL, + typedb_entity='time-span', + typedb_attribute='begin-of-the-begin', + rdf_predicate='crm:P82a_begin_of_the_begin', + required=False, + validation=FieldValidation(type='date'), + ), + FieldMapping( + source_path='timespan.end_of_the_begin', + source_description='Latest possible start date', + target_class='TimeSpan', + target_slot='end_of_the_begin', + transformation=TransformationType.TEMPORAL, + typedb_entity='time-span', + typedb_attribute='end-of-the-begin', + rdf_predicate='crm:P81a_end_of_the_begin', + required=False, + validation=FieldValidation(type='date'), + ), + FieldMapping( + source_path='timespan.begin_of_the_end', + source_description='Earliest possible end date', + target_class='TimeSpan', + target_slot='begin_of_the_end', + transformation=TransformationType.TEMPORAL, + typedb_entity='time-span', + typedb_attribute='begin-of-the-end', + rdf_predicate='crm:P81b_begin_of_the_end', + required=False, + validation=FieldValidation(type='date'), + ), + FieldMapping( + source_path='timespan.end_of_the_end', + source_description='Latest possible end date', + target_class='TimeSpan', + target_slot='end_of_the_end', + transformation=TransformationType.TEMPORAL, + typedb_entity='time-span', + typedb_attribute='end-of-the-end', + rdf_predicate='crm:P82b_end_of_the_end', + required=False, + validation=FieldValidation(type='date'), + ), + ], + example_yaml=""" +timespan: + begin_of_the_begin: "1800-01-01" + end_of_the_begin: "1800-12-31" + # Museum still operating - no end dates + """.strip(), + ), + # ------------------------------------------------------------------------- + # Legal Status + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='legal_status', + description='Legal form and organizational structure', + detailed_description=""" +Legal entity information including legal form (foundation, corporation, etc.), +registration numbers, and governing body information. + """.strip(), + linkml_class='CustodianLegalStatus', + typedb_entity='custodian-legal-status', + provenance=Provenance( + source_type='registry_lookup', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + fields=[ + FieldMapping( + source_path='legal_status.legal_form', + source_description='ISO 20275 legal form code', + target_class='CustodianLegalStatus', + target_slot='legal_form', + transformation=TransformationType.LOOKUP, + transformation_details='Maps to ISO 20275 Entity Legal Form codes', + typedb_entity='custodian-legal-status', + typedb_attribute='legal-form', + rdf_predicate='org:classification', + required=False, + example=FieldExample( + source_value='stichting', + target_value='NL_STI', # ISO 20275 code + ), + ), + FieldMapping( + source_path='legal_status.legal_name', + source_description='Full registered name including legal form', + target_class='CustodianLegalStatus', + target_slot='legal_name', + transformation=TransformationType.DIRECT, + typedb_entity='custodian-legal-status', + typedb_attribute='legal-name', + rdf_predicate='schema:legalName', + required=False, + example=FieldExample( + source_value='Stichting Rijksmuseum', + target_value='Stichting Rijksmuseum', + ), + ), + FieldMapping( + source_path='legal_status.kvk_number', + source_description='Dutch Chamber of Commerce number', + target_class='CustodianLegalStatus', + target_slot='kvk_number', + transformation=TransformationType.DIRECT, + typedb_entity='custodian-legal-status', + typedb_attribute='kvk-number', + rdf_predicate='hc:kvkNumber', + required=False, + validation=FieldValidation( + type='string', + pattern='^[0-9]{8}$', + ), + ), + ], + example_yaml=""" +legal_status: + legal_form: stichting + legal_name: Stichting Rijksmuseum + kvk_number: "10205502" + registered_address: Amsterdam + """.strip(), + ), + # ------------------------------------------------------------------------- + # Digital Platforms + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='digital_platforms', + description='Website and digital platform metadata', + detailed_description=""" +Information about the institution's digital presence including +primary website, collection management systems, discovery portals, and APIs. + """.strip(), + linkml_class='DigitalPlatform', + typedb_entity='digital-platform', + provenance=Provenance( + source_type='web_discovery', + data_tier=DataTier.TIER_2_VERIFIED, + ), + fields=[ + FieldMapping( + source_path='digital_platforms[].platform_name', + source_description='Name of the platform', + target_class='DigitalPlatform', + target_slot='platform_name', + transformation=TransformationType.DIRECT, + typedb_entity='digital-platform', + typedb_attribute='platform-name', + rdf_predicate='schema:name', + required=True, + ), + FieldMapping( + source_path='digital_platforms[].platform_url', + source_description='URL of the platform', + target_class='DigitalPlatform', + target_slot='platform_url', + transformation=TransformationType.DIRECT, + typedb_entity='digital-platform', + typedb_attribute='platform-url', + rdf_predicate='schema:url', + required=True, + validation=FieldValidation(type='uri'), + ), + FieldMapping( + source_path='digital_platforms[].platform_type', + source_description='Type of platform', + target_class='DigitalPlatform', + target_slot='platform_type', + transformation=TransformationType.LOOKUP, + typedb_entity='digital-platform', + typedb_attribute='platform-type', + rdf_predicate='hc:platformType', + required=False, + validation=FieldValidation( + type='enum', + enum_values=['WEBSITE', 'COLLECTION_PORTAL', 'DISCOVERY_PLATFORM', 'API', 'SOCIAL_MEDIA'], + ), + ), + ], + example_yaml=""" +digital_platforms: + - platform_name: Rijksmuseum Website + platform_url: https://www.rijksmuseum.nl/ + platform_type: WEBSITE + - platform_name: Rijksstudio + platform_url: https://www.rijksmuseum.nl/en/rijksstudio + platform_type: COLLECTION_PORTAL + - platform_name: Rijksmuseum API + platform_url: https://data.rijksmuseum.nl/ + platform_type: API + """.strip(), + ), + + # ========================================================================= + # ARCHIVE TYPE MAPPINGS + # ========================================================================= + + # ------------------------------------------------------------------------- + # archive_type_academic + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='archive_type_academic', + description='Academic and research archive types - universities, institutes, learned societies', + detailed_description=""" +Academic archives serve educational and research institutions. They preserve: +- University records and institutional history +- Research data and scholarly outputs +- Student and faculty records +- Scientific collections and specimen documentation + +Classes: AcademicArchive, UniversityArchive, ScientificArchive, InstitutionalArchive + """.strip(), + linkml_class='AcademicArchive', + typedb_entity='academic-archive', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'AcademicArchive', + 'UniversityArchive', + 'ScientificArchive', + 'InstitutionalArchive', + 'InstitutionalRepository', + ], + fields=[ + FieldMapping( + source_path=None, + source_description='Archive classification type for academic institutions', + target_class='AcademicArchive', + target_slot='archive_type', + transformation=TransformationType.LOOKUP, + typedb_entity='academic-archive', + typedb_attribute='archive-classification', + rdf_predicate='hc:archiveType', + required=True, + status=MappingStatus.MAPPED, + notes='Subclass of Archive with specialization for academic/research contexts', + ), + FieldMapping( + source_path='institution_type', + source_description='Parent educational institution type', + target_class='AcademicArchive', + target_slot='parent_institution_type', + transformation=TransformationType.LOOKUP, + typedb_entity='academic-archive', + typedb_attribute='parent-institution-type', + rdf_predicate='hc:parentInstitutionType', + required=False, + validation=FieldValidation( + type='enum', + enum_values=['UNIVERSITY', 'RESEARCH_INSTITUTE', 'ACADEMY', 'LEARNED_SOCIETY'], + ), + ), + ], + example_yaml=""" +# AcademicArchive instance +institution_type: ARCHIVE +archive_classification: ACADEMIC +parent_institution: University of Amsterdam +specializations: + - scientific_records + - research_data + - institutional_history + """.strip(), + ), + + # ------------------------------------------------------------------------- + # archive_type_audiovisual + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='archive_type_audiovisual', + description='Audiovisual archive types - film, sound, television, radio', + detailed_description=""" +Audiovisual archives preserve time-based media including: +- Film and cinema collections (Cinematheque, FilmArchive) +- Sound recordings (SoundArchive, MusicArchive, AnimalSoundArchive) +- Television and radio broadcasts (TelevisionArchive, RadioArchive) +- Media-specific preservation requirements + +Classes: AudiovisualArchive, FilmArchive, Cinematheque, SoundArchive, + MusicArchive, RadioArchive, TelevisionArchive, AnimalSoundArchive, + MediaArchive, AdvertisingRadioArchive + """.strip(), + linkml_class='AudiovisualArchive', + typedb_entity='audiovisual-archive', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'AudiovisualArchive', + 'FilmArchive', + 'Cinematheque', + 'SoundArchive', + 'MusicArchive', + 'RadioArchive', + 'TelevisionArchive', + 'AnimalSoundArchive', + 'MediaArchive', + 'AdvertisingRadioArchive', + ], + fields=[ + FieldMapping( + source_path=None, + source_description='Audiovisual archive classification', + target_class='AudiovisualArchive', + target_slot='archive_type', + transformation=TransformationType.LOOKUP, + typedb_entity='audiovisual-archive', + typedb_attribute='archive-classification', + rdf_predicate='hc:archiveType', + required=True, + status=MappingStatus.MAPPED, + ), + FieldMapping( + source_path='media_types', + source_description='Types of media held in collection', + target_class='AudiovisualArchive', + target_slot='media_types', + transformation=TransformationType.ARRAY_DIRECT, + typedb_entity='audiovisual-archive', + typedb_attribute='media-types', + rdf_predicate='hc:mediaTypes', + required=False, + validation=FieldValidation( + type='array', + enum_values=['FILM', 'VIDEO', 'AUDIO', 'RADIO', 'TELEVISION', 'DIGITAL_MEDIA'], + ), + ), + ], + example_yaml=""" +# FilmArchive instance (e.g., EYE Filmmuseum) +institution_type: ARCHIVE +archive_classification: AUDIOVISUAL +subtype: FILM_ARCHIVE +media_types: + - FILM + - VIDEO + - DIGITAL_MEDIA +preservation_formats: + - 35mm + - 16mm + - digital_preservation + """.strip(), + ), + + # ------------------------------------------------------------------------- + # archive_type_church + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='archive_type_church', + description='Religious archive types - church, diocesan, monastery, parish', + detailed_description=""" +Religious archives document faith communities and their histories: +- Church administration and governance (ChurchArchive, DiocesanArchive) +- Religious orders and communities (MonasteryArchive, ReligiousArchive) +- Parish records and sacramental registers (ParishArchive) +- Regional variations (ChurchArchiveSweden, CathedralArchive) + +Classes: ChurchArchive, DiocesanArchive, MonasteryArchive, ParishArchive, + ReligiousArchive, CathedralArchive, ChurchArchiveSweden + """.strip(), + linkml_class='ChurchArchive', + typedb_entity='church-archive', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'ChurchArchive', + 'DiocesanArchive', + 'MonasteryArchive', + 'ParishArchive', + 'ReligiousArchive', + 'CathedralArchive', + 'ChurchArchiveSweden', + ], + fields=[ + FieldMapping( + source_path=None, + source_description='Religious archive classification', + target_class='ChurchArchive', + target_slot='archive_type', + transformation=TransformationType.LOOKUP, + typedb_entity='church-archive', + typedb_attribute='archive-classification', + rdf_predicate='hc:archiveType', + required=True, + status=MappingStatus.MAPPED, + ), + FieldMapping( + source_path='religious_denomination', + source_description='Religious denomination or tradition', + target_class='ChurchArchive', + target_slot='denomination', + transformation=TransformationType.DIRECT, + typedb_entity='church-archive', + typedb_attribute='denomination', + rdf_predicate='hc:denomination', + required=False, + ), + ], + example_yaml=""" +# DiocesanArchive instance +institution_type: ARCHIVE +archive_classification: CHURCH +subtype: DIOCESAN_ARCHIVE +religious_denomination: Roman Catholic +diocese: Diocese of Haarlem-Amsterdam +record_types: + - sacramental_registers + - parish_records + - administrative_correspondence + """.strip(), + ), + + # ------------------------------------------------------------------------- + # archive_type_corporate + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='archive_type_corporate', + description='Corporate and business archive types - company, bank, trade union', + detailed_description=""" +Corporate archives document business and economic activities: +- Company history and governance (CompanyArchives, BankArchive) +- Labor organizations (TradeUnionArchive) +- Economic documentation (EconomicArchive) +- Industry-specific records (FoundationArchive, AssociationArchive) + +Classes: CompanyArchives, BankArchive, TradeUnionArchive, EconomicArchive, + FoundationArchive, AssociationArchive, RegionalEconomicArchive + """.strip(), + linkml_class='CompanyArchives', + typedb_entity='corporate-archive', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'CompanyArchives', + 'BankArchive', + 'TradeUnionArchive', + 'EconomicArchive', + 'FoundationArchive', + 'AssociationArchive', + 'RegionalEconomicArchive', + ], + fields=[ + FieldMapping( + source_path=None, + source_description='Corporate archive classification', + target_class='CompanyArchives', + target_slot='archive_type', + transformation=TransformationType.LOOKUP, + typedb_entity='corporate-archive', + typedb_attribute='archive-classification', + rdf_predicate='hc:archiveType', + required=True, + status=MappingStatus.MAPPED, + ), + FieldMapping( + source_path='industry_sector', + source_description='Industry sector of the organization', + target_class='CompanyArchives', + target_slot='industry_sector', + transformation=TransformationType.DIRECT, + typedb_entity='corporate-archive', + typedb_attribute='industry-sector', + rdf_predicate='hc:industrySector', + required=False, + ), + ], + example_yaml=""" +# BankArchive instance +institution_type: ARCHIVE +archive_classification: CORPORATE +subtype: BANK_ARCHIVE +company_name: ABN AMRO Historical Archive +industry_sector: FINANCIAL_SERVICES +parent_organization: ABN AMRO Bank N.V. + """.strip(), + ), + + # ------------------------------------------------------------------------- + # archive_type_government + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='archive_type_government', + description='Government archive types - national, state, parliamentary, court', + detailed_description=""" +Government archives document state activities at all levels: +- National archives (NationalArchives) +- State/regional government (StateArchives, StateArchivesSection) +- Parliamentary records (ParliamentaryArchives) +- Judicial records (CourtRecords, NotarialArchive) +- Public administration (PublicArchive, GovernmentArchive) +- Security and intelligence (SecurityArchives) + +Classes: NationalArchives, StateArchives, GovernmentArchive, PublicArchive, + ParliamentaryArchives, CourtRecords, NotarialArchive, SecurityArchives, + CurrentArchive, PublicArchivesInFrance + """.strip(), + linkml_class='NationalArchives', + typedb_entity='government-archive', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'NationalArchives', + 'StateArchives', + 'StateArchivesSection', + 'GovernmentArchive', + 'PublicArchive', + 'ParliamentaryArchives', + 'CourtRecords', + 'NotarialArchive', + 'SecurityArchives', + 'CurrentArchive', + 'PublicArchivesInFrance', + ], + fields=[ + FieldMapping( + source_path=None, + source_description='Government archive classification', + target_class='NationalArchives', + target_slot='archive_type', + transformation=TransformationType.LOOKUP, + typedb_entity='government-archive', + typedb_attribute='archive-classification', + rdf_predicate='hc:archiveType', + required=True, + status=MappingStatus.MAPPED, + ), + FieldMapping( + source_path='jurisdiction_level', + source_description='Level of government jurisdiction', + target_class='NationalArchives', + target_slot='jurisdiction_level', + transformation=TransformationType.LOOKUP, + typedb_entity='government-archive', + typedb_attribute='jurisdiction-level', + rdf_predicate='hc:jurisdictionLevel', + required=False, + validation=FieldValidation( + type='enum', + enum_values=['NATIONAL', 'STATE', 'REGIONAL', 'MUNICIPAL', 'LOCAL'], + ), + ), + ], + example_yaml=""" +# NationalArchives instance (e.g., Nationaal Archief) +institution_type: ARCHIVE +archive_classification: GOVERNMENT +subtype: NATIONAL_ARCHIVES +jurisdiction_level: NATIONAL +country: NL +official_name: Nationaal Archief +legal_mandate: Archiefwet 1995 + """.strip(), + ), + + # ------------------------------------------------------------------------- + # archive_type_municipal + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='archive_type_municipal', + description='Municipal and local government archive types', + detailed_description=""" +Municipal archives serve local government and community documentation: +- City/town archives (MunicipalArchive) +- Local government records (LocalGovernmentArchive) +- County/district level (CountyRecordOffice, DistrictArchiveGermany) +- Local history collections (LocalHistoryArchive) + +Classes: MunicipalArchive, LocalGovernmentArchive, CountyRecordOffice, + DistrictArchiveGermany, LocalHistoryArchive, ComarcalArchive, + DistritalArchive + """.strip(), + linkml_class='MunicipalArchive', + typedb_entity='municipal-archive', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'MunicipalArchive', + 'LocalGovernmentArchive', + 'CountyRecordOffice', + 'DistrictArchiveGermany', + 'LocalHistoryArchive', + 'ComarcalArchive', + 'DistritalArchive', + ], + fields=[ + FieldMapping( + source_path=None, + source_description='Municipal archive classification', + target_class='MunicipalArchive', + target_slot='archive_type', + transformation=TransformationType.LOOKUP, + typedb_entity='municipal-archive', + typedb_attribute='archive-classification', + rdf_predicate='hc:archiveType', + required=True, + status=MappingStatus.MAPPED, + ), + FieldMapping( + source_path='municipality', + source_description='Municipality served by the archive', + target_class='MunicipalArchive', + target_slot='municipality', + transformation=TransformationType.DIRECT, + typedb_entity='municipal-archive', + typedb_attribute='municipality', + rdf_predicate='hc:municipality', + required=False, + ), + ], + example_yaml=""" +# MunicipalArchive instance (e.g., Stadsarchief Amsterdam) +institution_type: ARCHIVE +archive_classification: MUNICIPAL +municipality: Amsterdam +province: Noord-Holland +country: NL +services: + - reading_room + - digitization + - genealogy_support + """.strip(), + ), + + # ------------------------------------------------------------------------- + # archive_type_national + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='archive_type_national', + description='National-level archive institutions and systems', + detailed_description=""" +National archives represent the highest level of archival authority: +- Central national repositories (NationalArchives) +- Country-specific variations (ArchivesRegionales, Landsarkiv, Fylkesarkiv) +- International organization archives (ArchiveOfInternationalOrganization) + +Classes: NationalArchives, ArchivesRegionales, Landsarkiv, Fylkesarkiv, + ArchiveOfInternationalOrganization, RegionalArchivesInIceland + """.strip(), + linkml_class='NationalArchives', + typedb_entity='national-archive', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'NationalArchives', + 'ArchivesRegionales', + 'Landsarkiv', + 'Fylkesarkiv', + 'ArchiveOfInternationalOrganization', + 'RegionalArchivesInIceland', + ], + fields=[ + FieldMapping( + source_path=None, + source_description='National archive classification', + target_class='NationalArchives', + target_slot='archive_type', + transformation=TransformationType.LOOKUP, + typedb_entity='national-archive', + typedb_attribute='archive-classification', + rdf_predicate='hc:archiveType', + required=True, + status=MappingStatus.MAPPED, + ), + FieldMapping( + source_path='country_code', + source_description='ISO 3166-1 alpha-2 country code', + target_class='NationalArchives', + target_slot='country', + transformation=TransformationType.LOOKUP, + typedb_entity='national-archive', + typedb_attribute='country-code', + rdf_predicate='hc:countryCode', + required=True, + validation=FieldValidation( + type='string', + pattern='^[A-Z]{2}$', + ), + ), + ], + example_yaml=""" +# National Archives variation (e.g., Swedish Landsarkiv) +institution_type: ARCHIVE +archive_classification: NATIONAL +subtype: LANDSARKIV +country_code: SE +region: Gothenburg + """.strip(), + ), + + # ------------------------------------------------------------------------- + # archive_type_regional + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='archive_type_regional', + description='Regional and provincial archive types', + detailed_description=""" +Regional archives serve geographic areas between national and local: +- Provincial archives (ProvincialArchive, ProvincialHistoricalArchive) +- Regional administration (RegionalArchive, RegionalStateArchives) +- Cantonal systems (CantonalArchive - Switzerland) +- Country-specific regional (DepartmentalArchives - France, StateRegionalArchiveCzechia) + +Classes: RegionalArchive, ProvincialArchive, ProvincialHistoricalArchive, + RegionalStateArchives, CantonalArchive, DepartmentalArchives, + StateRegionalArchiveCzechia, StateDistrictArchive + """.strip(), + linkml_class='RegionalArchive', + typedb_entity='regional-archive', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'RegionalArchive', + 'ProvincialArchive', + 'ProvincialHistoricalArchive', + 'RegionalStateArchives', + 'CantonalArchive', + 'DepartmentalArchives', + 'StateRegionalArchiveCzechia', + 'StateDistrictArchive', + ], + fields=[ + FieldMapping( + source_path=None, + source_description='Regional archive classification', + target_class='RegionalArchive', + target_slot='archive_type', + transformation=TransformationType.LOOKUP, + typedb_entity='regional-archive', + typedb_attribute='archive-classification', + rdf_predicate='hc:archiveType', + required=True, + status=MappingStatus.MAPPED, + ), + FieldMapping( + source_path='region', + source_description='Geographic region served', + target_class='RegionalArchive', + target_slot='region', + transformation=TransformationType.DIRECT, + typedb_entity='regional-archive', + typedb_attribute='region', + rdf_predicate='hc:region', + required=False, + ), + ], + example_yaml=""" +# ProvincialArchive instance (e.g., Brabants Historisch Informatie Centrum) +institution_type: ARCHIVE +archive_classification: REGIONAL +subtype: PROVINCIAL_ARCHIVE +province: Noord-Brabant +country: NL + """.strip(), + ), + + # ------------------------------------------------------------------------- + # archive_type_specialized + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='archive_type_specialized', + description='Specialized archive types - thematic collections and unique formats', + detailed_description=""" +Specialized archives focus on specific formats, subjects, or communities: +- Format-specific (PhotoArchive, LiteraryArchive, IconographicArchives) +- Subject-focused (PoliticalArchive, MilitaryArchive, PerformingArtsArchive) +- Community-focused (WomensArchives, LGBTArchive, CommunityArchive) +- Institutional (HospitalArchive, SchoolArchive) + +Classes: PhotoArchive, LiteraryArchive, PoliticalArchive, MilitaryArchive, + PerformingArtsArchive, WomensArchives, LGBTArchive, CommunityArchive, + HospitalArchive, SchoolArchive, IconographicArchives, ArtArchive, + ArchitecturalArchive, NewspaperClippingsArchive + """.strip(), + linkml_class='SpecializedArchive', + typedb_entity='specialized-archive', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'SpecializedArchive', + 'PhotoArchive', + 'LiteraryArchive', + 'PoliticalArchive', + 'MilitaryArchive', + 'PerformingArtsArchive', + 'WomensArchives', + 'LGBTArchive', + 'CommunityArchive', + 'HospitalArchive', + 'SchoolArchive', + 'IconographicArchives', + 'ArtArchive', + 'ArchitecturalArchive', + 'NewspaperClippingsArchive', + 'PressArchive', + 'NobilityArchive', + ], + fields=[ + FieldMapping( + source_path=None, + source_description='Specialized archive classification', + target_class='SpecializedArchive', + target_slot='archive_type', + transformation=TransformationType.LOOKUP, + typedb_entity='specialized-archive', + typedb_attribute='archive-classification', + rdf_predicate='hc:archiveType', + required=True, + status=MappingStatus.MAPPED, + ), + FieldMapping( + source_path='specialization', + source_description='Area of specialization', + target_class='SpecializedArchive', + target_slot='specialization', + transformation=TransformationType.DIRECT, + typedb_entity='specialized-archive', + typedb_attribute='specialization', + rdf_predicate='hc:specialization', + required=False, + ), + ], + example_yaml=""" +# PhotoArchive instance (e.g., Nederlands Fotomuseum archive) +institution_type: ARCHIVE +archive_classification: SPECIALIZED +subtype: PHOTO_ARCHIVE +specialization: photography +collection_strengths: + - Dutch photography 1840-present + - Documentary photography + - Press photography + """.strip(), + ), + + # ------------------------------------------------------------------------- + # archive_type_thematic + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='archive_type_thematic', + description='Thematic archive types - digital, web, dark archives, and special collections', + detailed_description=""" +Thematic archives organized around specific themes or functions: +- Digital preservation (DigitalArchive, DarkArchive, WebArchive) +- Collection types (CollectingArchives, DepositArchive) +- Personal papers (Nachlass, HouseArchive, PersonalCollectionType) +- Online archives (OnlineNewsArchive, MailingListArchive) + +Classes: DigitalArchive, DarkArchive, WebArchive, CollectingArchives, + DepositArchive, Nachlass, HouseArchive, OnlineNewsArchive, + MailingListArchive, ClimateArchive, FreeArchive, PostcustodialArchive + """.strip(), + linkml_class='DigitalArchive', + typedb_entity='thematic-archive', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'DigitalArchive', + 'DarkArchive', + 'WebArchive', + 'CollectingArchives', + 'DepositArchive', + 'Nachlass', + 'HouseArchive', + 'OnlineNewsArchive', + 'MailingListArchive', + 'ClimateArchive', + 'FreeArchive', + 'PostcustodialArchive', + 'MuseumArchive', + 'ArchivalRepository', + 'ArchivalLibrary', + ], + fields=[ + FieldMapping( + source_path=None, + source_description='Thematic archive classification', + target_class='DigitalArchive', + target_slot='archive_type', + transformation=TransformationType.LOOKUP, + typedb_entity='thematic-archive', + typedb_attribute='archive-classification', + rdf_predicate='hc:archiveType', + required=True, + status=MappingStatus.MAPPED, + ), + FieldMapping( + source_path='digital_preservation_level', + source_description='Level of digital preservation commitment', + target_class='DigitalArchive', + target_slot='preservation_level', + transformation=TransformationType.LOOKUP, + typedb_entity='thematic-archive', + typedb_attribute='preservation-level', + rdf_predicate='hc:preservationLevel', + required=False, + validation=FieldValidation( + type='enum', + enum_values=['BIT_LEVEL', 'LOGICAL', 'SEMANTIC', 'FULL'], + ), + ), + ], + example_yaml=""" +# DarkArchive instance +institution_type: ARCHIVE +archive_classification: THEMATIC +subtype: DARK_ARCHIVE +digital_preservation_level: FULL +access_policy: RESTRICTED +storage_location: offline_vault + """.strip(), + ), + + # ========================================================================= + # ORGANIZATIONAL STRUCTURE MAPPINGS + # ========================================================================= + + # ------------------------------------------------------------------------- + # org_structure_hierarchy + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='org_structure_hierarchy', + description='Organizational hierarchy - parent organizations, subsidiaries, branches', + detailed_description=""" +Models the hierarchical relationships between organizations: +- Parent-child relationships (ParentOrganizationUnit, SubsidiaryOrganization) +- Branch locations (OrganizationBranch, BranchOffice) +- Encompassing bodies (EncompassingBody) +- Networks and associations (ArchiveNetwork, ArchiveAssociation, ConnectionNetwork) + +Classes: ParentOrganizationUnit, SubsidiaryOrganization, OrganizationBranch, + BranchOffice, EncompassingBody, ArchiveNetwork, ArchiveAssociation, + ConnectionNetwork, Organization, Institution + """.strip(), + linkml_class='Organization', + typedb_entity='organization', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'Organization', + 'Institution', + 'ParentOrganizationUnit', + 'SubsidiaryOrganization', + 'OrganizationBranch', + 'BranchOffice', + 'EncompassingBody', + 'ArchiveNetwork', + 'ArchiveAssociation', + 'ConnectionNetwork', + 'CulturalInstitution', + 'MemoryInstitution', + 'GLAM', + ], + fields=[ + FieldMapping( + source_path='parent_organization', + source_description='Parent organization identifier or name', + target_class='Organization', + target_slot='parent_organization', + transformation=TransformationType.NESTED, + typedb_entity='organization', + typedb_attribute='parent-organization', + rdf_predicate='org:subOrganizationOf', + required=False, + ), + FieldMapping( + source_path='subsidiary_organizations', + source_description='List of subsidiary organizations', + target_class='Organization', + target_slot='subsidiaries', + transformation=TransformationType.ARRAY_MAP, + typedb_entity='organization', + typedb_attribute='subsidiaries', + rdf_predicate='org:hasSubOrganization', + required=False, + ), + FieldMapping( + source_path='encompassing_body', + source_description='Larger organizational body this belongs to', + target_class='Organization', + target_slot='encompassing_body', + transformation=TransformationType.NESTED, + typedb_entity='organization', + typedb_attribute='encompassing-body', + rdf_predicate='hc:encompassingBody', + required=False, + ), + ], + example_yaml=""" +# Organization with hierarchy +organization_name: Rijksmuseum Research Library +parent_organization: + name: Rijksmuseum + ghcid: NL-NH-AMS-M-RM +encompassing_body: + name: Ministry of Education, Culture and Science + type: GOVERNMENT_MINISTRY + """.strip(), + ), + + # ------------------------------------------------------------------------- + # org_structure_administrative + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='org_structure_administrative', + description='Administrative units - departments, divisions, offices', + detailed_description=""" +Models the internal administrative structure of organizations: +- Functional divisions (Department, Division) +- Administrative units (AdministrativeOffice) +- Support functions (ConservationLab, ReadingRoom, GiftShop) +- Specialized facilities (ExhibitionSpace, Storage, Warehouse) + +Classes: Department, Division, AdministrativeOffice, ConservationLab, + ReadingRoom, ReadingRoomAnnex, GiftShop, ExhibitionSpace, + Storage, Warehouse, PrintRoom, ServiceArea + """.strip(), + linkml_class='Department', + typedb_entity='department', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'Department', + 'Division', + 'AdministrativeOffice', + 'ConservationLab', + 'ReadingRoom', + 'ReadingRoomAnnex', + 'GiftShop', + 'ExhibitionSpace', + 'Storage', + 'Warehouse', + 'PrintRoom', + 'ServiceArea', + 'ClosedSpace', + 'PublicSpace', + 'OutdoorSite', + ], + fields=[ + FieldMapping( + source_path='departments', + source_description='List of organizational departments', + target_class='Department', + target_slot='department_name', + transformation=TransformationType.ARRAY_MAP, + typedb_entity='department', + typedb_attribute='department-name', + rdf_predicate='org:hasUnit', + required=False, + ), + FieldMapping( + source_path='facilities', + source_description='Physical facilities and spaces', + target_class='Department', + target_slot='facilities', + transformation=TransformationType.ARRAY_MAP, + typedb_entity='department', + typedb_attribute='facilities', + rdf_predicate='hc:hasFacility', + required=False, + ), + ], + example_yaml=""" +# Department structure +departments: + - name: Collection Management + type: DEPARTMENT + staff_count: 25 + - name: Conservation Laboratory + type: CONSERVATION_LAB + specializations: + - paper_conservation + - photograph_conservation + """.strip(), + ), + # ------------------------------------------------------------------------- + # ORGANIZATIONAL STRUCTURE - SUBDIVISION + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='org_structure_subdivision', + description='Organizational subdivisions and change events', + detailed_description=""" +Models organizational subdivisions and structural changes: +- Subdivision types (OrganizationalSubdivision) +- Organizational structure (OrganizationalStructure) +- Change events (OrganizationalChangeEvent) +- Contributing and allocating agencies (ContributingAgency, AllocationAgency) + +Classes: OrganizationalSubdivision, OrganizationalStructure, + OrganizationalChangeEvent, ContributingAgency, AllocationAgency, + Jurisdiction, StandardsOrganization, RegistrationAuthority + """.strip(), + linkml_class='OrganizationalSubdivision', + typedb_entity='organizational-subdivision', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'OrganizationalSubdivision', + 'OrganizationalStructure', + 'OrganizationalChangeEvent', + 'ContributingAgency', + 'AllocationAgency', + 'Jurisdiction', + 'StandardsOrganization', + 'RegistrationAuthority', + ], + fields=[ + FieldMapping( + source_path='subdivisions', + source_description='Organizational subdivisions', + target_class='OrganizationalSubdivision', + target_slot='subdivision_name', + transformation=TransformationType.ARRAY_MAP, + typedb_entity='organizational-subdivision', + typedb_attribute='subdivision-name', + rdf_predicate='org:hasUnit', + required=False, + ), + FieldMapping( + source_path='change_history', + source_description='History of organizational changes', + target_class='OrganizationalChangeEvent', + target_slot='change_events', + transformation=TransformationType.ARRAY_MAP, + typedb_entity='organizational-change-event', + typedb_attribute='change-events', + rdf_predicate='hc:hasChangeEvent', + required=False, + ), + ], + example_yaml=""" +# Organizational change history +change_history: + - event_type: MERGER + date: "2001-01-01" + description: "Merger of Gemeentearchief and Rijksarchief" + predecessor_organizations: + - name: Gemeentearchief Haarlem + - name: Rijksarchief Noord-Holland + resulting_organization: + name: Noord-Hollands Archief + """.strip(), + ), + # ========================================================================= + # PHASE 1: HERITAGE & CULTURAL SITES + # ========================================================================= + # ------------------------------------------------------------------------- + # HERITAGE - WORLD SITES + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='heritage_world_sites', + description='UNESCO World Heritage Sites and tentative list entries', + detailed_description=""" +World Heritage Site designations and related classifications: +- Inscribed sites (WorldHeritageSite) +- Tentative list entries (TentativeWorldHeritageSite) +- Historic buildings and monuments (HistoricBuilding) +- Cultural institutions (CulturalInstitution) + +Classes: WorldHeritageSite, TentativeWorldHeritageSite, HistoricBuilding, + CulturalInstitution + """.strip(), + linkml_class='WorldHeritageSite', + typedb_entity='world-heritage-site', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'WorldHeritageSite', + 'TentativeWorldHeritageSite', + 'HistoricBuilding', + 'CulturalInstitution', + ], + fields=[ + FieldMapping( + source_path='unesco_id', + source_description='UNESCO World Heritage Site ID', + target_class='WorldHeritageSite', + target_slot='unesco_id', + transformation=TransformationType.DIRECT, + typedb_entity='world-heritage-site', + typedb_attribute='unesco-id', + rdf_predicate='hc:unescoId', + required=True, + validation=FieldValidation(type='number'), + ), + FieldMapping( + source_path='inscription_year', + source_description='Year of UNESCO inscription', + target_class='WorldHeritageSite', + target_slot='inscription_year', + transformation=TransformationType.DIRECT, + typedb_entity='world-heritage-site', + typedb_attribute='inscription-year', + rdf_predicate='hc:inscriptionYear', + required=False, + validation=FieldValidation(type='number'), + ), + FieldMapping( + source_path='heritage_criteria', + source_description='UNESCO selection criteria (i-x)', + target_class='WorldHeritageSite', + target_slot='criteria', + transformation=TransformationType.ARRAY_DIRECT, + typedb_entity='world-heritage-site', + typedb_attribute='criteria', + rdf_predicate='hc:heritageCriteria', + required=False, + ), + ], + example_yaml=""" +# WorldHeritageSite instance +heritage_designation: UNESCO_WORLD_HERITAGE +unesco_id: 818 +name: Rietveld Schröderhuis +inscription_year: 2000 +heritage_criteria: + - i + - ii +country: NL + """.strip(), + ), + # ------------------------------------------------------------------------- + # HERITAGE - INTANGIBLE + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='heritage_intangible', + description='Intangible cultural heritage - traditions, performances, practices', + detailed_description=""" +UNESCO Intangible Cultural Heritage and related practices: +- Intangible heritage forms (IntangibleHeritageForm) +- Performances and events (IntangibleHeritagePerformance, IntangibleHeritageEvent) +- Groups preserving traditions (IntangibleHeritageGroupType) + +Classes: IntangibleHeritageForm, IntangibleHeritagePerformance, + IntangibleHeritageEvent, IntangibleHeritageGroupType + """.strip(), + linkml_class='IntangibleHeritageForm', + typedb_entity='intangible-heritage', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'IntangibleHeritageForm', + 'IntangibleHeritagePerformance', + 'IntangibleHeritageEvent', + 'IntangibleHeritageGroupType', + ], + fields=[ + FieldMapping( + source_path='ich_domain', + source_description='UNESCO ICH domain category', + target_class='IntangibleHeritageForm', + target_slot='domain', + transformation=TransformationType.LOOKUP, + typedb_entity='intangible-heritage', + typedb_attribute='domain', + rdf_predicate='hc:ichDomain', + required=False, + validation=FieldValidation( + type='enum', + enum_values=[ + 'ORAL_TRADITIONS', + 'PERFORMING_ARTS', + 'SOCIAL_PRACTICES', + 'KNOWLEDGE_PRACTICES', + 'TRADITIONAL_CRAFTSMANSHIP', + ], + ), + ), + FieldMapping( + source_path='inscription_list', + source_description='UNESCO ICH list type', + target_class='IntangibleHeritageForm', + target_slot='list_type', + transformation=TransformationType.LOOKUP, + typedb_entity='intangible-heritage', + typedb_attribute='list-type', + rdf_predicate='hc:ichListType', + required=False, + validation=FieldValidation( + type='enum', + enum_values=['REPRESENTATIVE', 'URGENT_SAFEGUARDING', 'GOOD_PRACTICES'], + ), + ), + ], + example_yaml=""" +# IntangibleHeritageForm instance +heritage_type: INTANGIBLE +ich_domain: TRADITIONAL_CRAFTSMANSHIP +name: Craft of the miller operating windmills and watermills +inscription_list: REPRESENTATIVE +inscription_year: 2017 +countries: + - NL + - BE + """.strip(), + ), + # ------------------------------------------------------------------------- + # HERITAGE - NATIONAL TREASURES + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='heritage_national_treasures', + description='National treasures and designated heritage items', + detailed_description=""" +National-level heritage designations: +- National treasures (NationalTreasure) +- Country-specific designations (NationalTreasureOfFrance) +- Documentation centers (DocumentationCentre, RegionalHistoricCenter) +- Research facilities (ResearchCenter, ScientificTechnicAndIndustrialCultureCenter) + +Classes: NationalTreasure, NationalTreasureOfFrance, DocumentationCentre, + RegionalHistoricCenter, ResearchCenter, + ScientificTechnicAndIndustrialCultureCenter + """.strip(), + linkml_class='NationalTreasure', + typedb_entity='national-treasure', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'NationalTreasure', + 'NationalTreasureOfFrance', + 'DocumentationCentre', + 'RegionalHistoricCenter', + 'ResearchCenter', + 'ScientificTechnicAndIndustrialCultureCenter', + ], + fields=[ + FieldMapping( + source_path='designation_type', + source_description='Type of national designation', + target_class='NationalTreasure', + target_slot='designation_type', + transformation=TransformationType.LOOKUP, + typedb_entity='national-treasure', + typedb_attribute='designation-type', + rdf_predicate='hc:designationType', + required=True, + ), + FieldMapping( + source_path='designation_date', + source_description='Date of official designation', + target_class='NationalTreasure', + target_slot='designation_date', + transformation=TransformationType.TEMPORAL, + typedb_entity='national-treasure', + typedb_attribute='designation-date', + rdf_predicate='hc:designationDate', + required=False, + validation=FieldValidation(type='date'), + ), + ], + example_yaml=""" +# NationalTreasure instance +designation_type: RIJKSMONUMENT +designation_number: 12345 +name: Amsterdam Canal Ring +designation_date: "1999-12-01" +country: NL + """.strip(), + ), + # ========================================================================= + # PHASE 1: CLASSIFICATION TYPES + # ========================================================================= + # ------------------------------------------------------------------------- + # TYPE CLASSES - GLAM INSTITUTIONS + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='type_classes_glam', + description='Classification types for GLAM institutions - museums, libraries, archives, galleries', + detailed_description=""" +Type classes for classifying heritage custodian institutions: +- Core GLAM types (MuseumType, LibraryType, ArchiveOrganizationType, GalleryType) +- Bio/nature custodians (BioCustodianType) +- Religious/sacred sites (HolySacredSiteType) +- Education providers (EducationProviderType) + +Classes: MuseumType, LibraryType, ArchiveOrganizationType, GalleryType, + BioCustodianType, HolySacredSiteType, EducationProviderType, + CustodianType, PersonalCollectionType + """.strip(), + linkml_class='CustodianType', + typedb_entity='custodian-type', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'CustodianType', + 'MuseumType', + 'LibraryType', + 'ArchiveOrganizationType', + 'GalleryType', + 'BioCustodianType', + 'HolySacredSiteType', + 'EducationProviderType', + 'PersonalCollectionType', + 'FeatureCustodianType', + 'TasteScentHeritageType', + ], + fields=[ + FieldMapping( + source_path='institution_type', + source_description='Primary institution type code', + target_class='CustodianType', + target_slot='type_code', + transformation=TransformationType.LOOKUP, + typedb_entity='custodian-type', + typedb_attribute='type-code', + rdf_predicate='hc:custodianTypeCode', + required=True, + validation=FieldValidation( + type='enum', + enum_values=['G', 'L', 'A', 'M', 'O', 'R', 'C', 'U', 'B', 'E', 'S', 'F', 'I', 'X', 'P', 'H', 'D', 'N', 'T'], + ), + notes='GLAMORCUBESFIXPHDNT taxonomy single-letter codes', + ), + FieldMapping( + source_path='institution_subtype', + source_description='Detailed institution subtype', + target_class='CustodianType', + target_slot='subtype', + transformation=TransformationType.LOOKUP, + typedb_entity='custodian-type', + typedb_attribute='subtype', + rdf_predicate='hc:custodianSubtype', + required=False, + ), + ], + example_yaml=""" +# Custodian type classification +institution_type: M # Museum +institution_subtype: ART_MUSEUM +museum_type_details: + collection_focus: FINE_ARTS + governance: PUBLIC + size_category: LARGE + """.strip(), + ), + # ------------------------------------------------------------------------- + # TYPE CLASSES - DIGITAL PLATFORMS + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='type_classes_digital', + description='Classification types for digital platforms and web presence', + detailed_description=""" +Type classes for digital infrastructure: +- Digital platform types (DigitalPlatformType) +- Web portal classifications (WebPortalType, WebPortalTypes) +- Social media platforms (SocialMediaPlatformType, SocialMediaPlatformTypes) +- Social media content (SocialMediaPostType, SocialMediaPostTypes) +- Video content types (VideoAnnotationTypes) + +Classes: DigitalPlatformType, WebPortalType, WebPortalTypes, + SocialMediaPlatformType, SocialMediaPlatformTypes, + SocialMediaPostType, SocialMediaPostTypes, VideoAnnotationTypes + """.strip(), + linkml_class='DigitalPlatformType', + typedb_entity='digital-platform-type', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'DigitalPlatformType', + 'WebPortalType', + 'WebPortalTypes', + 'SocialMediaPlatformType', + 'SocialMediaPlatformTypes', + 'SocialMediaPostType', + 'SocialMediaPostTypes', + 'VideoAnnotationTypes', + 'DataServiceEndpointType', + ], + fields=[ + FieldMapping( + source_path='platform_type', + source_description='Digital platform classification', + target_class='DigitalPlatformType', + target_slot='platform_category', + transformation=TransformationType.LOOKUP, + typedb_entity='digital-platform-type', + typedb_attribute='platform-category', + rdf_predicate='hc:platformCategory', + required=True, + validation=FieldValidation( + type='enum', + enum_values=[ + 'WEBSITE', + 'COLLECTION_PORTAL', + 'DISCOVERY_PLATFORM', + 'API', + 'SOCIAL_MEDIA', + 'CMS', + 'DAM', + ], + ), + ), + ], + example_yaml=""" +# Digital platform type classification +digital_platforms: + - platform_type: COLLECTION_PORTAL + name: Online Collection + - platform_type: API + name: Data API + protocol: REST + - platform_type: SOCIAL_MEDIA + social_platform_type: INSTAGRAM + """.strip(), + ), + # ------------------------------------------------------------------------- + # TYPE CLASSES - ORGANIZATIONAL + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='type_classes_organizational', + description='Classification types for organizational structures', + detailed_description=""" +Type classes for organizational classifications: +- Commercial organizations (CommercialOrganizationType) +- Non-profit organizations (NonProfitType) +- Research organizations (ResearchOrganizationType) +- Official institutions (OfficialInstitutionType) +- Heritage societies (HeritageSocietyType) +- Mixed/unspecified (MixedCustodianType, UnspecifiedType) + +Classes: CommercialOrganizationType, NonProfitType, ResearchOrganizationType, + OfficialInstitutionType, HeritageSocietyType, MixedCustodianType, + UnspecifiedType, LegalEntityType + """.strip(), + linkml_class='LegalEntityType', + typedb_entity='legal-entity-type', + provenance=Provenance( + source_type='schema_documentation', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'CommercialOrganizationType', + 'NonProfitType', + 'ResearchOrganizationType', + 'OfficialInstitutionType', + 'HeritageSocietyType', + 'MixedCustodianType', + 'UnspecifiedType', + 'LegalEntityType', + 'LegalForm', + 'LegalName', + ], + fields=[ + FieldMapping( + source_path='legal_form', + source_description='Legal form/entity type', + target_class='LegalEntityType', + target_slot='legal_form_code', + transformation=TransformationType.LOOKUP, + typedb_entity='legal-entity-type', + typedb_attribute='legal-form-code', + rdf_predicate='hc:legalFormCode', + required=False, + notes='ISO 20275 legal form codes or national equivalents', + ), + FieldMapping( + source_path='governance_type', + source_description='Governance/ownership type', + target_class='LegalEntityType', + target_slot='governance_type', + transformation=TransformationType.LOOKUP, + typedb_entity='legal-entity-type', + typedb_attribute='governance-type', + rdf_predicate='hc:governanceType', + required=False, + validation=FieldValidation( + type='enum', + enum_values=['PUBLIC', 'PRIVATE', 'NON_PROFIT', 'MIXED', 'GOVERNMENT'], + ), + ), + ], + example_yaml=""" +# Legal entity type classification +legal_status: + legal_form: STICHTING # Dutch foundation + legal_form_code: "8888" # ISO 20275 + governance_type: NON_PROFIT + registration_authority: KVK + registration_number: "12345678" + """.strip(), + ), + # ========================================================================= + # PHASE 2: PLACE & LOCATION + # ========================================================================= + # ------------------------------------------------------------------------- + # PLACE - GEOGRAPHIC + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='place_geographic', + description='Geographic and spatial location entities', + detailed_description=""" +Geographic location classes representing physical places where heritage custodians +are located or operate. Includes settlements (cities/towns), countries, regions, +and geospatial coordinates. + +These classes support: +- Settlement identification (GeoNames integration) +- Country code normalization (ISO 3166-1) +- Region/subregion hierarchies +- Geospatial coordinates (lat/lon) + """.strip(), + linkml_class='Settlement', + typedb_entity='settlement', + provenance=Provenance( + source_type='geonames', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'Settlement', 'Country', 'Subregion', 'GeoSpatialPlace', 'FeaturePlace', + ], + fields=[ + FieldMapping( + source_path='location.settlement', + source_description='Settlement/city name', + target_class='Settlement', + target_slot='name', + transformation=TransformationType.DIRECT, + typedb_entity='settlement', + typedb_attribute='name', + rdf_predicate='schema:name', + required=True, + ), + FieldMapping( + source_path='location.country', + source_description='Country code (ISO 3166-1)', + target_class='Country', + target_slot='country_code', + transformation=TransformationType.LOOKUP, + typedb_entity='country', + typedb_attribute='country-code', + rdf_predicate='schema:addressCountry', + required=True, + ), + FieldMapping( + source_path='location.coordinates', + source_description='Geographic coordinates', + target_class='GeoSpatialPlace', + target_slot='coordinates', + transformation=TransformationType.COMPUTED, + typedb_entity='geo-spatial-place', + typedb_attribute='coordinates', + rdf_predicate='geo:hasGeometry', + required=False, + ), + ], + example_yaml=""" +# Geographic location +location: + settlement: Amsterdam + country: NL + region: Noord-Holland + coordinates: + latitude: 52.3676 + longitude: 4.9041 + """.strip(), + ), + # ------------------------------------------------------------------------- + # PLACE - CUSTODIAN SPECIFIC + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='place_custodian_specific', + description='Custodian-specific place classes', + detailed_description=""" +Place classes specifically related to heritage custodian operations, including +auxiliary places, temporary locations, and custodian-specific place designations. + +Supports modeling: +- Primary vs auxiliary locations +- Temporary/seasonal locations +- Off-site storage locations +- Branch/satellite locations + """.strip(), + linkml_class='CustodianPlace', + typedb_entity='custodian-place', + provenance=Provenance( + source_type='custodian_yaml', + data_tier=DataTier.TIER_2_VERIFIED, + ), + generated_classes=[ + 'CustodianPlace', 'AuxiliaryPlace', 'TemporaryLocation', + ], + fields=[ + FieldMapping( + source_path='places.primary', + source_description='Primary location', + target_class='CustodianPlace', + target_slot='primary_location', + transformation=TransformationType.DIRECT, + typedb_entity='custodian-place', + typedb_attribute='primary-location', + rdf_predicate='hc:primaryLocation', + required=True, + ), + FieldMapping( + source_path='places.auxiliary', + source_description='Auxiliary/secondary locations', + target_class='AuxiliaryPlace', + target_slot='auxiliary_locations', + transformation=TransformationType.ARRAY_DIRECT, + typedb_entity='auxiliary-place', + typedb_attribute='location', + rdf_predicate='hc:auxiliaryLocation', + required=False, + ), + FieldMapping( + source_path='places.temporary', + source_description='Temporary location', + target_class='TemporaryLocation', + target_slot='temporary_location', + transformation=TransformationType.DIRECT, + typedb_entity='temporary-location', + typedb_attribute='location', + rdf_predicate='hc:temporaryLocation', + required=False, + ), + ], + example_yaml=""" +# Custodian places +places: + primary: + address: Museumstraat 1 + city: Amsterdam + auxiliary: + - name: Storage Facility + address: Industrieweg 100 + temporary: + name: Pop-up Exhibition Space + valid_from: 2024-06-01 + valid_to: 2024-09-30 + """.strip(), + ), + # ========================================================================= + # PHASE 2: COLLECTIONS + # ========================================================================= + # ------------------------------------------------------------------------- + # COLLECTION - CORE + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='collection_core', + description='Core collection and holdings classes', + detailed_description=""" +Core classes for modeling heritage collections and holdings. Collections represent +aggregations of objects, documents, or materials managed by a heritage custodian. + +Supports: +- Collection naming and description +- Collection types (archival, library, museum, mixed) +- Special collections designation +- Subject/temporal coverage + """.strip(), + linkml_class='Collection', + typedb_entity='collection', + provenance=Provenance( + source_type='custodian_yaml', + data_tier=DataTier.TIER_2_VERIFIED, + ), + generated_classes=[ + 'Collection', 'CollectionType', 'SpecialCollection', 'CastCollection', + 'PhotographCollection', 'CustodianCollection', 'CustodianArchive', + 'CustodianAdministration', + ], + fields=[ + FieldMapping( + source_path='collections[].name', + source_description='Collection name', + target_class='Collection', + target_slot='collection_name', + transformation=TransformationType.DIRECT, + typedb_entity='collection', + typedb_attribute='name', + rdf_predicate='schema:name', + required=True, + ), + FieldMapping( + source_path='collections[].type', + source_description='Collection type', + target_class='CollectionType', + target_slot='collection_type', + transformation=TransformationType.LOOKUP, + typedb_entity='collection-type', + typedb_attribute='type', + rdf_predicate='hc:collectionType', + required=False, + ), + FieldMapping( + source_path='collections[].description', + source_description='Collection description', + target_class='Collection', + target_slot='description', + transformation=TransformationType.DIRECT, + typedb_entity='collection', + typedb_attribute='description', + rdf_predicate='schema:description', + required=False, + ), + ], + example_yaml=""" +# Collection definition +collections: + - name: Dutch Masters Collection + type: MUSEUM_ART + description: 17th century Dutch paintings + extent: 450 paintings + subject_areas: + - Dutch Golden Age + - Portraiture + """.strip(), + ), + # ------------------------------------------------------------------------- + # COLLECTION - MANAGEMENT + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='collection_management', + description='Collection management system classes', + detailed_description=""" +Classes for collection management systems (CMS) used by heritage custodians +to catalog, track, and manage their collections. + +Supports documentation of: +- CMS software used (Adlib, TMS, ArchivesSpace, etc.) +- System configurations +- Integration endpoints + """.strip(), + linkml_class='CollectionManagementSystem', + typedb_entity='collection-management-system', + provenance=Provenance( + source_type='custodian_yaml', + data_tier=DataTier.TIER_2_VERIFIED, + ), + generated_classes=[ + 'CollectionManagementSystem', + ], + fields=[ + FieldMapping( + source_path='digital_platforms.cms.name', + source_description='CMS name', + target_class='CollectionManagementSystem', + target_slot='system_name', + transformation=TransformationType.DIRECT, + typedb_entity='collection-management-system', + typedb_attribute='system-name', + rdf_predicate='schema:name', + required=True, + ), + FieldMapping( + source_path='digital_platforms.cms.vendor', + source_description='CMS vendor', + target_class='CollectionManagementSystem', + target_slot='vendor', + transformation=TransformationType.DIRECT, + typedb_entity='collection-management-system', + typedb_attribute='vendor', + rdf_predicate='schema:manufacturer', + required=False, + ), + ], + example_yaml=""" +# Collection management system +digital_platforms: + cms: + name: Adlib Museum + vendor: Axiell + version: "7.8" + url: https://collection.museum.nl + """.strip(), + ), + # ========================================================================= + # PHASE 2: PERSON & STAFF + # ========================================================================= + # ------------------------------------------------------------------------- + # PERSON - PROFILE EXTENDED + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='person_profile_extended', + description='Extended person profile classes', + detailed_description=""" +Extended classes for person/staff profiles beyond basic identity. Includes +LinkedIn profiles, person connections (professional networks), and web claims. + +Supports: +- LinkedIn profile data integration +- Professional network connections +- Web-sourced claims about persons +- Person name variants and aliases + """.strip(), + linkml_class='PersonObservation', + typedb_entity='person-observation', + provenance=Provenance( + source_type='linkedin', + data_tier=DataTier.TIER_3_CROWD_SOURCED, + ), + generated_classes=[ + 'LinkedInProfile', 'PersonConnection', 'PersonName', + 'PersonOrOrganization', 'PersonWebClaim', + ], + fields=[ + FieldMapping( + source_path='person.linkedin_url', + source_description='LinkedIn profile URL', + target_class='LinkedInProfile', + target_slot='linkedin_url', + transformation=TransformationType.DIRECT, + typedb_entity='linkedin-profile', + typedb_attribute='profile-url', + rdf_predicate='schema:sameAs', + required=False, + ), + FieldMapping( + source_path='person.connections', + source_description='Professional connections', + target_class='PersonConnection', + target_slot='connections', + transformation=TransformationType.ARRAY_DIRECT, + typedb_entity='person-connection', + typedb_attribute='connected-person', + rdf_predicate='hc:hasConnection', + required=False, + ), + FieldMapping( + source_path='person.names', + source_description='Person name variants', + target_class='PersonName', + target_slot='name_variants', + transformation=TransformationType.ARRAY_DIRECT, + typedb_entity='person-name', + typedb_attribute='name-value', + rdf_predicate='schema:alternateName', + required=False, + ), + ], + example_yaml=""" +# Extended person profile +person: + name: Jan de Vries + linkedin_url: https://linkedin.com/in/jandevries + names: + - value: Jan de Vries + type: legal_name + - value: J. de Vries + type: abbreviated + connections: + - name: Maria Bakker + organization: Rijksmuseum + """.strip(), + ), + # ------------------------------------------------------------------------- + # PERSON - WORK & EDUCATION + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='person_work_education', + description='Work experience and education classes', + detailed_description=""" +Classes for modeling work experience history and educational credentials +of persons associated with heritage custodians. + +Supports: +- Employment history with dates +- Role/position tracking +- Educational credentials +- Skills and certifications + """.strip(), + linkml_class='WorkExperience', + typedb_entity='work-experience', + provenance=Provenance( + source_type='linkedin', + data_tier=DataTier.TIER_3_CROWD_SOURCED, + ), + generated_classes=[ + 'WorkExperience', 'EducationCredential', 'StaffRole', 'StaffRoles', + ], + fields=[ + FieldMapping( + source_path='person.experience[].organization', + source_description='Employer organization', + target_class='WorkExperience', + target_slot='organization', + transformation=TransformationType.DIRECT, + typedb_entity='work-experience', + typedb_attribute='organization', + rdf_predicate='schema:worksFor', + required=True, + ), + FieldMapping( + source_path='person.experience[].role', + source_description='Job title/role', + target_class='WorkExperience', + target_slot='role_title', + transformation=TransformationType.DIRECT, + typedb_entity='work-experience', + typedb_attribute='role-title', + rdf_predicate='schema:jobTitle', + required=True, + ), + FieldMapping( + source_path='person.education[].institution', + source_description='Educational institution', + target_class='EducationCredential', + target_slot='institution', + transformation=TransformationType.DIRECT, + typedb_entity='education-credential', + typedb_attribute='institution', + rdf_predicate='schema:alumniOf', + required=True, + ), + ], + example_yaml=""" +# Work and education +person: + experience: + - organization: Rijksmuseum + role: Senior Curator + start_date: 2018-03 + current: true + education: + - institution: University of Amsterdam + degree: MA Art History + graduation_year: 2010 + """.strip(), + ), + # ========================================================================= + # PHASE 2: DIGITAL & API SERVICES + # ========================================================================= + # ------------------------------------------------------------------------- + # DIGITAL PLATFORMS - EXTENDED + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='digital_platforms_extended', + description='Extended digital platform classes', + detailed_description=""" +Extended digital platform classes for web portals, virtual libraries, +and auxiliary digital presence. Supports heritage custodian online presence +beyond primary websites. + +Includes: +- Web portals and discovery interfaces +- Virtual/digital-only libraries +- Auxiliary digital platforms +- Primary digital presence assertions + """.strip(), + linkml_class='WebPortal', + typedb_entity='web-portal', + provenance=Provenance( + source_type='web_enrichment', + data_tier=DataTier.TIER_2_VERIFIED, + ), + generated_classes=[ + 'WebPortal', 'VirtualMapLibrary', 'AuxiliaryDigitalPlatform', + 'PrimaryDigitalPresenceAssertion', + ], + fields=[ + FieldMapping( + source_path='digital_platforms.portals[].url', + source_description='Portal URL', + target_class='WebPortal', + target_slot='portal_url', + transformation=TransformationType.DIRECT, + typedb_entity='web-portal', + typedb_attribute='url', + rdf_predicate='schema:url', + required=True, + ), + FieldMapping( + source_path='digital_platforms.portals[].type', + source_description='Portal type', + target_class='WebPortal', + target_slot='portal_type', + transformation=TransformationType.LOOKUP, + typedb_entity='web-portal', + typedb_attribute='portal-type', + rdf_predicate='hc:portalType', + required=False, + ), + ], + example_yaml=""" +# Digital platforms +digital_platforms: + portals: + - url: https://collectie.museum.nl + type: DISCOVERY_PORTAL + name: Online Collection + - url: https://maps.museum.nl + type: VIRTUAL_MAP + name: Interactive Map + """.strip(), + ), + # ------------------------------------------------------------------------- + # API ENDPOINTS + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='api_endpoints', + description='API and data service endpoint classes', + detailed_description=""" +Classes for API endpoints and data services exposed by heritage custodians. +Supports interoperability documentation for harvesting, searching, and +accessing digital content. + +Includes: +- OAI-PMH harvesting endpoints +- Search APIs (SRU, OpenSearch) +- IIIF Image/Presentation APIs +- File download services (EAD, METS) + """.strip(), + linkml_class='DataServiceEndpoint', + typedb_entity='data-service-endpoint', + provenance=Provenance( + source_type='web_enrichment', + data_tier=DataTier.TIER_2_VERIFIED, + ), + generated_classes=[ + 'DataServiceEndpoint', 'OAIPMHEndpoint', 'SearchAPI', 'FileAPI', + 'EADDownload', 'METSAPI', 'IIPImageServer', 'InternetOfThings', + ], + fields=[ + FieldMapping( + source_path='api_endpoints.oai_pmh', + source_description='OAI-PMH endpoint', + target_class='OAIPMHEndpoint', + target_slot='endpoint_url', + transformation=TransformationType.DIRECT, + typedb_entity='oai-pmh-endpoint', + typedb_attribute='endpoint-url', + rdf_predicate='hc:oaiPmhEndpoint', + required=False, + ), + FieldMapping( + source_path='api_endpoints.search', + source_description='Search API endpoint', + target_class='SearchAPI', + target_slot='search_url', + transformation=TransformationType.DIRECT, + typedb_entity='search-api', + typedb_attribute='search-url', + rdf_predicate='hc:searchEndpoint', + required=False, + ), + FieldMapping( + source_path='api_endpoints.iiif', + source_description='IIIF Image API', + target_class='IIPImageServer', + target_slot='iiif_url', + transformation=TransformationType.DIRECT, + typedb_entity='iip-image-server', + typedb_attribute='iiif-url', + rdf_predicate='hc:iiifEndpoint', + required=False, + ), + ], + example_yaml=""" +# API endpoints +api_endpoints: + oai_pmh: https://api.museum.nl/oai + search: https://api.museum.nl/search + iiif: https://iiif.museum.nl/image/2 + ead_download: https://api.museum.nl/ead + """.strip(), + ), + # ========================================================================= + # PHASE 2: VIDEO & SOCIAL MEDIA + # ========================================================================= + # ------------------------------------------------------------------------- + # VIDEO CONTENT + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='video_content', + description='Video content and annotation classes', + detailed_description=""" +Classes for video content produced or published by heritage custodians. +Supports rich annotation of video content including chapters, transcripts, +subtitles, and time-based segments. + +Includes: +- Video posts (YouTube, Vimeo) +- Video chapters and segments +- Transcripts and subtitles +- Audio/text annotations + """.strip(), + linkml_class='VideoPost', + typedb_entity='video-post', + provenance=Provenance( + source_type='social_media', + data_tier=DataTier.TIER_3_CROWD_SOURCED, + ), + generated_classes=[ + 'VideoPost', 'VideoChapter', 'VideoTranscript', 'VideoSubtitle', + 'VideoAnnotation', 'VideoAudioAnnotation', 'VideoTextContent', + 'VideoTimeSegment', + ], + fields=[ + FieldMapping( + source_path='videos[].url', + source_description='Video URL', + target_class='VideoPost', + target_slot='video_url', + transformation=TransformationType.DIRECT, + typedb_entity='video-post', + typedb_attribute='video-url', + rdf_predicate='schema:contentUrl', + required=True, + ), + FieldMapping( + source_path='videos[].chapters', + source_description='Video chapters', + target_class='VideoChapter', + target_slot='chapters', + transformation=TransformationType.ARRAY_DIRECT, + typedb_entity='video-chapter', + typedb_attribute='chapters', + rdf_predicate='schema:hasPart', + required=False, + ), + FieldMapping( + source_path='videos[].transcript', + source_description='Video transcript', + target_class='VideoTranscript', + target_slot='transcript', + transformation=TransformationType.DIRECT, + typedb_entity='video-transcript', + typedb_attribute='transcript-text', + rdf_predicate='schema:transcript', + required=False, + ), + ], + example_yaml=""" +# Video content +videos: + - url: https://youtube.com/watch?v=abc123 + title: Museum Tour 2024 + duration: PT45M30S + chapters: + - title: Introduction + start_time: PT0S + - title: Main Gallery + start_time: PT5M + transcript: + language: nl + text: "Welkom bij het museum..." + """.strip(), + ), + # ------------------------------------------------------------------------- + # SOCIAL MEDIA CONTENT + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='social_media_content', + description='Social media content and profile classes', + detailed_description=""" +Classes for social media presence and content of heritage custodians. +Tracks posts, profiles, and engagement across platforms. + +Includes: +- Social media profiles (per platform) +- Posts and content items +- Engagement metrics + """.strip(), + linkml_class='SocialMediaProfile', + typedb_entity='social-media-profile', + provenance=Provenance( + source_type='social_media', + data_tier=DataTier.TIER_3_CROWD_SOURCED, + ), + generated_classes=[ + 'SocialMediaProfile', 'SocialMediaPost', + ], + fields=[ + FieldMapping( + source_path='social_media.profiles[].platform', + source_description='Social media platform', + target_class='SocialMediaProfile', + target_slot='platform', + transformation=TransformationType.LOOKUP, + typedb_entity='social-media-profile', + typedb_attribute='platform', + rdf_predicate='hc:socialPlatform', + required=True, + ), + FieldMapping( + source_path='social_media.profiles[].url', + source_description='Profile URL', + target_class='SocialMediaProfile', + target_slot='profile_url', + transformation=TransformationType.DIRECT, + typedb_entity='social-media-profile', + typedb_attribute='profile-url', + rdf_predicate='schema:url', + required=True, + ), + ], + example_yaml=""" +# Social media profiles +social_media: + profiles: + - platform: TWITTER + url: https://twitter.com/rijksmuseum + followers: 450000 + - platform: INSTAGRAM + url: https://instagram.com/rijksmuseum + followers: 1200000 + """.strip(), + ), + + # ========================================================================= + # PHASE 2 SOURCE MAPPINGS: Legal & Administrative + # ========================================================================= + + # ------------------------------------------------------------------------- + # legal_policies - Legal and policy classes + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='legal_policies', + description='Legal and policy classes', + detailed_description=""" +Classes for legal policies, access restrictions, and data licensing +applicable to heritage custodians and their collections. + +Includes: +- Access policies (reading room, digital) +- Data license terms +- Legal responsibility collections +- Trade register information + """.strip(), + linkml_class='AccessPolicy', + typedb_entity='access-policy', + provenance=Provenance( + source_type='custodian_yaml', + data_tier=DataTier.TIER_2_VERIFIED, + ), + generated_classes=[ + 'AccessPolicy', 'DataLicensePolicy', 'LegalResponsibilityCollection', + 'ArticlesOfAssociation', 'TradeRegister', + ], + fields=[ + FieldMapping( + source_path='policies.access', + source_description='Access policy', + target_class='AccessPolicy', + target_slot='access_type', + transformation=TransformationType.LOOKUP, + typedb_entity='access-policy', + typedb_attribute='access-type', + rdf_predicate='hc:accessPolicy', + required=False, + ), + FieldMapping( + source_path='policies.data_license', + source_description='Data license', + target_class='DataLicensePolicy', + target_slot='license', + transformation=TransformationType.DIRECT, + typedb_entity='data-license-policy', + typedb_attribute='license-type', + rdf_predicate='schema:license', + required=False, + ), + ], + example_yaml=""" +# Policies +policies: + access: + type: PUBLIC + reading_room: true + appointment_required: false + data_license: CC-BY-4.0 + legal_responsibility: + type: FOUNDATION + articles_url: https://kvk.nl/articles/12345678 + """.strip(), + ), + + # ------------------------------------------------------------------------- + # administrative_records - Administrative and financial record classes + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='administrative_records', + description='Administrative and financial record classes', + detailed_description=""" +Classes for administrative records including budgets, projects, financial +statements, and registration information. + +Includes: +- Budget tracking +- Project management +- Financial statements +- Registration info + """.strip(), + linkml_class='Budget', + typedb_entity='budget', + provenance=Provenance( + source_type='custodian_yaml', + data_tier=DataTier.TIER_2_VERIFIED, + ), + generated_classes=[ + 'Budget', 'Project', 'FinancialStatement', 'RegistrationInfo', + 'ConfidenceMeasure', 'ConflictStatus', + ], + fields=[ + FieldMapping( + source_path='administration.budget', + source_description='Budget information', + target_class='Budget', + target_slot='annual_budget', + transformation=TransformationType.DIRECT, + typedb_entity='budget', + typedb_attribute='annual-amount', + rdf_predicate='hc:annualBudget', + required=False, + ), + FieldMapping( + source_path='administration.projects', + source_description='Active projects', + target_class='Project', + target_slot='projects', + transformation=TransformationType.ARRAY_DIRECT, + typedb_entity='project', + typedb_attribute='project-name', + rdf_predicate='hc:hasProject', + required=False, + ), + FieldMapping( + source_path='administration.registration', + source_description='Registration information', + target_class='RegistrationInfo', + target_slot='registration', + transformation=TransformationType.DIRECT, + typedb_entity='registration-info', + typedb_attribute='registration-number', + rdf_predicate='hc:registrationInfo', + required=False, + ), + ], + example_yaml=""" +# Administrative records +administration: + budget: + annual_amount: 5000000 + currency: EUR + fiscal_year: 2024 + projects: + - name: Digitization 2024 + status: IN_PROGRESS + registration: + authority: KVK + number: "12345678" + """.strip(), + ), + + # ========================================================================= + # PHASE 2 SOURCE MAPPINGS: Finding Aids & Standards + # ========================================================================= + + # ------------------------------------------------------------------------- + # finding_aids_standards - Finding aids, standards, documentation classes + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='finding_aids_standards', + description='Finding aids, standards, and source documentation classes', + detailed_description=""" +Classes for archival finding aids, metadata standards, and source documentation. +Essential for archival description and interoperability. + +Includes: +- Finding aids (EAD, PDF, online) +- Metadata standards compliance +- Source document references +- Primary digital presence assertions + """.strip(), + linkml_class='FindingAid', + typedb_entity='finding-aid', + provenance=Provenance( + source_type='custodian_yaml', + data_tier=DataTier.TIER_2_VERIFIED, + ), + generated_classes=[ + 'FindingAid', 'FindingAidType', 'SourceDocument', 'Standard', + 'PrimaryDigitalPresenceAssertion', + ], + fields=[ + FieldMapping( + source_path='finding_aids[].type', + source_description='Finding aid type', + target_class='FindingAidType', + target_slot='finding_aid_type', + transformation=TransformationType.LOOKUP, + typedb_entity='finding-aid-type', + typedb_attribute='type', + rdf_predicate='hc:findingAidType', + required=True, + ), + FieldMapping( + source_path='finding_aids[].url', + source_description='Finding aid URL', + target_class='FindingAid', + target_slot='url', + transformation=TransformationType.DIRECT, + typedb_entity='finding-aid', + typedb_attribute='url', + rdf_predicate='schema:url', + required=False, + ), + FieldMapping( + source_path='standards', + source_description='Standards compliance', + target_class='Standard', + target_slot='standards', + transformation=TransformationType.ARRAY_DIRECT, + typedb_entity='standard', + typedb_attribute='standard-name', + rdf_predicate='hc:conformsToStandard', + required=False, + ), + ], + example_yaml=""" +# Finding aids and standards +finding_aids: + - type: EAD + url: https://archive.nl/ead/collection123.xml + - type: PDF + url: https://archive.nl/guides/collection123.pdf +standards: + - ISAD(G) + - EAD3 + - Dublin Core + """.strip(), + ), + + # ========================================================================= + # PHASE 2 SOURCE MAPPINGS: Reconstruction & Provenance + # ========================================================================= + + # ------------------------------------------------------------------------- + # reconstruction_provenance - Entity reconstruction and provenance tracking + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='reconstruction_provenance', + description='Entity reconstruction and provenance tracking classes', + detailed_description=""" +Classes for tracking entity reconstruction activities and provenance chains. +Used for modeling how information about heritage custodians is assembled +from multiple sources. + +Includes: +- Reconstructed entities (from multiple sources) +- Reconstruction activities +- Reconstruction agents (human/automated) +- Timeline events from external sources + """.strip(), + linkml_class='ReconstructedEntity', + typedb_entity='reconstructed-entity', + provenance=Provenance( + source_type='computed', + data_tier=DataTier.TIER_4_INFERRED, + ), + generated_classes=[ + 'ReconstructedEntity', 'ReconstructionActivity', 'ReconstructionAgent', + 'LinkupTimelineEvent', + ], + fields=[ + FieldMapping( + source_path='reconstruction.sources', + source_description='Source documents', + target_class='ReconstructedEntity', + target_slot='sources', + transformation=TransformationType.ARRAY_DIRECT, + typedb_entity='reconstructed-entity', + typedb_attribute='sources', + rdf_predicate='prov:wasDerivedFrom', + required=True, + ), + FieldMapping( + source_path='reconstruction.activity', + source_description='Reconstruction activity', + target_class='ReconstructionActivity', + target_slot='activity', + transformation=TransformationType.DIRECT, + typedb_entity='reconstruction-activity', + typedb_attribute='activity-type', + rdf_predicate='prov:wasGeneratedBy', + required=False, + ), + FieldMapping( + source_path='reconstruction.agent', + source_description='Reconstruction agent', + target_class='ReconstructionAgent', + target_slot='agent', + transformation=TransformationType.DIRECT, + typedb_entity='reconstruction-agent', + typedb_attribute='agent-id', + rdf_predicate='prov:wasAttributedTo', + required=False, + ), + ], + example_yaml=""" +# Reconstruction provenance +reconstruction: + sources: + - type: WIKIDATA + id: Q190804 + - type: ISIL_REGISTRY + id: NL-AmRM + activity: + type: AUTOMATED_MERGE + date: 2024-01-15 + agent: + type: SYSTEM + name: glam-extractor + """.strip(), + ), + + # ========================================================================= + # PHASE 2 SOURCE MAPPINGS: Storage & Facilities + # ========================================================================= + + # ------------------------------------------------------------------------- + # storage_facilities - Storage conditions and facility classes + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='storage_facilities', + description='Storage conditions and facility classes', + detailed_description=""" +Classes for physical storage conditions, educational facilities, and +specialized spaces within heritage custodian buildings. + +Includes: +- Storage conditions (climate, security) +- Storage types (warehouse, vault) +- Educational centers +- Specialized facilities (libraries, social spaces) + """.strip(), + linkml_class='StorageCondition', + typedb_entity='storage-condition', + provenance=Provenance( + source_type='custodian_yaml', + data_tier=DataTier.TIER_2_VERIFIED, + ), + generated_classes=[ + 'StorageCondition', 'StorageConditionPolicy', 'StorageType', + 'EducationCenter', 'PersonalLibrary', 'LocationLibrary', 'SocialSpace', + 'CateringPlace', + ], + fields=[ + FieldMapping( + source_path='facilities.storage.conditions', + source_description='Storage conditions', + target_class='StorageCondition', + target_slot='climate_control', + transformation=TransformationType.DIRECT, + typedb_entity='storage-condition', + typedb_attribute='climate-control', + rdf_predicate='hc:storageCondition', + required=False, + ), + FieldMapping( + source_path='facilities.storage.type', + source_description='Storage type', + target_class='StorageType', + target_slot='storage_type', + transformation=TransformationType.LOOKUP, + typedb_entity='storage-type', + typedb_attribute='type', + rdf_predicate='hc:storageType', + required=False, + ), + FieldMapping( + source_path='facilities.education_center', + source_description='Education center', + target_class='EducationCenter', + target_slot='education_center', + transformation=TransformationType.DIRECT, + typedb_entity='education-center', + typedb_attribute='center-name', + rdf_predicate='hc:hasEducationCenter', + required=False, + ), + ], + example_yaml=""" +# Facilities +facilities: + storage: + type: CLIMATE_CONTROLLED_VAULT + conditions: + temperature: 18 + humidity: 50 + security_level: HIGH + education_center: + name: Museum Education Wing + capacity: 50 + """.strip(), + ), + + # ========================================================================= + # PHASE 2 SOURCE MAPPINGS: Funding & Grants + # ========================================================================= + + # ------------------------------------------------------------------------- + # funding_grants - Funding, grants, and application classes + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='funding_grants', + description='Funding, grants, and application classes', + detailed_description=""" +Classes for funding sources, grant applications, and financial requirements +relevant to heritage custodians. + +Includes: +- Funding agendas +- Grant requirements +- Application calls + """.strip(), + linkml_class='FundingAgenda', + typedb_entity='funding-agenda', + provenance=Provenance( + source_type='external_api', + data_tier=DataTier.TIER_2_VERIFIED, + ), + generated_classes=[ + 'FundingAgenda', 'FundingRequirement', 'CallForApplication', + ], + fields=[ + FieldMapping( + source_path='funding.agendas', + source_description='Funding agendas', + target_class='FundingAgenda', + target_slot='agendas', + transformation=TransformationType.ARRAY_DIRECT, + typedb_entity='funding-agenda', + typedb_attribute='agenda-name', + rdf_predicate='hc:fundingAgenda', + required=False, + ), + FieldMapping( + source_path='funding.requirements', + source_description='Funding requirements', + target_class='FundingRequirement', + target_slot='requirements', + transformation=TransformationType.ARRAY_DIRECT, + typedb_entity='funding-requirement', + typedb_attribute='requirement', + rdf_predicate='hc:fundingRequirement', + required=False, + ), + FieldMapping( + source_path='funding.calls', + source_description='Open calls for applications', + target_class='CallForApplication', + target_slot='calls', + transformation=TransformationType.ARRAY_DIRECT, + typedb_entity='call-for-application', + typedb_attribute='call-title', + rdf_predicate='hc:openCall', + required=False, + ), + ], + example_yaml=""" +# Funding +funding: + agendas: + - name: Heritage Digitization Fund 2024 + amount: 500000 + currency: EUR + requirements: + - type: MATCHING_FUNDS + percentage: 25 + calls: + - title: Digital Heritage Innovation + deadline: 2024-06-30 + """.strip(), + ), + + # ========================================================================= + # PHASE 2 SOURCE MAPPINGS: Language & Naming + # ========================================================================= + + # ------------------------------------------------------------------------- + # language_naming - Language codes, proficiency, and naming classes + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='language_naming', + description='Language codes, proficiency, and naming classes', + detailed_description=""" +Classes for language handling, proficiency levels, and naming/appellation +conventions used in heritage custodian data. + +Includes: +- ISO language codes +- Language proficiency levels +- Appellations (formal names) +- Container (structural) classes + """.strip(), + linkml_class='LanguageCode', + typedb_entity='language-code', + provenance=Provenance( + source_type='reference_data', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'LanguageCode', 'LanguageProficiency', 'Appellation', 'Container', + ], + fields=[ + FieldMapping( + source_path='languages', + source_description='Languages used', + target_class='LanguageCode', + target_slot='languages', + transformation=TransformationType.ARRAY_DIRECT, + typedb_entity='language-code', + typedb_attribute='iso-code', + rdf_predicate='schema:inLanguage', + required=False, + ), + FieldMapping( + source_path='staff.language_proficiency', + source_description='Language proficiency', + target_class='LanguageProficiency', + target_slot='proficiency', + transformation=TransformationType.LOOKUP, + typedb_entity='language-proficiency', + typedb_attribute='level', + rdf_predicate='hc:languageProficiency', + required=False, + ), + FieldMapping( + source_path='names.appellations', + source_description='Formal appellations', + target_class='Appellation', + target_slot='appellations', + transformation=TransformationType.ARRAY_DIRECT, + typedb_entity='appellation', + typedb_attribute='name-value', + rdf_predicate='crm:P1_is_identified_by', + required=False, + ), + ], + example_yaml=""" +# Language and naming +languages: + - nl + - en + - de +names: + appellations: + - value: Rijksmuseum Amsterdam + type: OFFICIAL + language: nl + - value: National Museum of the Netherlands + type: TRANSLATION + language: en + """.strip(), + ), + + # ========================================================================= + # PHASE 2 SOURCE MAPPINGS: Specialized Archives (International) + # ========================================================================= + + # ------------------------------------------------------------------------- + # archives_german - German-specific archive types + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='archives_german', + description='German-specific archive types', + detailed_description=""" +Archive types specific to German archival tradition and organization. +German archives follow a distinctive organizational pattern based on +political/administrative regions and specialized functions. + """.strip(), + linkml_class='Verwaltungsarchiv', + typedb_entity='verwaltungsarchiv', + provenance=Provenance( + source_type='isil_registry', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'Verwaltungsarchiv', 'Vereinsarchiv', 'Verlagsarchiv', + 'Bildstelle', 'Medienzentrum', 'Personenstandsarchiv', + ], + fields=[ + FieldMapping( + source_path='archive_type', + source_description='German archive type', + target_class='Verwaltungsarchiv', + target_slot='archive_type', + transformation=TransformationType.LOOKUP, + typedb_entity='verwaltungsarchiv', + typedb_attribute='type', + rdf_predicate='hc:archiveType', + required=True, + ), + ], + example_yaml=""" +# German archive type +archive_type: VERWALTUNGSARCHIV +name: Landesarchiv Baden-Württemberg + """.strip(), + ), + + # ------------------------------------------------------------------------- + # archives_swedish - Swedish-specific archive types + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='archives_swedish', + description='Swedish-specific archive types', + detailed_description=""" +Archive types specific to Swedish archival tradition. Swedish archives +include national (Riksarkivet), regional (Landsarkiv), and local heritage +institutions (Hembygdsförening). + """.strip(), + linkml_class='Landsarkiv', + typedb_entity='landsarkiv', + provenance=Provenance( + source_type='isil_registry', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'Landsarkiv', 'Foremalarkiv', 'SectorOfArchivesInSweden', + 'LocalHeritageInstitutionSweden', + ], + fields=[ + FieldMapping( + source_path='archive_type', + source_description='Swedish archive type', + target_class='Landsarkiv', + target_slot='archive_type', + transformation=TransformationType.LOOKUP, + typedb_entity='landsarkiv', + typedb_attribute='type', + rdf_predicate='hc:archiveType', + required=True, + ), + ], + example_yaml=""" +# Swedish archive type +archive_type: LANDSARKIV +name: Landsarkivet i Uppsala + """.strip(), + ), + + # ------------------------------------------------------------------------- + # archives_french - French-specific archive types + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='archives_french', + description='French-specific archive types', + detailed_description=""" +Archive types specific to French archival organization. French archives +follow a centralized national system with departmental and communal levels. + """.strip(), + linkml_class='FrenchPrivateArchives', + typedb_entity='french-private-archives', + provenance=Provenance( + source_type='isil_registry', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'FrenchPrivateArchives', 'Conservatoria', + ], + fields=[ + FieldMapping( + source_path='archive_type', + source_description='French archive type', + target_class='FrenchPrivateArchives', + target_slot='archive_type', + transformation=TransformationType.LOOKUP, + typedb_entity='french-private-archives', + typedb_attribute='type', + rdf_predicate='hc:archiveType', + required=True, + ), + ], + example_yaml=""" +# French archive type +archive_type: ARCHIVES_PRIVEES +name: Archives privées de la famille Rothschild + """.strip(), + ), + + # ------------------------------------------------------------------------- + # archives_other - Other international specialized archive types + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='archives_other', + description='Other international specialized archive types', + detailed_description=""" +Specialized archive types from other countries including Czech regional +archives, Nordic archives, and various thematic archive types. + """.strip(), + linkml_class='SpecializedArchivesCzechia', + typedb_entity='specialized-archives-czechia', + provenance=Provenance( + source_type='isil_registry', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + generated_classes=[ + 'SpecializedArchivesCzechia', 'DimArchives', 'LightArchives', + 'HistoricalArchive', 'JointArchives', 'PartyArchive', 'Kustodie', + 'ArchivesForBuildingRecords', + ], + fields=[ + FieldMapping( + source_path='archive_type', + source_description='Specialized archive type', + target_class='SpecializedArchivesCzechia', + target_slot='archive_type', + transformation=TransformationType.LOOKUP, + typedb_entity='specialized-archives-czechia', + typedb_attribute='type', + rdf_predicate='hc:archiveType', + required=True, + ), + ], + example_yaml=""" +# Czech specialized archive +archive_type: OBLASTNI_ARCHIV +name: Státní oblastní archiv v Praze + """.strip(), + ), +] + +# ============================================================================ +# PERSON CATEGORIES (9 Categories) +# ============================================================================ + +PERSON_CATEGORIES: list[MappingCategory] = [ + MappingCategory( + id='identity', + name='Identity & Profile', + name_nl='Identiteit & Profiel', + description='Core person identity: name, headline, location, connections', + description_nl='Kern persoonidentiteit: naam, kopregel, locatie, connecties', + icon='🪪', + sources=['profile_identity', 'linkedin_profile'], + ), + MappingCategory( + id='career', + name='Career & Experience', + name_nl='Carrière & Ervaring', + description='Work history, positions, organizations', + description_nl='Werkgeschiedenis, posities, organisaties', + icon='💼', + sources=['career_history'], + ), + MappingCategory( + id='education', + name='Education & Credentials', + name_nl='Opleiding & Kwalificaties', + description='Educational background, degrees, institutions', + description_nl='Opleidingsachtergrond, diploma\'s, instellingen', + icon='🎓', + sources=['education'], + ), + MappingCategory( + id='skills', + name='Skills & Expertise', + name_nl='Vaardigheden & Expertise', + description='Professional skills, languages, endorsements', + description_nl='Professionele vaardigheden, talen, aanbevelingen', + icon='⚡', + sources=['skills_expertise'], + ), + MappingCategory( + id='heritage', + name='Heritage Sector Relevance', + name_nl='Erfgoedsector Relevantie', + description='Heritage domain expertise and experience', + description_nl='Erfgoed domeinexpertise en ervaring', + icon='🏛️', + sources=['heritage_relevance', 'heritage_experience'], + ), + MappingCategory( + id='affiliations', + name='Affiliations & Records', + name_nl='Affiliaties & Records', + description='Linked custodians, person records, connections', + description_nl='Gekoppelde bronhouders, persoonsrecords, connecties', + icon='🔗', + sources=['affiliations', 'linked_records'], + ), + MappingCategory( + id='contact', + name='Contact & Social', + name_nl='Contact & Sociaal', + description='Contact information, social media profiles', + description_nl='Contactgegevens, sociale media profielen', + icon='📧', + sources=['contact_data'], + ), + MappingCategory( + id='provenance', + name='Extraction & Provenance', + name_nl='Extractie & Herkomst', + description='Data extraction metadata and web claims', + description_nl='Data extractie metadata en webclaims', + icon='📋', + sources=['extraction_metadata', 'web_claims'], + ), + MappingCategory( + id='pico_ontology', + name='PiCo Ontology Mapping', + name_nl='PiCo Ontologie Mapping', + description='Person in Context (PiCo) ontology alignment', + description_nl='Person in Context (PiCo) ontologie uitlijning', + icon='🔬', + sources=['pico_mapped', 'pico_unmapped'], + ), +] + +# ============================================================================ +# PERSON MAPPINGS (14 Person Source Blocks) +# ============================================================================ + +PERSON_MAPPINGS: list[EnrichmentSourceMapping] = [ + # ------------------------------------------------------------------------- + # PROFILE IDENTITY - Core profile information + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='profile_identity', + description='Core profile identity - name, headline, location', + detailed_description=""" +Core identity information extracted from LinkedIn profiles. +Includes the person's full name, professional headline, location, +and current company affiliation. + +This data forms the foundation of the person entity and is used +for display and search purposes across the heritage network. + """.strip(), + linkml_class='Person', + typedb_entity='person', + provenance=Provenance( + source_type='external_api', + data_tier=DataTier.TIER_2_VERIFIED, + ), + fields=[ + FieldMapping( + source_path='profile_data.name', + source_description='Full name of the person', + target_class='Person', + target_slot='name', + typedb_entity='person', + typedb_attribute='person-name', + rdf_predicate='foaf:name', + transformation=TransformationType.DIRECT, + required=True, + notes='Primary identifier for the person', + ), + FieldMapping( + source_path='profile_data.headline', + source_description='Professional headline/title', + target_class='Person', + target_slot='headline', + typedb_entity='person', + typedb_attribute='headline', + rdf_predicate='schema:jobTitle', + transformation=TransformationType.DIRECT, + required=False, + notes='Current professional headline from LinkedIn', + ), + FieldMapping( + source_path='profile_data.headline_english', + source_description='English translation of headline', + target_class='Person', + target_slot='headline_english', + typedb_entity='person', + typedb_attribute='headline-english', + rdf_predicate='schema:jobTitle', + transformation=TransformationType.DIRECT, + required=False, + notes='Translated headline for non-English profiles', + ), + FieldMapping( + source_path='profile_data.location', + source_description='Geographic location', + target_class='Person', + target_slot='location', + typedb_entity='person', + typedb_attribute='location-string', + rdf_predicate='schema:address', + transformation=TransformationType.DIRECT, + required=False, + notes='Free-text location from LinkedIn', + ), + FieldMapping( + source_path='profile_data.country_code', + source_description='ISO country code', + target_class='Person', + target_slot='country_code', + typedb_entity='person', + typedb_attribute='country-code', + rdf_predicate='schema:addressCountry', + transformation=TransformationType.DIRECT, + required=False, + notes='Two-letter ISO 3166-1 country code', + ), + FieldMapping( + source_path='profile_data.current_company', + source_description='Current employer name', + target_class='Person', + target_slot='current_company', + typedb_entity='person', + typedb_attribute='current-company', + rdf_predicate='schema:worksFor', + transformation=TransformationType.DIRECT, + required=False, + notes='Name of current employer organization', + ), + FieldMapping( + source_path='profile_data.about', + source_description='About/summary section', + target_class='Person', + target_slot='about', + typedb_entity='person', + typedb_attribute='about', + rdf_predicate='schema:description', + transformation=TransformationType.DIRECT, + required=False, + notes='Professional summary from LinkedIn', + ), + FieldMapping( + source_path='profile_data.total_experience', + source_description='Total years of experience', + target_class='Person', + target_slot='total_experience', + typedb_entity='person', + typedb_attribute='total-experience', + rdf_predicate='schema:experienceYears', + transformation=TransformationType.DIRECT, + required=False, + notes='Calculated total professional experience', + ), + ], + generated_classes=['Person', 'PersonProfile'], + example_yaml=""" +profile_data: + name: Iris van Meer + headline: Staff member at the Services Department at Nationaal Archief + headline_english: Staff member at the Services Department at Nationaal Archief + location: The Randstad, Netherlands + country_code: NL + current_company: Nationaal Archief + about: Total Experience: 15 years and 8 months + total_experience: 15 years and 8 months + """.strip(), + ), + + # ------------------------------------------------------------------------- + # LINKEDIN PROFILE - URLs and social metrics + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='linkedin_profile', + description='LinkedIn profile URLs and social metrics', + detailed_description=""" +LinkedIn-specific profile data including the profile URL, photo URL, +and social metrics like connections and followers count. + +These fields enable linking back to the source profile and provide +insight into the person's professional network reach. + """.strip(), + linkml_class='Person', + typedb_entity='person', + provenance=Provenance( + source_type='external_api', + data_tier=DataTier.TIER_2_VERIFIED, + ), + fields=[ + FieldMapping( + source_path='linkedin_profile_url', + source_description='LinkedIn profile URL', + target_class='Person', + target_slot='linkedin_url', + typedb_entity='person', + typedb_attribute='linkedin-url', + rdf_predicate='schema:sameAs', + transformation=TransformationType.DIRECT, + required=True, + notes='Canonical LinkedIn profile URL', + ), + FieldMapping( + source_path='linkedin_photo_url', + source_description='LinkedIn profile photo URL', + target_class='Person', + target_slot='photo_url', + typedb_entity='person', + typedb_attribute='photo-url', + rdf_predicate='schema:image', + transformation=TransformationType.DIRECT, + required=False, + notes='CDN URL for profile photo', + ), + FieldMapping( + source_path='profile_data.connections', + source_description='Number of LinkedIn connections', + target_class='Person', + target_slot='connections', + typedb_entity='person', + typedb_attribute='connections-count', + rdf_predicate='schema:knows', + transformation=TransformationType.DIRECT, + required=False, + notes='First-degree connection count', + ), + FieldMapping( + source_path='profile_data.followers', + source_description='Number of followers', + target_class='Person', + target_slot='followers', + typedb_entity='person', + typedb_attribute='followers-count', + rdf_predicate='schema:followerCount', + transformation=TransformationType.DIRECT, + required=False, + notes='LinkedIn follower count', + ), + ], + generated_classes=['Person'], + example_yaml=""" +linkedin_profile_url: https://www.linkedin.com/in/iris-van-meer-34329131 +linkedin_photo_url: https://media.licdn.com/dms/image/v2/... +profile_data: + connections: 286 + followers: 289 + """.strip(), + ), + + # ------------------------------------------------------------------------- + # CAREER HISTORY - Employment timeline + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='career_history', + description='Career history and employment timeline', + detailed_description=""" +Complete career history extracted from LinkedIn profiles. +Each position includes organization, role, dates, duration, +location, and organizational metadata like company size and industry. + +This data is crucial for understanding a person's professional +trajectory and their experience in heritage-related roles. + """.strip(), + linkml_class='CareerPosition', + typedb_entity='career-position', + provenance=Provenance( + source_type='external_api', + data_tier=DataTier.TIER_2_VERIFIED, + ), + fields=[ + FieldMapping( + source_path='profile_data.career_history[].organization', + source_description='Employer organization name', + target_class='CareerPosition', + target_slot='organization', + typedb_entity='career-position', + typedb_attribute='organization-name', + rdf_predicate='schema:worksFor', + transformation=TransformationType.DIRECT, + required=True, + notes='Name of the employing organization', + ), + FieldMapping( + source_path='profile_data.career_history[].organization_linkedin', + source_description='LinkedIn URL for organization', + target_class='CareerPosition', + target_slot='organization_linkedin', + typedb_entity='career-position', + typedb_attribute='organization-linkedin-url', + rdf_predicate='schema:sameAs', + transformation=TransformationType.DIRECT, + required=False, + notes='LinkedIn company page URL', + ), + FieldMapping( + source_path='profile_data.career_history[].role', + source_description='Job title/role', + target_class='CareerPosition', + target_slot='role', + typedb_entity='career-position', + typedb_attribute='role-title', + rdf_predicate='schema:jobTitle', + transformation=TransformationType.DIRECT, + required=True, + notes='Original language job title', + ), + FieldMapping( + source_path='profile_data.career_history[].role_english', + source_description='English translation of role', + target_class='CareerPosition', + target_slot='role_english', + typedb_entity='career-position', + typedb_attribute='role-title-english', + rdf_predicate='schema:jobTitle', + transformation=TransformationType.DIRECT, + required=False, + notes='English translation for non-English titles', + ), + FieldMapping( + source_path='profile_data.career_history[].dates', + source_description='Employment date range', + target_class='CareerPosition', + target_slot='dates', + typedb_entity='career-position', + typedb_attribute='date-range', + rdf_predicate='schema:temporalCoverage', + transformation=TransformationType.DIRECT, + required=False, + notes='Date range string (e.g., "Apr 2014 - Present")', + ), + FieldMapping( + source_path='profile_data.career_history[].duration', + source_description='Employment duration', + target_class='CareerPosition', + target_slot='duration', + typedb_entity='career-position', + typedb_attribute='duration', + rdf_predicate='schema:duration', + transformation=TransformationType.DIRECT, + required=False, + notes='Calculated duration (e.g., "11 years and 7 months")', + ), + FieldMapping( + source_path='profile_data.career_history[].location', + source_description='Work location', + target_class='CareerPosition', + target_slot='location', + typedb_entity='career-position', + typedb_attribute='work-location', + rdf_predicate='schema:workLocation', + transformation=TransformationType.DIRECT, + required=False, + notes='Geographic location of the position', + ), + FieldMapping( + source_path='profile_data.career_history[].current', + source_description='Is current position', + target_class='CareerPosition', + target_slot='current', + typedb_entity='career-position', + typedb_attribute='is-current', + rdf_predicate='schema:currentPosition', + transformation=TransformationType.DIRECT, + required=False, + notes='Boolean flag for current employment', + ), + FieldMapping( + source_path='profile_data.career_history[].company_size', + source_description='Company employee count range', + target_class='CareerPosition', + target_slot='company_size', + typedb_entity='career-position', + typedb_attribute='company-size', + rdf_predicate='schema:numberOfEmployees', + transformation=TransformationType.DIRECT, + required=False, + notes='Employee count range (e.g., "201-500 employees")', + ), + FieldMapping( + source_path='profile_data.career_history[].company_founded', + source_description='Year company was founded', + target_class='CareerPosition', + target_slot='company_founded', + typedb_entity='career-position', + typedb_attribute='company-founded-year', + rdf_predicate='schema:foundingDate', + transformation=TransformationType.DIRECT, + required=False, + notes='Founding year of the organization', + ), + FieldMapping( + source_path='profile_data.career_history[].company_type', + source_description='Type of company', + target_class='CareerPosition', + target_slot='company_type', + typedb_entity='career-position', + typedb_attribute='company-type', + rdf_predicate='schema:additionalType', + transformation=TransformationType.DIRECT, + required=False, + notes='Organization type (e.g., "Government Agency")', + ), + FieldMapping( + source_path='profile_data.career_history[].industry', + source_description='Industry sector', + target_class='CareerPosition', + target_slot='industry', + typedb_entity='career-position', + typedb_attribute='industry', + rdf_predicate='schema:industry', + transformation=TransformationType.DIRECT, + required=False, + notes='Industry classification', + ), + FieldMapping( + source_path='profile_data.career_history[].department', + source_description='Department within organization', + target_class='CareerPosition', + target_slot='department', + typedb_entity='career-position', + typedb_attribute='department', + rdf_predicate='schema:department', + transformation=TransformationType.DIRECT, + required=False, + notes='Department or division name', + ), + FieldMapping( + source_path='profile_data.career_history[].level', + source_description='Seniority level', + target_class='CareerPosition', + target_slot='level', + typedb_entity='career-position', + typedb_attribute='seniority-level', + rdf_predicate='schema:occupationalCategory', + transformation=TransformationType.DIRECT, + required=False, + notes='Career level (e.g., "Specialist", "Manager")', + ), + FieldMapping( + source_path='profile_data.career_history[].description', + source_description='Role description', + target_class='CareerPosition', + target_slot='description', + typedb_entity='career-position', + typedb_attribute='role-description', + rdf_predicate='schema:description', + transformation=TransformationType.DIRECT, + required=False, + notes='Free-text description of the role', + ), + ], + generated_classes=['CareerPosition', 'Person'], + example_yaml=""" +profile_data: + career_history: + - organization: Nationaal Archief + organization_linkedin: https://www.linkedin.com/company/nationaal-archief + role: Staff Member At The Services Department + role_english: Staff Member At The Services Department + dates: Apr 2014 - Present + duration: 11 years and 7 months + location: Den Haag + current: true + company_size: 201-500 employees + company_founded: 1802 + company_type: Government Agency + industry: Government Administration + department: Other + level: Specialist + description: null + """.strip(), + ), + + # ------------------------------------------------------------------------- + # EDUCATION - Academic background + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='education', + description='Educational background and qualifications', + detailed_description=""" +Educational history including degrees, institutions, and duration. +Links to institution LinkedIn pages when available. + +This data helps understand the academic foundation and +qualifications of heritage professionals. + """.strip(), + linkml_class='Education', + typedb_entity='education', + provenance=Provenance( + source_type='external_api', + data_tier=DataTier.TIER_2_VERIFIED, + ), + fields=[ + FieldMapping( + source_path='profile_data.education[].institution', + source_description='Educational institution name', + target_class='Education', + target_slot='institution', + typedb_entity='education', + typedb_attribute='institution-name', + rdf_predicate='schema:educationalCredentialAwarded', + transformation=TransformationType.DIRECT, + required=True, + notes='Name of university/school', + ), + FieldMapping( + source_path='profile_data.education[].institution_linkedin', + source_description='LinkedIn URL for institution', + target_class='Education', + target_slot='institution_linkedin', + typedb_entity='education', + typedb_attribute='institution-linkedin-url', + rdf_predicate='schema:sameAs', + transformation=TransformationType.DIRECT, + required=False, + notes='LinkedIn school page URL', + ), + FieldMapping( + source_path='profile_data.education[].degree', + source_description='Degree and field of study', + target_class='Education', + target_slot='degree', + typedb_entity='education', + typedb_attribute='degree', + rdf_predicate='schema:educationalLevel', + transformation=TransformationType.DIRECT, + required=False, + notes='Degree type and major (e.g., "MA, History")', + ), + FieldMapping( + source_path='profile_data.education[].years', + source_description='Years attended', + target_class='Education', + target_slot='years', + typedb_entity='education', + typedb_attribute='years-attended', + rdf_predicate='schema:temporalCoverage', + transformation=TransformationType.DIRECT, + required=False, + notes='Date range (e.g., "2001 - 2007")', + ), + FieldMapping( + source_path='profile_data.education[].duration', + source_description='Duration of study', + target_class='Education', + target_slot='duration', + typedb_entity='education', + typedb_attribute='study-duration', + rdf_predicate='schema:duration', + transformation=TransformationType.DIRECT, + required=False, + notes='Calculated duration (e.g., "6 years")', + ), + FieldMapping( + source_path='profile_data.education[].country', + source_description='Country of institution', + target_class='Education', + target_slot='country', + typedb_entity='education', + typedb_attribute='education-country', + rdf_predicate='schema:addressCountry', + transformation=TransformationType.DIRECT, + required=False, + notes='ISO country code of institution', + ), + ], + generated_classes=['Education', 'Person'], + example_yaml=""" +profile_data: + education: + - institution: Universiteit Utrecht + institution_linkedin: https://www.linkedin.com/school/universiteit-utrecht + degree: MA, History + years: 2001 - 2007 + duration: 6 years + country: NL + """.strip(), + ), + + # ------------------------------------------------------------------------- + # SKILLS & EXPERTISE - Professional capabilities + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='skills_expertise', + description='Professional skills, languages, and expertise areas', + detailed_description=""" +Professional skills endorsed on LinkedIn, language proficiencies, +and identified expertise areas based on career history analysis. + +Expertise areas are derived from analyzing the person's complete +professional background in the heritage sector. + """.strip(), + linkml_class='Person', + typedb_entity='person', + provenance=Provenance( + source_type='external_api', + data_tier=DataTier.TIER_2_VERIFIED, + ), + fields=[ + FieldMapping( + source_path='profile_data.skills', + source_description='Professional skills list', + target_class='Person', + target_slot='skills', + typedb_entity='person', + typedb_attribute='skills', + rdf_predicate='schema:knowsAbout', + transformation=TransformationType.ARRAY_DIRECT, + required=False, + notes='LinkedIn-endorsed skills', + ), + FieldMapping( + source_path='profile_data.languages', + source_description='Language proficiencies', + target_class='Person', + target_slot='languages', + typedb_entity='person', + typedb_attribute='languages', + rdf_predicate='schema:knowsLanguage', + transformation=TransformationType.ARRAY_DIRECT, + required=False, + notes='Languages spoken with proficiency levels', + ), + FieldMapping( + source_path='profile_data.expertise_areas', + source_description='Identified expertise areas', + target_class='Person', + target_slot='expertise_areas', + typedb_entity='person', + typedb_attribute='expertise-areas', + rdf_predicate='schema:hasOccupation', + transformation=TransformationType.ARRAY_DIRECT, + required=False, + notes='Derived from career analysis', + ), + ], + generated_classes=['Person'], + example_yaml=""" +profile_data: + skills: + - Digital Preservation + - Archival Description + - Collection Management + languages: + - Dutch (Native) + - English (Professional) + expertise_areas: + - Archival services + - Public services + - History research + - Library services + """.strip(), + ), + + # ------------------------------------------------------------------------- + # HERITAGE RELEVANCE - Sector-specific assessment + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='heritage_relevance', + description='Heritage sector relevance assessment', + detailed_description=""" +Assessment of the person's relevance to the heritage sector. +Includes heritage type classification (GLAMORCUBESFIXPHDNT), +current institution, sector role, and years of heritage experience. + +This provides a quick overview of where the person fits +within the heritage ecosystem. + """.strip(), + linkml_class='HeritageRelevance', + typedb_entity='heritage-relevance', + provenance=Provenance( + source_type='computed', + data_tier=DataTier.TIER_3_CROWD_SOURCED, + ), + fields=[ + FieldMapping( + source_path='heritage_sector_relevance.heritage_type', + source_description='Heritage type code', + target_class='HeritageRelevance', + target_slot='heritage_type', + typedb_entity='heritage-relevance', + typedb_attribute='heritage-type-code', + rdf_predicate='glam:heritageType', + transformation=TransformationType.DIRECT, + required=False, + notes='Single letter GLAMORCUBESFIXPHDNT code', + ), + FieldMapping( + source_path='heritage_sector_relevance.heritage_type_label', + source_description='Heritage type label', + target_class='HeritageRelevance', + target_slot='heritage_type_label', + typedb_entity='heritage-relevance', + typedb_attribute='heritage-type-label', + rdf_predicate='rdfs:label', + transformation=TransformationType.DIRECT, + required=False, + notes='Human-readable type label (e.g., "Archive")', + ), + FieldMapping( + source_path='heritage_sector_relevance.current_institution', + source_description='Current heritage institution', + target_class='HeritageRelevance', + target_slot='current_institution', + typedb_entity='heritage-relevance', + typedb_attribute='current-institution', + rdf_predicate='schema:worksFor', + transformation=TransformationType.DIRECT, + required=False, + notes='Name of current heritage employer', + ), + FieldMapping( + source_path='heritage_sector_relevance.institution_type', + source_description='Type of institution', + target_class='HeritageRelevance', + target_slot='institution_type', + typedb_entity='heritage-relevance', + typedb_attribute='institution-type', + rdf_predicate='schema:additionalType', + transformation=TransformationType.DIRECT, + required=False, + notes='Classification of the institution', + ), + FieldMapping( + source_path='heritage_sector_relevance.sector_role', + source_description='Role within heritage sector', + target_class='HeritageRelevance', + target_slot='sector_role', + typedb_entity='heritage-relevance', + typedb_attribute='sector-role', + rdf_predicate='schema:jobTitle', + transformation=TransformationType.DIRECT, + required=False, + notes='Standardized role classification', + ), + FieldMapping( + source_path='heritage_sector_relevance.years_in_heritage', + source_description='Years of heritage experience', + target_class='HeritageRelevance', + target_slot='years_in_heritage', + typedb_entity='heritage-relevance', + typedb_attribute='years-in-heritage', + rdf_predicate='schema:experienceYears', + transformation=TransformationType.DIRECT, + required=False, + notes='Total years in heritage sector', + ), + ], + generated_classes=['HeritageRelevance', 'Person'], + example_yaml=""" +heritage_sector_relevance: + heritage_type: A + heritage_type_label: Archive + current_institution: Nationaal Archief + institution_type: National Archive + sector_role: Services Staff + years_in_heritage: 11 + """.strip(), + ), + + # ------------------------------------------------------------------------- + # HERITAGE EXPERIENCE - Relevant positions + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='heritage_experience', + description='Heritage-relevant experience from career history', + detailed_description=""" +Filtered list of positions that are relevant to the heritage sector. +Extracted from full career history with relevance annotations. + +Includes both current and past positions at heritage institutions +with notes explaining their relevance to the GLAM sector. + """.strip(), + linkml_class='HeritageExperience', + typedb_entity='heritage-experience', + provenance=Provenance( + source_type='computed', + data_tier=DataTier.TIER_3_CROWD_SOURCED, + ), + fields=[ + FieldMapping( + source_path='profile_data.heritage_relevant_experience[].organization', + source_description='Heritage organization name', + target_class='HeritageExperience', + target_slot='organization', + typedb_entity='heritage-experience', + typedb_attribute='heritage-org-name', + rdf_predicate='schema:worksFor', + transformation=TransformationType.DIRECT, + required=True, + notes='Name of heritage institution', + ), + FieldMapping( + source_path='profile_data.heritage_relevant_experience[].role', + source_description='Role at heritage organization', + target_class='HeritageExperience', + target_slot='role', + typedb_entity='heritage-experience', + typedb_attribute='heritage-role', + rdf_predicate='schema:jobTitle', + transformation=TransformationType.DIRECT, + required=True, + notes='Job title at heritage institution', + ), + FieldMapping( + source_path='profile_data.heritage_relevant_experience[].relevance', + source_description='Relevance explanation', + target_class='HeritageExperience', + target_slot='relevance', + typedb_entity='heritage-experience', + typedb_attribute='relevance-notes', + rdf_predicate='schema:description', + transformation=TransformationType.DIRECT, + required=False, + notes='Why this position is heritage-relevant', + ), + FieldMapping( + source_path='profile_data.heritage_relevant_experience[].current', + source_description='Is current position', + target_class='HeritageExperience', + target_slot='current', + typedb_entity='heritage-experience', + typedb_attribute='is-current-heritage', + rdf_predicate='schema:currentPosition', + transformation=TransformationType.DIRECT, + required=False, + notes='Whether this is a current position', + ), + ], + generated_classes=['HeritageExperience', 'Person'], + example_yaml=""" +profile_data: + heritage_relevant_experience: + - organization: Nationaal Archief + role: Staff Member At The Services Department + relevance: Public services at National Archives of the Netherlands + current: true + - organization: University Library Utrecht + role: Library Employee + relevance: Academic library experience + current: false + """.strip(), + ), + + # ------------------------------------------------------------------------- + # AFFILIATIONS - Custodian connections + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='affiliations', + description='Affiliations with heritage custodians', + detailed_description=""" +Links between the person and heritage custodian institutions. +Each affiliation includes the custodian name, slug identifier, +role title, and heritage classification. + +These affiliations enable network analysis across the heritage +sector workforce. + """.strip(), + linkml_class='Affiliation', + typedb_entity='affiliation', + provenance=Provenance( + source_type='computed', + data_tier=DataTier.TIER_2_VERIFIED, + ), + fields=[ + FieldMapping( + source_path='affiliations[].custodian_name', + source_description='Heritage custodian name', + target_class='Affiliation', + target_slot='custodian_name', + typedb_entity='affiliation', + typedb_attribute='custodian-name', + rdf_predicate='schema:memberOf', + transformation=TransformationType.DIRECT, + required=True, + notes='Name of the heritage institution', + ), + FieldMapping( + source_path='affiliations[].custodian_slug', + source_description='Custodian identifier slug', + target_class='Affiliation', + target_slot='custodian_slug', + typedb_entity='affiliation', + typedb_attribute='custodian-slug', + rdf_predicate='schema:identifier', + transformation=TransformationType.DIRECT, + required=True, + notes='URL-safe identifier for the custodian', + ), + FieldMapping( + source_path='affiliations[].role_title', + source_description='Role at custodian', + target_class='Affiliation', + target_slot='role_title', + typedb_entity='affiliation', + typedb_attribute='affiliation-role', + rdf_predicate='schema:jobTitle', + transformation=TransformationType.DIRECT, + required=False, + notes='Job title at this custodian', + ), + FieldMapping( + source_path='affiliations[].heritage_relevant', + source_description='Is heritage relevant', + target_class='Affiliation', + target_slot='heritage_relevant', + typedb_entity='affiliation', + typedb_attribute='is-heritage-relevant', + rdf_predicate='glam:heritageRelevant', + transformation=TransformationType.DIRECT, + required=False, + notes='Whether affiliation is heritage-relevant', + ), + FieldMapping( + source_path='affiliations[].heritage_type', + source_description='Heritage type code', + target_class='Affiliation', + target_slot='heritage_type', + typedb_entity='affiliation', + typedb_attribute='affiliation-heritage-type', + rdf_predicate='glam:heritageType', + transformation=TransformationType.DIRECT, + required=False, + notes='GLAMORCUBESFIXPHDNT type code', + ), + FieldMapping( + source_path='affiliations[].current', + source_description='Is current affiliation', + target_class='Affiliation', + target_slot='current', + typedb_entity='affiliation', + typedb_attribute='is-current-affiliation', + rdf_predicate='schema:currentPosition', + transformation=TransformationType.DIRECT, + required=False, + notes='Whether this is a current affiliation', + ), + FieldMapping( + source_path='affiliations[].observed_on', + source_description='Observation timestamp', + target_class='Affiliation', + target_slot='observed_on', + typedb_entity='affiliation', + typedb_attribute='observed-on', + rdf_predicate='prov:generatedAtTime', + transformation=TransformationType.DIRECT, + required=False, + notes='When this affiliation was observed', + ), + FieldMapping( + source_path='affiliations[].source_url', + source_description='Source URL for affiliation', + target_class='Affiliation', + target_slot='source_url', + typedb_entity='affiliation', + typedb_attribute='affiliation-source-url', + rdf_predicate='prov:wasDerivedFrom', + transformation=TransformationType.DIRECT, + required=False, + notes='URL where affiliation was discovered', + ), + ], + generated_classes=['Affiliation'], + example_yaml=""" +affiliations: + - custodian_name: Nationaal Archief + custodian_slug: nationaal-archief + role_title: Staff member at the Services Department at Nationaal Archief + heritage_relevant: true + heritage_type: A + current: true + observed_on: 2025-12-14T11:21:47Z + source_url: https://www.linkedin.com/company/nationaal-archief/people/ + """.strip(), + ), + + # ------------------------------------------------------------------------- + # LINKED RECORDS - Cross-references + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='linked_records', + description='Links to related records in the system', + detailed_description=""" +Cross-references to other records in the heritage data system. +Includes links to staff records (parsed from LinkedIn company pages) +and custodian records (heritage institution YAML files). + +These links enable navigation between person profiles and +the institutions they work for. + """.strip(), + linkml_class='LinkedRecords', + typedb_entity='linked-records', + provenance=Provenance( + source_type='computed', + data_tier=DataTier.TIER_2_VERIFIED, + ), + fields=[ + FieldMapping( + source_path='linked_records.staff_record.file', + source_description='Staff record file path', + target_class='LinkedRecords', + target_slot='staff_record_file', + typedb_entity='linked-records', + typedb_attribute='staff-record-path', + rdf_predicate='prov:wasDerivedFrom', + transformation=TransformationType.DIRECT, + required=False, + notes='Path to parsed staff JSON file', + ), + FieldMapping( + source_path='linked_records.staff_record.staff_id', + source_description='Staff record ID', + target_class='LinkedRecords', + target_slot='staff_id', + typedb_entity='linked-records', + typedb_attribute='staff-id', + rdf_predicate='schema:identifier', + transformation=TransformationType.DIRECT, + required=False, + notes='Unique staff identifier', + ), + FieldMapping( + source_path='linked_records.custodian_record.ghcid', + source_description='Custodian GHCID', + target_class='LinkedRecords', + target_slot='custodian_ghcid', + typedb_entity='linked-records', + typedb_attribute='linked-ghcid', + rdf_predicate='glam:ghcid', + transformation=TransformationType.DIRECT, + required=False, + notes='GHCID of linked custodian', + ), + FieldMapping( + source_path='linked_records.custodian_record.notes', + source_description='Custodian record notes', + target_class='LinkedRecords', + target_slot='custodian_notes', + typedb_entity='linked-records', + typedb_attribute='custodian-notes', + rdf_predicate='schema:description', + transformation=TransformationType.DIRECT, + required=False, + notes='Additional notes about the custodian link', + ), + ], + generated_classes=['LinkedRecords'], + example_yaml=""" +linked_records: + staff_record: + file: data/custodian/person/affiliated/parsed/nationaal-archief_staff_20251210T155415Z.json + staff_id: nationaal-archief_staff_0002_iris_van_meer + custodian_record: + ghcid: NL-ZH-DHA-A-NA + notes: Nationaal Archief, The Hague + """.strip(), + ), + + # ------------------------------------------------------------------------- + # CONTACT DATA - Contact information + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='contact_data', + description='Contact information and communication channels', + detailed_description=""" +Contact information including email addresses and phone numbers. +Emails may be inferred from organizational naming conventions +with confidence scores indicating reliability. + +Also includes profile photo URLs and external lookup service links. + """.strip(), + linkml_class='ContactData', + typedb_entity='contact-data', + provenance=Provenance( + source_type='computed', + data_tier=DataTier.TIER_3_CROWD_SOURCED, + ), + fields=[ + FieldMapping( + source_path='contact_data.provenance.source', + source_description='Contact data source', + target_class='ContactData', + target_slot='provenance_source', + typedb_entity='contact-data', + typedb_attribute='contact-source', + rdf_predicate='prov:wasAttributedTo', + transformation=TransformationType.DIRECT, + required=False, + notes='How contact data was obtained', + ), + FieldMapping( + source_path='contact_data.emails[].email', + source_description='Email address', + target_class='ContactData', + target_slot='email', + typedb_entity='contact-data', + typedb_attribute='email-address', + rdf_predicate='schema:email', + transformation=TransformationType.DIRECT, + required=False, + notes='Email address (may be inferred)', + ), + FieldMapping( + source_path='contact_data.emails[].type', + source_description='Email type', + target_class='ContactData', + target_slot='email_type', + typedb_entity='contact-data', + typedb_attribute='email-type', + rdf_predicate='schema:contactType', + transformation=TransformationType.DIRECT, + required=False, + notes='Type of email (work, personal)', + ), + FieldMapping( + source_path='contact_data.emails[].confidence', + source_description='Email confidence score', + target_class='ContactData', + target_slot='email_confidence', + typedb_entity='contact-data', + typedb_attribute='email-confidence', + rdf_predicate='prov:confidence', + transformation=TransformationType.DIRECT, + required=False, + notes='Confidence in email accuracy (0-1)', + ), + FieldMapping( + source_path='contact_data.emails[].verified', + source_description='Email verification status', + target_class='ContactData', + target_slot='email_verified', + typedb_entity='contact-data', + typedb_attribute='email-verified', + rdf_predicate='schema:verified', + transformation=TransformationType.DIRECT, + required=False, + notes='Whether email has been verified', + ), + FieldMapping( + source_path='contact_data.profile_photo_url', + source_description='Profile photo URL', + target_class='ContactData', + target_slot='profile_photo_url', + typedb_entity='contact-data', + typedb_attribute='profile-photo', + rdf_predicate='schema:image', + transformation=TransformationType.DIRECT, + required=False, + notes='URL to profile photo', + ), + FieldMapping( + source_path='contact_data.rocketreach_url', + source_description='RocketReach lookup URL', + target_class='ContactData', + target_slot='rocketreach_url', + typedb_entity='contact-data', + typedb_attribute='rocketreach-url', + rdf_predicate='schema:sameAs', + transformation=TransformationType.DIRECT, + required=False, + notes='Link to RocketReach profile lookup', + ), + ], + generated_classes=['ContactData'], + example_yaml=""" +contact_data: + provenance: + source: LinkedIn profile + Dutch government naming convention + source_url: https://www.linkedin.com/in/iris-van-meer-34329131 + retrieved_date: 2025-12-14 + extraction_method: naming_convention_inference + emails: + - email: iris.van.meer@nationaalarchief.nl + domain: nationaalarchief.nl + type: work + source: inferred + confidence: 0.8 + verified: false + phones: [] + profile_photo_url: https://media.licdn.com/dms/image/v2/... + """.strip(), + ), + + # ------------------------------------------------------------------------- + # EXTRACTION METADATA - Data provenance + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='extraction_metadata', + description='Metadata about how the profile was extracted', + detailed_description=""" +Provenance information about the data extraction process. +Includes source file references, extraction timestamps, +methods used, and cost tracking for API calls. + +This ensures full traceability of data origin and enables +reproducibility of the extraction process. + """.strip(), + linkml_class='ExtractionMetadata', + typedb_entity='extraction-metadata', + provenance=Provenance( + source_type='computed', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + fields=[ + FieldMapping( + source_path='extraction_metadata.source_file', + source_description='Source file path', + target_class='ExtractionMetadata', + target_slot='source_file', + typedb_entity='extraction-metadata', + typedb_attribute='source-file-path', + rdf_predicate='prov:wasDerivedFrom', + transformation=TransformationType.DIRECT, + required=False, + notes='Original source file for extraction', + ), + FieldMapping( + source_path='extraction_metadata.staff_id', + source_description='Staff identifier', + target_class='ExtractionMetadata', + target_slot='staff_id', + typedb_entity='extraction-metadata', + typedb_attribute='extraction-staff-id', + rdf_predicate='schema:identifier', + transformation=TransformationType.DIRECT, + required=False, + notes='Staff ID from source data', + ), + FieldMapping( + source_path='extraction_metadata.extraction_date', + source_description='Extraction timestamp', + target_class='ExtractionMetadata', + target_slot='extraction_date', + typedb_entity='extraction-metadata', + typedb_attribute='extraction-date', + rdf_predicate='prov:generatedAtTime', + transformation=TransformationType.DIRECT, + required=True, + notes='ISO 8601 timestamp of extraction', + ), + FieldMapping( + source_path='extraction_metadata.extraction_method', + source_description='Method used for extraction', + target_class='ExtractionMetadata', + target_slot='extraction_method', + typedb_entity='extraction-metadata', + typedb_attribute='extraction-method', + rdf_predicate='prov:wasGeneratedBy', + transformation=TransformationType.DIRECT, + required=False, + notes='Tool/API used (e.g., exa_crawling_exa)', + ), + FieldMapping( + source_path='extraction_metadata.extraction_agent', + source_description='Agent performing extraction', + target_class='ExtractionMetadata', + target_slot='extraction_agent', + typedb_entity='extraction-metadata', + typedb_attribute='extraction-agent', + rdf_predicate='prov:wasAttributedTo', + transformation=TransformationType.DIRECT, + required=False, + notes='AI agent or script name', + ), + FieldMapping( + source_path='extraction_metadata.linkedin_url', + source_description='Source LinkedIn URL', + target_class='ExtractionMetadata', + target_slot='linkedin_url', + typedb_entity='extraction-metadata', + typedb_attribute='extraction-linkedin-url', + rdf_predicate='prov:hadPrimarySource', + transformation=TransformationType.DIRECT, + required=False, + notes='LinkedIn profile URL that was extracted', + ), + FieldMapping( + source_path='extraction_metadata.cost_usd', + source_description='Extraction cost in USD', + target_class='ExtractionMetadata', + target_slot='cost_usd', + typedb_entity='extraction-metadata', + typedb_attribute='extraction-cost', + rdf_predicate='schema:price', + transformation=TransformationType.DIRECT, + required=False, + notes='API cost for extraction', + ), + FieldMapping( + source_path='extraction_metadata.request_id', + source_description='API request identifier', + target_class='ExtractionMetadata', + target_slot='request_id', + typedb_entity='extraction-metadata', + typedb_attribute='api-request-id', + rdf_predicate='schema:identifier', + transformation=TransformationType.DIRECT, + required=False, + notes='Unique request ID for tracing', + ), + ], + generated_classes=['ExtractionMetadata'], + example_yaml=""" +extraction_metadata: + source_file: null + staff_id: null + extraction_date: 2025-12-13T17:35:24.524090+00:00 + extraction_method: exa_crawling_exa + extraction_agent: claude-opus-4.5 + linkedin_url: https://www.linkedin.com/in/iris-van-meer-34329131 + cost_usd: 0 + request_id: null + """.strip(), + ), + + # ------------------------------------------------------------------------- + # WEB CLAIMS - Verifiable claims from web sources + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='web_claims', + description='Web claims with provenance tracking', + detailed_description=""" +Individual claims extracted from web sources with full provenance. +Each claim includes the claim type, value, source URL, retrieval +timestamp, and the agent/tool that performed the extraction. + +This follows the WebObservation pattern for verifiable data claims. + """.strip(), + linkml_class='WebClaim', + typedb_entity='web-claim', + provenance=Provenance( + source_type='external_api', + data_tier=DataTier.TIER_2_VERIFIED, + ), + fields=[ + FieldMapping( + source_path='web_claims[].claim_type', + source_description='Type of claim', + target_class='WebClaim', + target_slot='claim_type', + typedb_entity='web-claim', + typedb_attribute='claim-type', + rdf_predicate='rdf:type', + transformation=TransformationType.DIRECT, + required=True, + notes='Category of claim (e.g., full_name, role_title)', + ), + FieldMapping( + source_path='web_claims[].claim_value', + source_description='Value of the claim', + target_class='WebClaim', + target_slot='claim_value', + typedb_entity='web-claim', + typedb_attribute='claim-value', + rdf_predicate='rdf:value', + transformation=TransformationType.DIRECT, + required=True, + notes='The actual claimed value', + ), + FieldMapping( + source_path='web_claims[].source_url', + source_description='URL source of claim', + target_class='WebClaim', + target_slot='source_url', + typedb_entity='web-claim', + typedb_attribute='claim-source-url', + rdf_predicate='prov:wasDerivedFrom', + transformation=TransformationType.DIRECT, + required=True, + notes='Web page where claim was found', + ), + FieldMapping( + source_path='web_claims[].retrieved_on', + source_description='Retrieval timestamp', + target_class='WebClaim', + target_slot='retrieved_on', + typedb_entity='web-claim', + typedb_attribute='claim-retrieved-on', + rdf_predicate='prov:generatedAtTime', + transformation=TransformationType.DIRECT, + required=False, + notes='When the claim was retrieved', + ), + FieldMapping( + source_path='web_claims[].retrieval_agent', + source_description='Agent that retrieved claim', + target_class='WebClaim', + target_slot='retrieval_agent', + typedb_entity='web-claim', + typedb_attribute='claim-retrieval-agent', + rdf_predicate='prov:wasAttributedTo', + transformation=TransformationType.DIRECT, + required=False, + notes='Tool/agent that extracted the claim', + ), + ], + generated_classes=['WebClaim'], + example_yaml=""" +web_claims: + - claim_type: full_name + claim_value: Iris van Meer + source_url: https://www.linkedin.com/in/iris-van-meer-34329131 + retrieved_on: 2025-12-14T11:21:47Z + retrieval_agent: linkedin_html_parser + - claim_type: role_title + claim_value: Staff member at the Services Department at Nationaal Archief + source_url: https://www.linkedin.com/in/iris-van-meer-34329131 + retrieved_on: 2025-12-14T11:21:47Z + retrieval_agent: linkedin_html_parser + """.strip(), + ), + + # ------------------------------------------------------------------------- + # PICO MAPPED - PiCo ontology properties that ARE mapped + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='pico_mapped', + description='PiCo ontology properties mapped to HC person data', + detailed_description=""" +The Heritage Custodian (HC) system implements a focused subset of the PiCo +(Persons in Context) ontology, optimized for tracking heritage sector staff. + +PiCo was designed for historical vital records (birth/death certificates, +marriage records, census data), but HC uses LinkedIn as the primary data +source, which provides professional context rather than biographical/genealogical +data. + +This section documents which PiCo properties ARE mapped to HC fields, +showing the semantic alignment between the ontologies. + """.strip(), + linkml_class='PersonObservation', + typedb_entity='person-observation', + provenance=Provenance( + source_type='ontology_mapping', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + fields=[ + FieldMapping( + source_path='profile_data.name', + source_description='Full name of the person', + target_class='PersonObservation', + target_slot='name', + typedb_entity='person-observation', + typedb_attribute='person-name', + rdf_predicate='sdo:name', + transformation=TransformationType.DIRECT, + required=True, + notes='PiCo uses sdo:name (Schema.org) for full names. Directly mapped.', + status='mapped', + ), + FieldMapping( + source_path='profile_data.location', + source_description='Current geographic location', + target_class='PersonObservation', + target_slot='location', + typedb_entity='person-observation', + typedb_attribute='location-string', + rdf_predicate='sdo:address', + transformation=TransformationType.DIRECT, + required=False, + notes='PiCo uses sdo:address for location. LinkedIn provides free-text location.', + status='mapped', + ), + FieldMapping( + source_path='profile_data.headline', + source_description='Current occupation/role', + target_class='PersonObservation', + target_slot='headline', + typedb_entity='person-observation', + typedb_attribute='headline', + rdf_predicate='sdo:hasOccupation', + transformation=TransformationType.DIRECT, + required=False, + notes='PiCo uses sdo:hasOccupation for job roles. HC captures this via LinkedIn headline.', + status='mapped', + ), + FieldMapping( + source_path='extraction_metadata.linkedin_url', + source_description='LinkedIn profile URL as primary source', + target_class='PersonObservation', + target_slot='source_url', + typedb_entity='person-observation', + typedb_attribute='source-url', + rdf_predicate='prov:hadPrimarySource', + transformation=TransformationType.DIRECT, + required=True, + notes='PiCo uses prov:hadPrimarySource for provenance. LinkedIn URL serves as source document.', + status='mapped', + ), + FieldMapping( + source_path='affiliations[].role_title', + source_description='Role at heritage institution', + target_class='Affiliation', + target_slot='role_title', + typedb_entity='person-observation', + typedb_attribute='role-title', + rdf_predicate='pico:hasRole', + transformation=TransformationType.DIRECT, + required=False, + notes='PiCo uses pico:hasRole with picot_roles thesaurus. HC captures current institutional roles.', + status='mapped', + ), + FieldMapping( + source_path='extraction_metadata.extraction_date', + source_description='When observation was recorded', + target_class='PersonObservation', + target_slot='observation_date', + typedb_entity='person-observation', + typedb_attribute='observation-date', + rdf_predicate='prov:generatedAtTime', + transformation=TransformationType.DIRECT, + required=True, + notes='PiCo uses prov:generatedAtTime for temporal provenance. Mapped to extraction timestamp.', + status='mapped', + ), + FieldMapping( + source_path='extraction_metadata.extraction_agent', + source_description='Agent that performed extraction', + target_class='PersonObservation', + target_slot='extraction_agent', + typedb_entity='person-observation', + typedb_attribute='extraction-agent', + rdf_predicate='prov:wasAttributedTo', + transformation=TransformationType.DIRECT, + required=False, + notes='PiCo uses prov:wasAttributedTo for agent provenance. Records which tool/agent extracted data.', + status='mapped', + ), + FieldMapping( + source_path='profile_data.profile_image_url', + source_description='Profile photo URL', + target_class='PersonObservation', + target_slot='image_url', + typedb_entity='person-observation', + typedb_attribute='profile-image-url', + rdf_predicate='sdo:image', + transformation=TransformationType.DIRECT, + required=False, + notes='PiCo uses sdo:image for visual representation. LinkedIn CDN URL stored.', + status='mapped', + ), + ], + generated_classes=['PersonObservation', 'Affiliation'], + example_yaml=""" +# PiCo ontology alignment example +# HC PersonObservation → PiCo PersonObservation + +profile_data: + name: "Iris van Meer" # → sdo:name + headline: "Staff member at..." # → sdo:hasOccupation + location: "The Hague, Netherlands" # → sdo:address + profile_image_url: "https://..." # → sdo:image + +extraction_metadata: + linkedin_url: "https://linkedin.com/in/..." # → prov:hadPrimarySource + extraction_date: "2025-12-14T11:21:47Z" # → prov:generatedAtTime + extraction_agent: "claude-opus-4.5" # → prov:wasAttributedTo + +affiliations: + - role_title: "Archivist" # → pico:hasRole + """.strip(), + ), + + # ------------------------------------------------------------------------- + # PICO UNMAPPED - PiCo ontology properties intentionally OUT OF SCOPE + # ------------------------------------------------------------------------- + EnrichmentSourceMapping( + source_block='pico_unmapped', + description='PiCo ontology properties intentionally not mapped', + detailed_description=""" +Many PiCo properties are intentionally NOT mapped in the HC system. +This is a design decision, not a gap to be filled. + +**Why these properties are out of scope:** + +1. **Data source limitation**: LinkedIn profiles don't contain vital records + (birth dates, death dates, marriage records, baptism records). + +2. **Use case mismatch**: HC tracks heritage sector workforce, not genealogical + reconstruction. Family relationships aren't relevant for institutional + staff directories. + +3. **Privacy considerations**: Collecting personal biographical data about + living individuals raises GDPR concerns. Professional context is appropriate; + personal history is not. + +4. **Ontology purpose**: PiCo was designed for historical archives processing + (civil registration, notarial records). HC serves a different purpose. + +This documentation ensures transparency about the ontology alignment scope. + """.strip(), + linkml_class='PersonObservation', + typedb_entity='person-observation', + provenance=Provenance( + source_type='ontology_mapping', + data_tier=DataTier.TIER_1_AUTHORITATIVE, + ), + fields=[ + # Vital records - not available from LinkedIn + FieldMapping( + source_path=None, + source_description='Birth date', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='sdo:birthDate', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: LinkedIn does not provide birth dates. Historical vital records property.', + status='out_of_scope', + ), + FieldMapping( + source_path=None, + source_description='Death date', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='sdo:deathDate', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: LinkedIn profiles are for living professionals. Historical vital records property.', + status='out_of_scope', + ), + FieldMapping( + source_path=None, + source_description='Birth place', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='sdo:birthPlace', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: LinkedIn does not provide birth location. Use sdo:address for current location.', + status='out_of_scope', + ), + FieldMapping( + source_path=None, + source_description='Death place', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='sdo:deathPlace', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: LinkedIn profiles are for living professionals.', + status='out_of_scope', + ), + FieldMapping( + source_path=None, + source_description='Deceased flag', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='pico:deceased', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: HC tracks active professionals. Memorial profiles not in scope.', + status='out_of_scope', + ), + FieldMapping( + source_path=None, + source_description='Age', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='pico:hasAge', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: Age not available from LinkedIn. Privacy consideration for living individuals.', + status='out_of_scope', + ), + FieldMapping( + source_path=None, + source_description='Gender', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='sdo:gender', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: Gender not reliably extractable from LinkedIn. Privacy consideration.', + status='out_of_scope', + ), + FieldMapping( + source_path=None, + source_description='Religion', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='pico:hasReligion', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: Religious affiliation not available from LinkedIn. Privacy consideration.', + status='out_of_scope', + ), + # Structured name components - partial mapping + FieldMapping( + source_path=None, + source_description='Given name (first name)', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='sdo:givenName', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='PARTIAL: Could be extracted from full name, but not reliably for all cultures. Full name (sdo:name) is used instead.', + status='partial', + ), + FieldMapping( + source_path=None, + source_description='Family name (surname)', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='sdo:familyName', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='PARTIAL: Could be extracted from full name, but not reliably for all cultures. Full name (sdo:name) is used instead.', + status='partial', + ), + FieldMapping( + source_path=None, + source_description='Patronym', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='pnv:patronym', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: Patronymic names are historical/cultural. Not extractable from LinkedIn.', + status='out_of_scope', + ), + FieldMapping( + source_path=None, + source_description='Base surname', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='pnv:baseSurname', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: Genealogical name component. Not relevant for staff tracking.', + status='out_of_scope', + ), + FieldMapping( + source_path=None, + source_description='Surname prefix', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='pnv:surnamePrefix', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: Dutch tussenvoegsel (van, de, etc.) not separately tracked. Full name preserved.', + status='out_of_scope', + ), + FieldMapping( + source_path=None, + source_description='Initials', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='pnv:initials', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: Initials not separately extracted. Full name used.', + status='out_of_scope', + ), + # Family relationships - 40+ properties not mapped + FieldMapping( + source_path=None, + source_description='Parent relationship', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='sdo:parent', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: Family relationships not relevant for institutional staff tracking.', + status='out_of_scope', + ), + FieldMapping( + source_path=None, + source_description='Children relationship', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='sdo:children', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: Family relationships not relevant for institutional staff tracking.', + status='out_of_scope', + ), + FieldMapping( + source_path=None, + source_description='Spouse relationship', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='sdo:spouse', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: Family relationships not relevant for institutional staff tracking.', + status='out_of_scope', + ), + FieldMapping( + source_path=None, + source_description='Sibling relationship', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='sdo:sibling', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: Family relationships not relevant for institutional staff tracking.', + status='out_of_scope', + ), + FieldMapping( + source_path=None, + source_description='Extended family (40+ PiCo properties)', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='pico:has*', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: PiCo defines 40+ family relationship properties (grandparent, in-law, step-relations, cousins, etc.). None are mapped - HC tracks professional, not familial relationships.', + status='out_of_scope', + ), + # Archival source properties + FieldMapping( + source_path=None, + source_description='Archive component source', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='sdo:ArchiveComponent', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='OUT OF SCOPE: HC uses LinkedIn as source, not archival documents. Web claims serve similar provenance purpose.', + status='out_of_scope', + ), + # Reconstruction properties + FieldMapping( + source_path=None, + source_description='Person reconstruction aggregation', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='pico:PersonReconstruction', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='FUTURE: PersonReconstruction (aggregating multiple observations) not yet implemented. Currently each person has one LinkedIn-based observation.', + status='future', + ), + FieldMapping( + source_path=None, + source_description='Derived from relationship', + target_class=None, + target_slot=None, + typedb_entity='person-observation', + typedb_attribute=None, + rdf_predicate='prov:wasDerivedFrom', + transformation=TransformationType.NOT_MAPPED, + required=False, + notes='FUTURE: Cross-observation derivation not implemented. Would link reconstructed person to source observations.', + status='future', + ), + ], + generated_classes=['PersonObservation'], + example_yaml=""" +# PiCo properties NOT mapped in HC system + +# ❌ Vital records (not available from LinkedIn): +# - sdo:birthDate, sdo:deathDate +# - sdo:birthPlace, sdo:deathPlace +# - pico:deceased, pico:hasAge + +# ❌ Personal characteristics (privacy): +# - sdo:gender +# - pico:hasReligion + +# ❌ Genealogical name components: +# - pnv:patronym, pnv:baseSurname +# - pnv:surnamePrefix, pnv:initials +# (HC uses full sdo:name instead) + +# ❌ Family relationships (40+ properties): +# - sdo:parent, sdo:children, sdo:spouse, sdo:sibling +# - pico:hasGrandparent, pico:hasGrandchild +# - pico:hasParent-in-law, pico:hasSibling-in-law +# - pico:hasStepparent, pico:hasStepchild +# - pico:hasCousin, pico:hasUncle_Aunt +# - pico:hasFosterParent, pico:hasGodparent +# ... and many more + +# ⏳ Future consideration: +# - pico:PersonReconstruction (multi-source aggregation) +# - prov:wasDerivedFrom (observation linking) + """.strip(), + ), +] + + +# ============================================================================ +# HELPER FUNCTIONS +# ============================================================================ + +def get_mapping_for_source(source_block: str) -> Optional[EnrichmentSourceMapping]: + """Get the mapping for a specific source block.""" + for mapping in ENRICHMENT_MAPPINGS: + if mapping.source_block == source_block: + return mapping + return None + + +def get_fields_for_class(class_name: str) -> list[FieldMapping]: + """Get all field mappings that target a specific LinkML class.""" + fields = [] + for mapping in ENRICHMENT_MAPPINGS: + for field_mapping in mapping.fields: + if field_mapping.target_class == class_name: + fields.append(field_mapping) + return fields + + +def get_sources_for_class(class_name: str) -> list[str]: + """Get all source blocks that contribute to a specific LinkML class.""" + sources = [] + for mapping in ENRICHMENT_MAPPINGS: + if mapping.linkml_class == class_name: + sources.append(mapping.source_block) + else: + for field_mapping in mapping.fields: + if field_mapping.target_class == class_name and mapping.source_block not in sources: + sources.append(mapping.source_block) + return sources + + +def get_typedb_attribute(class_name: str, slot_name: str) -> Optional[str]: + """Get the TypeDB attribute name for a specific class/slot combination.""" + for mapping in ENRICHMENT_MAPPINGS: + for field_mapping in mapping.fields: + if field_mapping.target_class == class_name and field_mapping.target_slot == slot_name: + return field_mapping.typedb_attribute + return None + + +def get_rdf_predicate(class_name: str, slot_name: str) -> Optional[str]: + """Get the RDF predicate for a specific class/slot combination.""" + for mapping in ENRICHMENT_MAPPINGS: + for field_mapping in mapping.fields: + if field_mapping.target_class == class_name and field_mapping.target_slot == slot_name: + return field_mapping.rdf_predicate + return None + + +def get_category_for_source(source_block: str) -> Optional[MappingCategory]: + """Get the category that contains a specific source block.""" + for category in MAPPING_CATEGORIES: + if source_block in category.sources: + return category + return None + + +def get_transformation_types() -> list[TransformationType]: + """Get all available transformation types.""" + return list(TransformationType) + + +def get_person_mapping_for_source(source_block: str) -> Optional[EnrichmentSourceMapping]: + """Get the person mapping for a specific source block.""" + for mapping in PERSON_MAPPINGS: + if mapping.source_block == source_block: + return mapping + return None + + +def get_person_fields_for_class(class_name: str) -> list[FieldMapping]: + """Get all person field mappings that target a specific LinkML class.""" + fields = [] + for mapping in PERSON_MAPPINGS: + for field_mapping in mapping.fields: + if field_mapping.target_class == class_name: + fields.append(field_mapping) + return fields + + +def get_person_sources_for_class(class_name: str) -> list[str]: + """Get all person source blocks that contribute to a specific LinkML class.""" + sources = [] + for mapping in PERSON_MAPPINGS: + if mapping.linkml_class == class_name: + sources.append(mapping.source_block) + else: + for field_mapping in mapping.fields: + if field_mapping.target_class == class_name and mapping.source_block not in sources: + sources.append(mapping.source_block) + return sources + + +def get_person_category_for_source(source_block: str) -> Optional[MappingCategory]: + """Get the person category that contains a specific source block.""" + for category in PERSON_CATEGORIES: + if source_block in category.sources: + return category + return None + + +def get_mapping_statistics() -> dict: + """Get statistics about the custodian mappings.""" + total_fields = sum(len(m.fields) for m in ENRICHMENT_MAPPINGS) + required_fields = sum( + 1 for m in ENRICHMENT_MAPPINGS for f in m.fields if f.required + ) + classes = set() + for m in ENRICHMENT_MAPPINGS: + classes.add(m.linkml_class) + for f in m.fields: + if f.target_class: + classes.add(f.target_class) + + return { + 'total_source_blocks': len(ENRICHMENT_MAPPINGS), + 'total_categories': len(MAPPING_CATEGORIES), + 'total_fields': total_fields, + 'required_fields': required_fields, + 'unique_classes': len(classes), + 'classes': sorted(classes), + } + + +def get_person_mapping_statistics() -> dict: + """Get statistics about the person mappings.""" + total_fields = sum(len(m.fields) for m in PERSON_MAPPINGS) + required_fields = sum( + 1 for m in PERSON_MAPPINGS for f in m.fields if f.required + ) + classes = set() + for m in PERSON_MAPPINGS: + classes.add(m.linkml_class) + for f in m.fields: + if f.target_class: + classes.add(f.target_class) + + return { + 'total_source_blocks': len(PERSON_MAPPINGS), + 'total_categories': len(PERSON_CATEGORIES), + 'total_fields': total_fields, + 'required_fields': required_fields, + 'unique_classes': len(classes), + 'classes': sorted(classes), + } + + +def get_mappings_for_data_source(data_source: str) -> list[EnrichmentSourceMapping]: + """Get all mappings that use a specific data source type.""" + return [ + m for m in ENRICHMENT_MAPPINGS + if m.provenance.source_type == data_source + ] + + +def get_categories_for_data_source(data_source: str) -> list[MappingCategory]: + """Get all categories that contain mappings from a specific data source.""" + source_blocks = { + m.source_block for m in ENRICHMENT_MAPPINGS + if m.provenance.source_type == data_source + } + return [ + c for c in MAPPING_CATEGORIES + if any(s in source_blocks for s in c.sources) + ] + + +# ============================================================================ +# MODULE EXPORTS +# ============================================================================ + +__all__ = [ + # Enums + 'TransformationType', + 'MappingStatus', + 'DataTier', + # Dataclasses + 'FieldExample', + 'FieldValidation', + 'FieldMapping', + 'Provenance', + 'EnrichmentSourceMapping', + 'MappingCategory', + # Data + 'MAPPING_CATEGORIES', + 'ENRICHMENT_MAPPINGS', + 'PERSON_CATEGORIES', + 'PERSON_MAPPINGS', + # Functions + 'get_mapping_for_source', + 'get_fields_for_class', + 'get_sources_for_class', + 'get_typedb_attribute', + 'get_rdf_predicate', + 'get_category_for_source', + 'get_transformation_types', + 'get_person_mapping_for_source', + 'get_person_fields_for_class', + 'get_person_sources_for_class', + 'get_person_category_for_source', + 'get_mapping_statistics', + 'get_person_mapping_statistics', + 'get_mappings_for_data_source', + 'get_categories_for_data_source', +] diff --git a/scripts/sync/qdrant_sync.py b/scripts/sync/qdrant_sync.py index 6732f004ff..4a091a3939 100644 --- a/scripts/sync/qdrant_sync.py +++ b/scripts/sync/qdrant_sync.py @@ -179,14 +179,20 @@ def extract_metadata(data: dict[str, Any], filepath: Path) -> dict[str, Any]: metadata["country"] = loc["country"] if loc.get("city"): metadata["city"] = loc["city"] - if loc.get("region"): + # Use region_code (ISO 3166-2) for filtering, fallback to region name + if loc.get("region_code"): + metadata["region"] = loc["region_code"] # e.g., "NH" not "Noord-Holland" + elif loc.get("region"): metadata["region"] = loc["region"] elif location: if location.get("country"): metadata["country"] = location["country"] if location.get("city"): metadata["city"] = location["city"] - if location.get("region"): + # Use region_code (ISO 3166-2) for filtering, fallback to region name + if location.get("region_code"): + metadata["region"] = location["region_code"] # e.g., "NH" not "Noord-Holland" + elif location.get("region"): metadata["region"] = location["region"] # Country from GHCID