From 4c3329937e213d512108c8777512bd9d67086bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Jusevi=C4=8Dius?= Date: Sat, 25 Jul 2026 13:06:58 +0300 Subject: [PATCH] Show coat of arms as AdminUnit depiction consistently (P94 -> foaf:img) The frontpage AdminUnit grid picked images nondeterministically: reconciliation emitted both the coat of arms (Wikidata P94) and a scenery photo (P18) as foaf:depiction, and LDH's ac:image thumbnail selector renders only the first in DESCRIBE order, so some cards showed the coat of arms and others a photo. Model the coat of arms on foaf:img instead (rdfs:subPropertyOf foaf:depiction, "particularly representative"). LDH's ac:image ranks foaf:img > foaf:logo > foaf:depiction and renders the first, so the coat of arms now wins the card image deterministically while the photo stays a plain foaf:depiction on the entity page. Persons are unaffected (no P94 -> their portrait stays foaf:depiction). Also fix a latent bug in the image-liveness check surfaced while regenerating: Commons rate-limits liveness bursts with HTTP 429, which reachable() treated as "dead" and stripped live images en masse (10/518 reachable). It now retries 429/503 with backoff (honoring Retry-After) at gentler concurrency (518/518). Regenerated datasets/current/admin-units/alignments.trig: 171 foaf:img (coats of arms) + 374 foaf:depiction (photos) = the same 545 images as before, all live, now https (the committed URLs were stale http, which browsers won't render). Parses, round-trips base-independently, SHACL conforms. Co-Authored-By: Claude Opus 4.8 (1M context) --- CLAUDE.md | 26 +- app/root.ttl | 7 +- datasets/current/admin-units/alignments.trig | 4953 +++++++++--------- etl/tools/src/ltlod_etl/images.py | 47 +- etl/tools/src/ltlod_etl/reconcile.py | 34 +- 5 files changed, 2561 insertions(+), 2506 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 222d19d..b51bf35 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -73,15 +73,23 @@ Post-ETL: `ltlod-reconcile` matches entities to Wikidata (closed candidate sets via WDQS, exact label + parent disambiguation) and writes `owl:sameAs` + images into per-domain `alignments.trig` (same graph names as the entity docs, so they merge on load). Unmatched entities go to `cache/unmatched*.csv`, never force-matched. -Emitted image URLs (`foaf:depiction` from P94/P18, `schema:logo` from P154; and -the lrs.lt portraits from the photos scraper) are https-normalized (WDQS returns -http:// Commons URIs, which GitHub/browsers won't render) and HTTP-liveness-checked -via `ltlod_etl.images` — dead depictions/logos are skipped so they never enter the -data (`--no-image-check` disables the check for offline/CI runs). Note reconciled -entities can carry several depictions (e.g. a municipality's P94 coat of arms *and* -a P18 photo); showcase queries that render one image per row must collapse the -multivalued `foaf:depiction` (filter to one source, or `GROUP BY` + `SAMPLE`) — -plain `SELECT DISTINCT` won't, since the rows differ in the image cell. +Emitted image URLs (the coat of arms P94 → `foaf:img`, other photos P18 → +`foaf:depiction`, `schema:logo` from P154; and the lrs.lt portraits from the photos +scraper → `foaf:depiction`) are https-normalized (WDQS returns http:// Commons URIs, +which GitHub/browsers won't render) and HTTP-liveness-checked via `ltlod_etl.images` +— dead images are skipped so they never enter the data (`--no-image-check` disables +the check for offline/CI runs). The liveness check **retries 429/503** with backoff +(Commons rate-limits liveness bursts; a naive check treats the 429 as "dead" and +strips live images en masse). **P94 goes on `foaf:img`, not `foaf:depiction`, +deliberately**: `foaf:img` is `rdfs:subPropertyOf foaf:depiction` ("particularly +representative"), and LDH's `ac:image` thumbnail selector ranks `foaf:img` > +`foaf:logo` > `foaf:depiction`, picking only the first — so grid/card views (e.g. +the frontpage AdminUnit grid) show the coat of arms deterministically, while the +scenery photo stays a plain `foaf:depiction` on the entity page. Persons have no +coat of arms but can still carry several `foaf:depiction` (P18 *and* the scraped +lrs.lt portrait); showcase queries that render one image per row must collapse that +(filter to one source, or `GROUP BY` + `SAMPLE`) — plain `SELECT DISTINCT` won't, +since the rows differ in the image cell. ## Conventions (load-bearing) diff --git a/app/root.ttl b/app/root.ttl index 18d2a5b..d140061 100644 --- a/app/root.ttl +++ b/app/root.ttl @@ -52,8 +52,11 @@ PREFIX atu: PREFIX skos: # Top-level admin units = counties (apskritys), identified by EU ATU level LTU_APS. -# LDH DESCRIBEs each ?unit; GridMode renders it as a card with its foaf:depiction -# (coat of arms). Project a single entity type only. +# LDH DESCRIBEs each ?unit; GridMode renders it as a card with one image. The SELECT +# can't pick which (it's DESCRIBE-wrapped, and LDH's ac:image shows the single most +# representative image) — so reconciliation puts the coat of arms (P94) on foaf:img +# (which outranks foaf:depiction) and any scenery photo (P18) on foaf:depiction, +# giving every card a coat of arms deterministically. Project a single entity type. SELECT DISTINCT ?unit FROM WHERE diff --git a/datasets/current/admin-units/alignments.trig b/datasets/current/admin-units/alignments.trig index 3081380..1c4a974 100644 --- a/datasets/current/admin-units/alignments.trig +++ b/datasets/current/admin-units/alignments.trig @@ -1,165 +1,188 @@ PREFIX foaf: PREFIX owl: +PREFIX skos: - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . +} + + { + + owl:sameAs . } { owl:sameAs ; - foaf:depiction ; - foaf:depiction . + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } { owl:sameAs ; - foaf:depiction ; - foaf:depiction . + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . +} + + { + + owl:sameAs . +} + + { + + owl:sameAs . } { owl:sameAs ; - foaf:depiction ; - foaf:depiction . + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . +} + + { + + owl:sameAs . +} + + { + + owl:sameAs . } { @@ -167,3591 +190,3579 @@ PREFIX owl: owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . +} + + { + + owl:sameAs ; + foaf:depiction . +} + + { + + owl:sameAs ; + foaf:img . } { owl:sameAs ; - foaf:depiction . + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . -} - - { - - owl:sameAs ; - foaf:depiction . -} - - { - - owl:sameAs ; - foaf:depiction . -} - - { - - owl:sameAs . -} - - { - - owl:sameAs . -} - - { - - owl:sameAs . -} - - { - - owl:sameAs ; - foaf:depiction . -} - - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . -} - - { - - owl:sameAs . -} - - { - - owl:sameAs . -} - - { - - owl:sameAs ; - foaf:depiction . -} - - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + skos:exactMatch ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } { - owl:sameAs ; - foaf:depiction . -} - - { - - owl:sameAs ; - foaf:depiction . + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } { owl:sameAs ; - foaf:depiction ; - foaf:depiction . + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + skos:exactMatch ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } { - owl:sameAs ; - foaf:depiction . + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . +} + + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - + { + owl:sameAs ; - foaf:depiction . + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - - { - - owl:sameAs ; - foaf:depiction . + + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + skos:exactMatch ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + skos:exactMatch ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + skos:exactMatch ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + skos:exactMatch ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } { - owl:sameAs ; - foaf:depiction . + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . +} + + { + + owl:sameAs ; + foaf:depiction . +} + + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . +} + + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + skos:exactMatch ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + skos:exactMatch ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + skos:exactMatch ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . +} + + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + skos:exactMatch ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:depiction ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } - { - - owl:sameAs . + { + + owl:sameAs ; + foaf:img . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs . } - { - - owl:sameAs ; - foaf:depiction . + { + + owl:sameAs ; + foaf:depiction . } diff --git a/etl/tools/src/ltlod_etl/images.py b/etl/tools/src/ltlod_etl/images.py index d5d9d93..3f2966a 100644 --- a/etl/tools/src/ltlod_etl/images.py +++ b/etl/tools/src/ltlod_etl/images.py @@ -14,6 +14,7 @@ from __future__ import annotations import sys +import time from concurrent.futures import ThreadPoolExecutor import httpx @@ -27,6 +28,11 @@ # Status codes that mean "HEAD unsupported here" — retry once with a ranged GET. _HEAD_UNSUPPORTED = frozenset({403, 405, 501}) +# Transient throttling — Commons' Special:FilePath answers bursts with these; they +# say "slow down", not "gone", so back off and retry instead of dropping the image. +_TRANSIENT = frozenset({429, 503}) +_MAX_ATTEMPTS = 5 + def to_https(url: str) -> str: """Upgrade http:// Wikimedia URLs to https://. @@ -41,23 +47,36 @@ def to_https(url: str) -> str: def reachable(url: str) -> bool: - """True if the URL resolves to a non-error status (following redirects).""" - for method in ("HEAD", "GET"): - try: - resp = _client.request( - method, url, - headers={"Range": "bytes=0-0"} if method == "GET" else {}, - ) - except httpx.HTTPError: - return False - if resp.status_code < 400: - return True - if resp.status_code not in _HEAD_UNSUPPORTED: - return False + """True if the URL resolves to a non-error status (following redirects). + + Retries on transient throttling (429/503): Commons rate-limits liveness bursts, + and treating a 429 as "dead" wrongly strips images that are actually live. Backs + off (honoring ``Retry-After`` when given) before each retry. + """ + for attempt in range(_MAX_ATTEMPTS): + resp = None + for method in ("HEAD", "GET"): + try: + resp = _client.request( + method, url, + headers={"Range": "bytes=0-0"} if method == "GET" else {}, + ) + except httpx.HTTPError: + return False + if resp.status_code < 400: + return True + if resp.status_code not in _HEAD_UNSUPPORTED: + break # HEAD's verdict is authoritative; no point retrying with GET + if resp is not None and resp.status_code in _TRANSIENT and attempt < _MAX_ATTEMPTS - 1: + retry_after = resp.headers.get("Retry-After", "") + delay = float(retry_after) if retry_after.isdigit() else 2.0 ** attempt + time.sleep(min(delay, 30.0)) + continue + return False return False -def live_images(urls, *, workers: int = 16) -> set[str]: +def live_images(urls, *, workers: int = 8) -> set[str]: """Return the reachable subset of ``urls``; log each dropped URL to stderr.""" unique = sorted({str(u) for u in urls}) if not unique: diff --git a/etl/tools/src/ltlod_etl/reconcile.py b/etl/tools/src/ltlod_etl/reconcile.py index b40ce48..d53c81f 100644 --- a/etl/tools/src/ltlod_etl/reconcile.py +++ b/etl/tools/src/ltlod_etl/reconcile.py @@ -101,12 +101,14 @@ def index_candidates(rows: list[dict]) -> dict[str, list[dict]]: for row in rows: item = row["item"] cand = seen.setdefault(item, {"item": item, "label": row["label"], "parents": set(), - "images": set(), "logos": set(), "nuts": set()}) + "coas": set(), "images": set(), "logos": set(), "nuts": set()}) if row.get("parent"): cand["parents"].add(row["parent"]) if row.get("nuts"): cand["nuts"].add(row["nuts"]) - for key, bucket in (("coa", "images"), ("img", "images"), ("logo", "logos")): + # Keep coats of arms (P94) apart from photos (P18): the coat of arms is the + # unit's representative image (foaf:img) and must win the grid/card thumbnail. + for key, bucket in (("coa", "coas"), ("img", "images"), ("logo", "logos")): if row.get(key): cand[bucket].add(row[key]) for cand in seen.values(): @@ -193,20 +195,32 @@ def admin_units(args: argparse.Namespace) -> None: def write_alignments(matches: list[tuple[dict, dict]], output: str, check_images: bool = True) -> None: # Normalize Commons image URLs to https, then (unless disabled) drop any that - # don't resolve — a dead foaf:depiction/schema:logo renders as a broken image - # downstream. Batch-check the whole set once so each URL is pinged only once. + # don't resolve — a dead foaf:img/foaf:depiction/schema:logo renders as a broken + # image downstream. Batch-check the whole set once so each URL is pinged only once. all_images = {images.to_https(url) - for _, cand in matches for url in (cand["images"] | cand["logos"])} + for _, cand in matches + for url in (cand["coas"] | cand["images"] | cand["logos"])} live = images.live_images(all_images) if check_images else all_images ds = Dataset() for unit, cand in matches: g = ds.graph(unit["doc"]) g.add((unit["entity"], OWL.sameAs, URIRef(cand["item"]))) - for img in sorted(images.to_https(url) for url in cand["images"]): - if img in live: - g.add((unit["entity"], FOAF.depiction, URIRef(img))) - for logo in sorted(images.to_https(url) for url in cand["logos"]): + + coas = [u for u in (images.to_https(url) for url in sorted(cand["coas"])) if u in live] + photos = [u for u in (images.to_https(url) for url in sorted(cand["images"])) if u in live] + # The coat of arms (P94) is the unit's *representative* image, so it goes on + # foaf:img (rdfs:subPropertyOf foaf:depiction — "particularly representative"); + # a scenery photo (P18) is an ordinary foaf:depiction. LDH's ac:image thumbnail + # selector ranks foaf:img above foaf:depiction, so a unit's grid/card image is + # deterministically the coat of arms, while the photo still renders on the + # entity page. Entities with no coat of arms (e.g. persons) just get their + # photo as foaf:depiction. + for img in coas: + g.add((unit["entity"], FOAF.img, URIRef(img))) + for img in photos: + g.add((unit["entity"], FOAF.depiction, URIRef(img))) + for logo in (images.to_https(url) for url in sorted(cand["logos"])): if logo in live: g.add((unit["entity"], SCHEMA.logo, URIRef(logo))) # NUTS3 code (Wikidata P605) as an exact match to the EU authority table; @@ -219,7 +233,7 @@ def write_alignments(matches: list[tuple[dict, dict]], output: str, def report(matches: list, unmatched: list[dict], report_path: str | None) -> None: total = len(matches) + len(unmatched) print(f"reconciled {len(matches)}/{total} entities " - f"({sum(1 for _, c in matches if c['images'] or c['logos'])} with images)", + f"({sum(1 for _, c in matches if c['coas'] or c['images'] or c['logos'])} with images)", file=sys.stderr) if report_path and unmatched: with open(report_path, "w", newline="") as f: