Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Intégration de plusieurs référentiels et de leurs correspondances #318

Open
AJambon opened this issue Apr 1, 2022 · 12 comments
Open

Comments

@AJambon
Copy link

AJambon commented Apr 1, 2022

Bien le bonjour !

Je me permets d'ouvrir ce ticket pour la problématique suivante : pouvoir alimenter taxhub avec plusieurs référentiels, créer/éditer les correspondances, envoyer ces correspondances dans GeoNature.

Exemples d'utilisation :
La LPO récupère aujourd'hui les données des plateformes faune dans GeoNature.
Souci : le référentiel utilisé par ces plateformes n'est pas TaxRef.

Pour éviter un effet "boite noire", l'idéal serait que les correspondances soient éditables par les utilisateurs.
Ce que j'imagine très grossièrement :
image

Là j'en parle dans le cadre de la LPO mais ça pourrait être utilisé pour des instances étrangères, multi-langues, multi-sources de données.

J'ai vu la discussion dans le ticket #309, j'ai l'impression que la fonctionnalité des attributs pourrait aider au moins dans un premier temps ?

Des avis ou d'autres choses en cours sur la question ?

Merci !

@camillemonchicourt
Copy link
Member

Salut, on avait déjà étudié la possibilité de remplacer le référentiel Taxref par un autre référentiel en en gardant la même structure (PnX-SI/GeoNature#164) et ça fonctionnait bien pour WORMS ou le BACKBONE du GBIF.

Par contre pour gérer plusieurs référentiels et leurs correspondances, il faudrait ajouter des tables.

A voir quand même si dans ce cas, on ne raccroche les données qu'à Taxref et qu'on veut juste avoir les correspondances avec d'autres référentiels pour faire des exports, ou si on veut pouvoir utiliser ces différents référentiels aussi dans GeoNature en saisie et en requête ?

@AJambon
Copy link
Author

AJambon commented Apr 4, 2022

Yes le besoin est surtout sur les correspondances dans ce cas là :)

L'idée pour le moment est de raccrocher les données qu'à TaxRef pour avoir des données cohérentes dans GN avec un seul référentiel.

@orovellotti
Copy link

Bonjour a tous
Je me permet de rafraichir cette issue.

On a un utilisateur intéressé par l'écosystème mais c'est un jardin botanique (de renom lol)
Il a des par terre de différentes bioregion du monde et donc pas de correspondance avec taxref.
Il serait dommage de ne pas lui offrir une solution?

GBif Backbone ou liste a ajout ? @amandine-sahl

@camillemonchicourt
Copy link
Member

Pas de projet prévu ou financé sur le sujet. Mais toute contribution est bienvenue.

En l'état et sans développement, il me semble qu'il est possible de remplacer le référentiel Taxref par un autre qui aurait une structure similaire.
C'est d'ailleurs ce qu'on a fait avec ce temps où l'on a intégré le backbone du GBIF dans la table Taxref sans faire de changements de structure de BDD et donc sans développements : https://si.ecrins-parcnational.com/blog/2019-05-geonature-atlas-gbif-jamaica.html

A vérifier, tester, et voir si ça tient niveaux performances.
Sinon il est aussi possible de prendre que la partie utile du backbone ou autre du genre.

Il est aussi possible en l'état de garder Taxref et d'y ajouter d'autres taxons ou un autre référentiel, en plus.

Ce qui n'est pas possible actuellement au niveau du modèle de données est d'avoir plusieurs référentiels avec des correspondances entre eux. Pour avoir des correspondances entre taxons de différents référentiels, il faudrait ajouter une table des référentiels et une table de correspondances entre taxons de différentes nomenclatures. Comme on a dans Habref il me semble.

Mais je ne pense pas que le besoin concerne les correspondances entre taxons de différents référentiels, mais plutôt d'avoir d'autres référentiels que Taxref, ce qui en l'état me semble possible.

@orovellotti
Copy link

On ne trouve pas le Hack :
SQL file https://github.com/PnX-SI/GeoNature-atlas/blob/multilingue/data/gbif.sql

@camillemonchicourt
Copy link
Member

Ah mince, c'est une vieille branche qui a été supprimée depuis.
Je vais fouiller si je retrouve ça ailleurs.

@camillemonchicourt
Copy link
Member

Bon, déjà j'ai retrouvé les scripts d'intégration de médias depuis l'API GBIF : PnX-SI/GeoNature-atlas@18a240a

Et le SQL en question : https://github.com/PnX-SI/GeoNature-atlas/pull/299/files#diff-af3eb02e0bee442da81d2ca320a6843b8b7f4c636b9a27e1601d6f0630bd1742

Youpi !

Par contre, ça date un peu tout ça, les outils ont évolué depuis, mais ça doit s'adapter assez facilement.

@orovellotti
Copy link

orovellotti commented Apr 19, 2024

image
Sucess :)
@julien corny

@camillemonchicourt
Copy link
Member

OK super.
La documentation et les scripts en question étaient très orientés pour remplir la structure de BDD de GeoNature-atlas, son schéma "taxonomie" et tout ce qui est lié avec le backbone GBIF et des observations GBIF, donc plus complexe et différent que le fait de remplir le schéma "taxonomie" de TaxHub pour GeoNature uniquement.

Je serai curieux que vous partagiez la méthode et les scripts que vous avez exécuté (@JulienCorny).
Et comme le backbone GBIF est très volumineux, je pense qu'il est nécessaire ensuite de le limiter en créant une liste de taxons avec uniquement les taxons utiles pour ne pas requêter à chaque fois dans plusieurs millions de taxons.

@JulienCorny
Copy link

Salut,

On a simplement importé backbone dans une table de la bdd puis on l'a inséré en taxons négatifs dans taxref, en essayant de faire correspondre le mieux possible les colonnes de backbone dans taxref (probablement possibilité de faire mieux pour les correspondances mais c'était juste un essai). Puis on a créé une liste de taxons contenant seulement les cd_noms négatifs.

Effectivement backbone contient plus de 7 millions de taxons, du coup on a inséré seulement la flore, qui représente quand-même plus de 2 millions de taxons. Les performances de l'autocomplete ne souffrent pas trop de ce grand nombre de taxons.

Voici les quelques manip faites :

  • créer une table vide pour importer backbone
CREATE TABLE public.backbone (
 id int PRIMARY KEY,
 parent_key int,
 basionym_key int,
 is_synonym boolean,
 status text,
 rank text,
 nom_status text[],
 constituent_key text,
 origin text,
 source_taxon_key int,
 kingdom_key int,
 phylum_key int,
 class_key int,
 order_key int,
 family_key int,
 genus_key int,
 species_key int,
 name_id int,
 scientific_name text,
 canonical_name text,
 genus_or_above text,
 specific_epithet text,
 infra_specific_epithet text,
 notho_type text,
 authorship text,
 year text,
 bracket_authorship text,
 bracket_year text,
 name_published_in text,
 issues text[]
)
  • importer backbone :
sudo psql -h localhost -U postgres -d geonature2db -c '\copy public.backbone FROM /home/geonatureadmin/simple.txt' 

(https://techdocs.gbif.org/en/data-use/download-formats#simple)

  • Sélection dans public.backbone uniquement des taxons de flore (kingdom plantae, id=6)

  • Insertion de backbone en cd_nom négatifs dans taxref :

insert into taxonomie.taxref 
select 
	id*-1,
	null,
	null,
	rank,
	'Plantae',
	null,
	(select b2.canonical_name from public.backbone b2 where b2.id = b.class_key), --classe
	(select b2.canonical_name from public.backbone b2 where b2.id = b.family_key), --famille
	null, --sous-famille
	null, --tribu
	null, --cd_taxsup
	parent_key, --cd_sup
	null,
	null,
	canonical_name, --lb_nom
	null,
	scientific_name, --nom_complet
	null,
	null, --nom_valide
	null, --nom_vern
	null,
	null, --group1
	null,
	null,
	null
from public.backbone b

(todo: améliorer les correspondances des colonnes dans ce insert)

  • Mettre les cd_nom négatifs dans liste de taxons :
delete from taxonomie.cor_nom_liste ;
delete from taxonomie.bib_noms;

insert into taxonomie.bib_noms(cd_nom,cd_ref,nom_francais)
select cd_nom, cd_ref, nom_vern
from taxonomie.taxref
where cd_nom < 0;

insert into taxonomie.cor_nom_liste(id_liste,id_nom)
select 100, id_nom
from taxonomie.bib_noms
where cd_nom < 0;

(!! si la suppression bloque, désactiver les triggers et pas oublier de les réactiver)

  • Modifier taxonomie.vm_taxref_list_forautocomplete :
-- supprimer la vue, la modifier et la recréer

CREATE MATERIALIZED VIEW taxonomie.vm_taxref_list_forautocomplete
TABLESPACE pg_default
AS SELECT row_number() OVER () AS gid,
    t.cd_nom,
    t.cd_ref,
    t.search_name,
    unaccent(t.search_name) AS unaccent_search_name,
    t.nom_valide,
    t.lb_nom,
    t.nom_vern,
    t.regne,
    t.group2_inpn,
    t.group3_inpn
   FROM ( SELECT t_1.cd_nom,
            t_1.cd_ref,
            concat(t_1.lb_nom, ' = <i>', t_1.nom_valide, '</i>', ' - [', t_1.id_rang, ' - ', t_1.cd_nom, ']') AS search_name,
            t_1.nom_valide,
            t_1.lb_nom,
            t_1.nom_vern,
            t_1.regne,
            t_1.group2_inpn,
            t_1.group3_inpn
           FROM taxonomie.taxref t_1
        UNION
         SELECT DISTINCT t_1.cd_nom,
            t_1.cd_ref,
            concat(split_part(t_1.nom_vern::text, ','::text, 1), ' = <i>', t_1.nom_valide, '</i>', ' - [', t_1.id_rang, ' - ', t_1.cd_ref, ']') AS search_name,
            t_1.nom_valide,
            t_1.lb_nom,
            t_1.nom_vern,
            t_1.regne,
            t_1.group2_inpn,
            t_1.group3_inpn
           FROM taxonomie.taxref t_1
          WHERE t_1.nom_vern IS NOT NULL AND t_1.cd_nom = t_1.cd_ref) t
WITH DATA;

-- View indexes:
CREATE INDEX i_tri_vm_taxref_list_forautocomplete_search_name ON taxonomie.vm_taxref_list_forautocomplete USING gin (unaccent_search_name gin_trgm_ops);
CREATE INDEX i_vm_taxref_list_forautocomplete_cd_nom ON taxonomie.vm_taxref_list_forautocomplete USING btree (cd_nom);
CREATE UNIQUE INDEX i_vm_taxref_list_forautocomplete_gid ON taxonomie.vm_taxref_list_forautocomplete USING btree (gid);

@camillemonchicourt
Copy link
Member

OK intéressant. Merci pour le partage.
Mais pourquoi ne pas vider la table taxref et garder les "id" du backbone pour les mettre dans le champs cd_nom sans les modifier ?
Sachant que, de mémoire, le backbone du GBIF inclut Taxref. Donc garder Taxref et ajouter le backbone GBIF serait redondant.

Sachant par ailleurs qu'avec Wikidata on peut refaire le lien entre un ID GBIF backbone et un cd_ref. Voir https://pncevennes.github.io/test/inpn_to_gbif.html

@sylvain-m
Copy link

Mais pourquoi ne pas vider la table taxref et garder les "id" du backbone pour les mettre dans le champs cd_nom sans les modifier ?

Surtout, étant donné que le lien entre TaxRef et Backbone est opérationnel à 96%, pourquoi ne pas "simplement" ajouter un identifiant GBIF à TaxHub, en complément de l'identifiant TaxRef ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants