Two independent problems in the Eurostat catalogue, sharing one root cause: portals.json sets dataflow_params = {"detail": "allstubs", "references": "none"}, so everything except Name is discarded at the wire.
They are separately shippable and have very different costs — part 1 needs no extra fetch at all.
Part 1 — $DV_ entries inflate the catalogue
546 of 8,246 Eurostat catalogue entries carry a $DV_ suffix in their ID. Sampling ISOC_CI_AC_I$DV_645 at detail=full:
DISSEMINATION_OBJECT_TYPE = EXTRACTION (PRC_HICP_MIDX has DATASET)
DISSEMINATION_EXTRACTION_TYPE = BOOKMARK
DISSEMINATION_PARENT_ID = ISOC_CI_AC_I
<Ref id="ISOC_CI_AC_I"> same DSD as the parent
no <c:Description> only the parent has one
These are saved extractions/bookmarks, not distinct datasets, and they duplicate their parent's title. Individuals - internet activities appears 6 times, Business demography by size class and NACE Rev. 2 activity 5 times.
Effect on title ambiguity:
| catalogue |
dataflows |
ambiguous titles |
| as-is |
8,246 |
1,120 (14%) |
excluding $DV_ |
7,700 |
148 (1.9%) |
So Eurostat's apparent title problem is almost entirely these entries — the underlying catalogue is healthy. This fix needs no detail=full: the $DV_ pattern is already visible in the cached df_id.
Evidence level: 546 identified by ID pattern; one entry verified via annotations.
Open question, worth resolving before implementing: is $DV_ visibility a consequence of detail=allstubs, or does the API expose a parameter to exclude extractions server-side? The latter would be the clean fix. Filtering on DISSEMINATION_OBJECT_TYPE is the robust client-side option but requires detail=full.
Part 2 — the dataflow Description is stripped
PRC_HICP_MIDX, references=none:
|
payload |
<c:Description> |
detail=full |
7,276 B |
present, EN/DE/FR |
detail=allstubs |
995 B |
absent |
The text carries information that is not in the title:
The Harmonised Index of Consumer Prices (HICP) measures price changes of various consumer goods and services over time (inflation). […] Please note that this dataset is discontinued and replaced by dataset prc_hicp_minr
This is content for retrieval, not a fix for ambiguity — that is Part 1.
Second, provider-independent cause: even with allstubs removed, the field would still be ignored. df_description is populated by get_name_by_lang() (discovery.py:129), which reads Name — the title. The only Description reader in the package is categories.py:92, for category schemes. Both changes are needed.
Bonus: this same fetch unblocks #9. That issue is trying to infer the ESMS metadata URL from the dataflow ID and finding no reliable pattern. There is no need to guess — detail=full includes it verbatim:
<c:AnnotationType>ESMS_HTML</c:AnnotationType>
<c:AnnotationURL>https://ec.europa.eu/eurostat/cache/metadata/en/prc_hicp_esms.htm</c:AnnotationURL>
Open questions
- Cost of
detail=full at catalogue scale is unmeasured: 7.3× payload on a single dataflow, unknown on 8,246. Measure before choosing lazy-per-dataflow vs bulk at catalogue build.
- Descriptions are HTML and need stripping before indexing.
- Comext shares the same
dataflow_params; it has only 9 dataflows, so likely moot, but worth confirming.
Scope note
The ISTAT catalogue needs neither of these — no $DV_ equivalent, and Description is present on 26 of 4,884 dataflows. Its descriptions come from a different endpoint entirely. Each catalogue imposes its own strategy, which argues for per-provider hooks rather than branching in shared code — see #41.
Two independent problems in the Eurostat catalogue, sharing one root cause:
portals.jsonsetsdataflow_params = {"detail": "allstubs", "references": "none"}, so everything exceptNameis discarded at the wire.They are separately shippable and have very different costs — part 1 needs no extra fetch at all.
Part 1 —
$DV_entries inflate the catalogue546 of 8,246 Eurostat catalogue entries carry a
$DV_suffix in their ID. SamplingISOC_CI_AC_I$DV_645atdetail=full:These are saved extractions/bookmarks, not distinct datasets, and they duplicate their parent's title.
Individuals - internet activitiesappears 6 times,Business demography by size class and NACE Rev. 2 activity5 times.Effect on title ambiguity:
$DV_So Eurostat's apparent title problem is almost entirely these entries — the underlying catalogue is healthy. This fix needs no
detail=full: the$DV_pattern is already visible in the cacheddf_id.Evidence level: 546 identified by ID pattern; one entry verified via annotations.
Open question, worth resolving before implementing: is
$DV_visibility a consequence ofdetail=allstubs, or does the API expose a parameter to exclude extractions server-side? The latter would be the clean fix. Filtering onDISSEMINATION_OBJECT_TYPEis the robust client-side option but requiresdetail=full.Part 2 — the dataflow
Descriptionis strippedPRC_HICP_MIDX,references=none:<c:Description>detail=fulldetail=allstubsThe text carries information that is not in the title:
This is content for retrieval, not a fix for ambiguity — that is Part 1.
Second, provider-independent cause: even with
allstubsremoved, the field would still be ignored.df_descriptionis populated byget_name_by_lang()(discovery.py:129), which readsName— the title. The onlyDescriptionreader in the package iscategories.py:92, for category schemes. Both changes are needed.Bonus: this same fetch unblocks #9. That issue is trying to infer the ESMS metadata URL from the dataflow ID and finding no reliable pattern. There is no need to guess —
detail=fullincludes it verbatim:Open questions
detail=fullat catalogue scale is unmeasured: 7.3× payload on a single dataflow, unknown on 8,246. Measure before choosing lazy-per-dataflow vs bulk at catalogue build.dataflow_params; it has only 9 dataflows, so likely moot, but worth confirming.Scope note
The ISTAT catalogue needs neither of these — no
$DV_equivalent, andDescriptionis present on 26 of 4,884 dataflows. Its descriptions come from a different endpoint entirely. Each catalogue imposes its own strategy, which argues for per-provider hooks rather than branching in shared code — see #41.