MTES-MCT / metadata-postgresql

Plume : gestion des métadonnées du patrimoine PostgreSQL
https://mtes-mct.github.io/metadata-postgresql/
GNU Affero General Public License v3.0
1 stars 1 forks source link

Liens hypertextes de l'Insee qui retournent une erreur 404 #186

Open WREATCHED opened 9 months ago

WREATCHED commented 9 months ago

Contexte Plume autorise la saisie de lien hypertexte au travers de listes déroulantes, elles-mêmes générées par des thésaurus.

Un exemple Je choisis dans un groupe de valeur ‘Thèmes’ le thésaurus Commune française (INSEE) et une valeur dans liste déroulante ‘Ain’ L’url de l’insee retourne une erreur 404 dans le navigateur.

alhyss commented 9 months ago

Visiblement la syntaxe pour consulter les objets du registre de l'INSEE a encore changé... Nous avions déjà dû modifier les URL il y a quelques mois - cf. issue #152.

Par exemple, pour l'URI http://id.insee.fr/geo/commune/01006, l'équivalent de https://rdf.insee.fr/sparql/describe?uri=http%3A//id.insee.fr/geo/commune/01006 est maintenant http://rdf.insee.fr/sparql/?query=DESCRIBE%20%3Chttp://id.insee.fr/geo/commune/01006%3E - soit la forme encodée de http://rdf.insee.fr/sparql/?query=DESCRIBE <URI de l'objet>. Mais le résultat est aussi de moins en moins lisible...

En alternative, j'envisagerais bien d'utiliser pour les hyperliens le vocabulaire des communes de France sur le registre Loterre (projet du CNRS). Il a l'intérêt de faire la correspondance avec les autres vocabulaires de référence sur le sujet, dont celui de l'INSEE. Il s'agirait soit de pointer directement sur ce registre, soit d'utiliser les pages Wikipédia qu'il référence.

NB1 : Utiliser les requêtes SPARQL DESCRIBE sur le registre de l'INSEE permettrait au moins d'éviter les erreurs 404. Cette solution au moins devrait être mise en oeuvre dès la prochaine version, avant qu'une version ultérieure ne référence des URL alternatives apportant des informations plus exploitables.

NB2 : Les URI formées à partir du code INSEE ont un alias dont la partie identifiante est un UUID, et lancer la requête DESCRIBE sur ceux-là semble apporter davantage d'informations, notamment les libellés des communes. Exemple pour la commune d'Ambléon (01006).

alhyss commented 9 months ago

Le commit ci-avant a remplacé les URL https://rdf.insee.fr/sparql/describe?uri={URI de l'objet} par des URL http://rdf.insee.fr/sparql/?query=DESCRIBE <{URI de l'objet}> , ce qui les rend de nouveau fonctionnelles.

Pour mémoire, commandes exécutées :

from urllib.parse import quote
from plume.rdf.namespaces import FOAF, RDF, SKOS
from plume.rdf.rdflib import URIRef
from plume.rdf.utils import graph_from_file, abspath

for vocabulary in ('insee_department', 'insee_commune', 'insee_region', 'insee_individual_territories'):
    g = graph_from_file(abspath(f'rdf/data/vocabularies/{vocabulary}.ttl'), format='turtle')
    for s, o in g.subject_objects(FOAF.page):
        if str(o).startswith('https://rdf.insee.fr/sparql/describe?uri='):
            h = g.remove((s, FOAF.page, o))
            h = g.add(
                (
                    s,
                    FOAF.page, 
                    URIRef('https://rdf.insee.fr/sparql/?query={}'.format(quote(f'DESCRIBE <{str(s)}>')))
                )
            )
    with open(abspath(f'rdf/data/vocabularies/{vocabulary}.ttl'), 'wb') as dest:
        dest.write(g.serialize(encoding='utf-8'))
alhyss commented 9 months ago

Les URI synonymes basées sur des UUID étaient intégrées aux vocabulaires pour les régions et départements, donc je les ai utilisées pour créer des liens un peu plus informatifs, même si la présentation de l'information reste peu accessible.

Commandes exécutées, pour mémoire :

from urllib.parse import quote
from plume.rdf.namespaces import FOAF, RDF, SKOS
from plume.rdf.rdflib import URIRef
from plume.rdf.utils import graph_from_file, abspath

for vocabulary in ('insee_department', 'insee_region'):
    g = graph_from_file(abspath(f'rdf/data/vocabularies/{vocabulary}.ttl'), format='turtle')
    for s, o in g.subject_objects(FOAF.page):
        a = g.value(s, SKOS.exactMatch)
        if a and str(o).startswith('https://rdf.insee.fr/sparql/?query='):
            h = g.remove((s, FOAF.page, o))
            h = g.add(
                (
                    s,
                    FOAF.page, 
                    URIRef('https://rdf.insee.fr/sparql/?query={}'.format(quote(f'DESCRIBE <{str(a)}>')))
                )
            )
    with open(abspath(f'rdf/data/vocabularies/{vocabulary}.ttl'), 'wb') as dest:
        dest.write(g.serialize(encoding='utf-8'))

Ce n'est pas fait pour les communes à ce stade, car les URI synonymes n'avaient pas été inclus dans le fichier turtle pour limiter la taille de ce dernier.