Bonjour,
Je vous propose ici un troisième sujet d’échange concernant les données tabulaires (et plus généralement les données partagées suivant un format texte).
Le premier sujet concernait l’amélioration de la qualité des jeux de données par la définition et le contrôle des relations entre champs qui se traduisait par l’ajout d’une nouvelle propriété « relationship » dans TableSchema ( sujet 3750 ). Vos retours étaient plutôt positifs sur l’intéret de l’ajout de cette
nouvelle propriété. La demande a été effectuée sur le site frictionless (issue #803) et est en attente de validation.
Le second sujet concernait le format d’échange des données tabulaires au travers d’un questionnement sur l’avenir du format CSV ( sujet 3946 ). Vous avez été nombreux à vous exprimer et il me reste à vous envoyer une synthèse (d’ici mi-mars).
Le troisième sujet concerne une proposition d’amélioration du niveau sémantique des données échangées qui permet également un référencement complet des données (voir ci-dessous et également le document de présentation).
Est-ce que ça vous semble intéressant, utile, simple à mettre en oeuvre ?
Est-ce que des réflexions de ce type ont déjà été engagées ?
Comment est-ce qu’un projet autour de ce sujet devrait être piloté ?
Merci d’avance pour vos remarques et retours !
0 - Principes
Aujourd’hui, le niveau niveau sémantique des données partagées reste peu élevé (bien souvent limité à des formats de base : nombre, chaînes de caractères). Ceci est du au faible typage des données des fichiers CSV (chaînes de caractères uniquement) et des données JSON (nombres, chaînes de caractères, ‹ array ›, ‹ object ›).
La proposition qui est faite consiste à ajouter aux données échangées un typage (facultatif) et un nommage (facultatif également).
Les entités ainsi construites (dénommées NTV pour named typed value) sont un triplet avec un élément obligatoire (la valeur au format JSON) et deux éléments optionnels (nom, type).
Par exemple, la localisation de Paris peut être représentée par :
- un nom: « Paris »,
- un type : les coordonnées d’un point selon le standard geoJSON,
- une valeur : [ 2.3522, 48.8566]
La façon la plus simple pour ajouter ces informations est d’utiliser un JSON-object avec un seul membre utilisant la syntaxe JSON-ND pour le premier terme du membre et la valeur au format JSON pour le second terme du membre.
Pour l’exemple ci-dessus, la représentation JSON est :
{ « paris:point » : [2.3522, 48.8566] }
Avec cette approche, on peut définir trois entités NTV:
- une entité primitive qui n’est composée d’aucune autre entité (NTV-single),
- deux entités structurées : une collection non ordonnée d’entités NTV (NTV-set) et une séquence ordonnée d’entités NTV (NTV-list).
ainsi que deux formats JSON :
- format simple lorsque le nom et le type ne sont pas présent (c’est le cas usuel des données CSV),
- format nommé lorsque le nom ou le type est présent (cf exemple ci-dessus pour une entité NTV-single).
Exemple d’une entité composée de deux autres entités:
- { « villes::point »: [[2.3522, 48.8566], [4.8357, 45.7640]] } pour une entité NTV-list
- { « villes::point »: {« paris »:[2.3522, 48.8566], « lyon »:[4.8357, 45.7640]}} pour une entité NTV-set
Nota : Cette syntaxe peut également être utilisée pour les entêtes de fichier CSV
1 - Structure
Le triplet NTV (nom, type, valeur) est représenté suivant un format JSON inspiré du projet de RFC JSON-ND :
- valeur (si nom et type ne sont pas documentés)
- { « nom » : valeur } (si le nom est documenté mais pas le type)
- { « :type » : valeur } pour les entités primitives et { « ::type » : valeur } pour les entités structurées (si le type est documenté mais pas le nom)
- { « nom:type » : valeur } pour les entités primitives et { « nom::type » : valeur } pour les entités structurées (si nom et type sont documentés).
Par ailleurs, le type intègre une notion d’espaces de noms
qui peuvent être imbriqués.
Par exemple, le type : « ns1.ns2.type » signifie que :
- ns1. est un espace de noms défini dans l’espace de noms global,
- ns2. est un espace de noms défini dans l’espace de noms ns1.,
- type est défini dans l’espace de noms ns2.
Cette structuration du type permet de référencer tout type de données.
2 - Exemples de représentations JSON
- NTV-single, format simple :
- « lyon »
- 52.5
- { }
- NTV-single, format nommé :
- { « paris:point » : [2.3522, 48.8566] }
- { « :point » : [4.8357, 45.7640] }
- { « city » : « paris » }
- NTV-list, format simple :
- [ [2.3522, 48.8566], {« lyon » : [4.8357, 45.7640]} ]
- [ { « :point » : [2.3522, 48.8566]}, {« :point » : [4.8357, 45.7640]} ]
- [ 4, 45 ]
- [ « paris » ]
- NTV-list, format nommé :
- { « villes::point » : [ [2.3522, 48.8566], [4.8357, 45.7640] ] }
- { « ::point » : [ [2.3522, 48.8566], {« lyon » : [4.8357, 45.7640]} ] }
- { « liste simple » : [ 4, 45.7 ] }
- { « date generique::dat » : [ « 2022-01-28T18-23-54Z », « 2022-01-28 », 1234.78 ] }
- NTV-set, format simple :
- { "nom”: « white », « prenom »: « walter », « surnom »: « heisenberg » }
- { « paris:point » : [2.3522, 48.8566] , « lyon » : « france » }
- { « paris » : [2.3522, 48.8566], « » : [4.8357, 45.7640] }
- NTV-set, format nommé :
- { « villes::point »: { « paris »: [2.352, 48.856], « lyon »: [4.835, 45.764]}}
- { « villes » : { « paris:point » : [2.3522, 48.8566] , « lyon » : « france »} }
- { « ville » : { « paris » : [2.3522, 48.8566] } }
3 - Typage des données
La structure des types par espace de noms permet d’avoir au niveau global des types correspondant aux standards reconnus.
Des types génériques peuvent également être définis (calcul du type exact lors du décodage de la valeur).
Par exemple, on pourrait avoir :
pour la datation (suivant ISO8601 et Posix) :
type (generic) | exemple de valeur |
---|---|
year | 1998 |
month | 10 |
day | 21 |
week | 38 |
hour | 20 |
minute | 18 |
second | 54 |
timeposix (dat) | 123456.78 |
date (dat) | “2022-01-28” |
time (dat) | “T18:23:54”, “18:23”, “T18” |
datetime (dat) | “2022-01-28T18-23-54Z” |
timearray (dat) | “2022-01-28T18-23-54+0400” |
timeslot (dat) | [date1, date2] |
pour la durée (suivant ISO8601 et Posix) :
type (generique) | exemple de valeur |
---|---|
timeinterval (dur) | « 2007-03-01T13:00:00Z/2008-05-11T15:30:00Z » |
durationiso (dur) | « P0002-10- 15T10:30:20 » |
durposix (dur) | 123456.78 |
pour la localisation (suivant RFC7946 et Open Location Code):
type (generique) | exemple de valeur |
---|---|
point (loc) | [ 5.12, 45.256 ] (lon, lat) |
line (loc) | [ point1, point2, point3 ] |
ring | [ point1, point2, point3 ] |
multiline | [ line1, line2, line3] |
polygon (loc) | [ ring1, ring2, ring3] |
multipolygon (loc) | [ poly1, poly2, poly3 ] |
bbox (loc) | [ -10.0, -10.0, 10.0, 10.0 ] |
geojson (loc) | {“type”: “point”, “coordinates”: [40.0, 0.0] } |
codeolc (loc) | “8FW4V75V+8F6” |
Pour les données tabulaires:
NTVtype | NTVvalue |
---|---|
row | JSON-array of JSON-NTV |
field | JSON-array of NTVvalue (following JSON-TAB format) |
table | JSON-array of NTVvalue of fields with the same length |
Pour les chaînes de caractères normalisées :
Le type pourrait être uri
, cf exemples :
- « https://www.ietf.org/rfc/rfc3986.txt »
- « Les filles du feu : introduction, Angélique, Sylvie (souvenirs du Valois), Jemmy, Octavie, Isis, Corilla, Emilie, [les chimères] (Nouv. éd.) / par Gérard de Nerval | Gallica »
- « urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6 »
- « ni:///sha-256;UyaQV-Ev4rdLoHyJJWCi11OHfrYv9E1aGQAlMO2X_-Q »
- « geo:13.4125,103.86673 » (RFC5870)
- « info:eu-repo/dai/nl/12345 »
- « mailto:[email protected] »
- « news:comp.infosystems.www.servers.unix »
- « urn:oasis:names:specification:docbook:dtd:xml:4.1.2 »
Des espaces de noms pourraient également être définis pour référencer par exemple :
- des entités géopolitiques : code pays ISO3166-1 (par exemple fr. pour la France)
- des catalogues de données, par exemple :
NTVtype | example JSON-NTV |
---|---|
schemaorg. | { “:schemaorg.propertyID”: “NO2” } { “:schemaorg.unitText”:”µg/m3”} |
darwincore. | { “:darwincore.acceptedNameUsage”: “Tamias minimus” } |
4 - Exemple d’utilisation d’un espace de noms fr.
Cet espace de noms est dédié au jeux de données associés à l’espace géopolitique France (voir également le document de présentation).
Un espace de noms définit :
- des identifiants utilisés pour accéder à des données complémentaires,
- des espaces de noms associés à des à des catalogues ou jeux de données,
- des entités structurées utilisées pour faciliter l’utilisation de données
4.1 - Identifiants
Ils pourraient correspondre à des identifiants utilisés dans de nombreux jeux de données référencés (via un schéma de données ou un modèle de données).
Par exemple :
type | définition | exemple |
---|---|---|
fr.reg | code région | 93 |
fr.dep | code département | 60 |
fr.com | code INSEE commune | 77284 |
fr.cp | code postal | 76450 |
fr.iris | code IRIS ilôt | 977010101 |
fr.sirenc | code SIREN commune | 217702737 |
fr.epci | code EPCI | 244301107 |
fr.arm | code arrondissement municipal | 842 |
fr.can | code canton | 8208 |
fr.ctcd | code collectivité territoriale | 6AE |
fr.cog | code officiel géographique COG | 99114 |
fr.cov | code zone covoiturage | 35238-C-012 |
fr.zfe | code ZFE | 200046977-ZFE-001 |
fr.bnls | code lieu stationnement | 04070-P-001 |
fr.uic | code UIC gare | 8757449 |
fr.iata | code IATA aéroport | CDG |
fr.naf | code NAF | 23 |
fr.siret | code SIRET enterprise | 41844736300015 |
fr.siren | code SIREN enterprise | 418447363 |
fr.fantoir | code FANTOIR voie | 4500023086F |
fr.parcel | code parcelle | 670010320165 |
fr.iua | code id adresse | 27115_0110_00017_bis |
fr.struc | code SP+ structure | 3Tn8gzTdcz |
fr.synop | code SYNOP station météo | 07130 |
fr.lcsqa | code LCSQA station mesure | FR01021 |
fr.uai | code UAI établissement | 0951099D |
fr.aca | code académies | 22 |
fr.circo | code circonscription | 69002 |
fr.finessej | code FINESS entité juridique | 790001606 |
fr.finesset | code FINESS établissement | 790010375 |
fr.rna | code WALDEC association | 843S0843004860 |
fr.spi | code SPI numéro fiscal | 1899582886173 |
fr.nir | code NIR sécurité sociale | 164026005705953 |
4.2 Espaces de noms
Les espaces de noms pourraient correspondre à des catalogues ou des jeux de données dont les types de données sont identifiés dans des modèles de données ou bien dans des schémas de données référencés.
Par exemple :
type | example JSON-NTV |
---|---|
fr.sandre. | { « :fr.sandre.CdStationHydro »: K163 3010 01 } { « :fr.sandre.TypStationHydro »: « standard » } |
fr.synop. | { « :fr.synop.numer_sta »: 07130 } { « :fr.synop.t »: 300, « :fr.synop.ff »: 5 } |
fr.IRVE. | { « :fr.IRVE.nom_station »: « M2026 » } { « :fr.IRVE.nom_operateur »: « DEBELEC » } |
fr.BAN. | { « :fr.BAN.numero »: 54 } { « :fr.BAN.lon »: 3.5124 } |
4.3 Entités
Elles pourraient correspondre à des assemblages de données associées à une structure définie.
Par exemple :
type | example JSON-NTV |
---|---|
fr.parcelle | {“maParcelle:fr.parcelle”: [ 84500, 0, I, 97]} (fr.cp, fr.cadastre.préfixe, fr.cadastre.section, fr.cadastre.numéro) |
fr.adresse | {“monAdresse:fr.adresse”: [ 54, bis, rue de la mairie, 78730 ] (fr.BAN.numero, fr.BAN.rep, fr.BAN.nom_voie, fr.cp) |