A proof-of-concept web app for semantic dataset discovery + schema harmonisation, powered by the I14Y Interoperability Platform and the Valentine schema-matching library.
Upload one or more datasets (CSV or XML) and ask a question.
The backend searches the I14Y public API and returns the 3 most relevant datasets ranked by semantic relevance.
Sample question 1 — Population statistics
Uploadtest_data/test_bevoelkerungsbilanz_bl.csvand ask:
"Ich habe Gemeindestatistiken mit Geburten, Todesfällen und Wanderungsbewegungen. Gibt es auf I14Y vergleichbare kantonale Bevölkerungsdaten?"
→ Matches dataset Bilanz der Wohnbevölkerung nach Gemeinde und Jahr
Sample question 2 — CO₂ emissions
Uploadtest_data/test_co2_personenwagen.csvand ask:
"Wir erfassen CO2-Werte und Leergewichte von neuzugelassenen Personenwagen. Welche Bundesdaten auf I14Y decken Emissionsvorschriften für Fahrzeuge ab?"
→ Matches dataset Vollzugsresultate der CO2-Emissionsvorschriften für Personenwagen (UUID19748db3-8bfb-48ad-8206-8fbde648afb7)
Sample question 3 — School statistics by sex
Uploadtest_data/test_lernende_bl.csvand ask:
"Wir erfassen Schülerzahlen nach Schulstufe und Geschlecht im Kanton Basel-Landschaft. Gibt es auf I14Y vergleichbare Daten?"
→ Matches dataset Lernende an Baselbieter Schulen nach Schulstufe und Geschlecht (UUID6d07cca7-f55a-4971-a713-0f0d4e4ea7f3)
Expected mapping:sex→geschlecht,sex_code→geschlecht_code,jahr→jahr(exact),schulstufe→schulstufe_grob,anzahl_lernende→wert
Click Compare schemas on any search result.
The backend:
- Fetches the I14Y dataset (download URL or JSON-LD structure)
- Runs Valentine
JaccardDistanceMatcherbetween your uploaded dataset and the I14Y dataset - Enriches scores with I14Y concept lookups:
- Same concept → score overridden to
1.0(★concept_verified) - Same concept type → score boosted ×1.2
- Conflicting concept types → score penalised ×0.5
- Same concept → score overridden to
- Classifies each column pair as
exact_match,close_match, orincompatible
Results show a compatibility score, stats, and a colour-coded column-by-column table.
Download a ZIP containing:
| File | Purpose |
|---|---|
mapping_table.csv |
Field-level concept mappings — compatible with I14Y upload format |
transformation_recipe.json |
Full transformation plan with actions (rename, transform, skip) and I14Y concept IDs |
poc/
├── backend/
│ ├── app.py Flask app (serves frontend + API)
│ ├── requirements.txt
│ └── services/
│ ├── i14y_service.py I14Y public API wrapper
│ ├── valentine_service.py Valentine + I14Y hybrid scoring
│ └── export_service.py ZIP export generator
└── frontend/
├── index.html Single-page chat UI (Open WebUI inspired)
├── style.css Dark theme, CSS variables
└── app.js All client-side logic
Backend endpoints:
| Method | Path | Description |
|---|---|---|
POST |
/api/upload |
Upload CSV / XML files into a session |
POST |
/api/search |
Semantic I14Y dataset search |
POST |
/api/compare |
Valentine + I14Y schema matching |
GET |
/api/export/<session_id> |
Download transformation ZIP |
cd poc/backend
python -m venv .venv
# Windows
.venv\Scripts\activate
# macOS / Linux
source .venv/bin/activatepip install -r requirements.txtNote: Valentine requires
numpy<2. Therequirements.txtalready pins this.
If you see a NumPy ABI warning, runpip install "numpy<2"explicitly and restart.
python app.pyThe app will be available at http://localhost:5000.
- Click the attachment button (📎) and upload
../data/businesses.csv - Type: "Do other cantonal business registries exist on I14Y?"
- Hit Enter — the app will search I14Y and show up to 3 results
- Click Compare schemas on any result
- Review the compatibility score and column-level match table
- Click Download transformation_export.zip to get the mapping table + recipe
The ../data/ folder (from the hackathon repo) contains:
| File | Description |
|---|---|
businesses.csv |
Synthetic cantonal business registry (UID, legal form, NOGA, …) |
patients.xml |
Synthetic SpiGes hospital cases |
insurance.csv |
Synthetic insurance claims (partial overlap with SpiGes) |
- Sessions are stored in-memory — restarting the server clears all sessions
- I14Y datasets without a
downloadUrlare matched on column names from the JSON-LD structure only - Valentine
JaccardDistanceMatcheris purely name-based (no embedding / ML); swap forSimilarityFloodingorCupidfor higher recall - No authentication — uses I14Y public endpoints only