# Le modèle de données de CRISalid

import { Mermaid } from "../../../src/components/Mermaid";

> **En bref :**
> CRISalid range ses données en trois étages : le référentiel (personnes, structures), les notices telles que chaque source les livre, et les publications consolidées.
> **Projets et financements : absents.** Les rattachements des personnes aux unités sont enregistrés **sans dates** : une vitrine ne peut pas montrer l'historique des affiliations.
> Le modèle s'inspire du standard européen CERIF-Core sans l'implémenter ni l'exporter.

## Projets et financements : absents

Statut : **Confirmé** (code du graphe, IKG).

- Le graphe (crisalid-ikg) ne contient **aucun modèle, aucune route, aucun message ni aucun nœud** projet ou financement.
- Le type `Grant` de SoVisu+ (SoVisuPlus) est un **type de notice bibliographique**, pas un financement.
- La documentation du moissonneur (svp-harvester) cite les projets parmi les entités possibles, sans chaîne de bout en bout : **Déclaré**.

**Pour la vitrine** : ne pas annoncer de projets ni de financements tant qu'il n'existe ni autre source (outil de gestion des contrats, ANR, programmes européens), ni propriétaire, ni règles de publication.

## Les trois étages

<Mermaid
  title="Les trois étages du modèle"
  caption="Le consolidé agrège une ou plusieurs notices sources ; ses auteurs pointent vers les personnes du référentiel."
  chart={`flowchart TB
    subgraph REF["Référentiel"]
      P["Personne"]
      S["Structure"]
      E["Établissement"]
    end
    subgraph SRC["Notices sources"]
      N["Notice d'une source<br/>auteurs, affiliations tels que livrés"]
    end
    subgraph CONS["Consolidé"]
      D["Publication"]
      C["Contribution"]
    end
    P -->|"appartenance"| S
    P -->|"emploi"| E
    S -->|"inclusion, rattachement"| S
    D -->|"regroupe 1 à n"| N
    D --> C
    C -->|"auteur"| P
  `}
/>

| Étage | Contenu | Statut |
| --- | --- | --- |
| Référentiel | Personnes, noms, identifiants (ORCID, IdRef, IdHAL, identifiant local), structures, établissements | **Confirmé** |
| Notices sources | Une notice par source et par collecte : titres, auteurs et affiliations tels que fournis, identifiants (DOI, HAL…), revue et numéro | **Confirmé** |
| Consolidé | Publications regroupant des notices, contributions vers des personnes, revues, sujets et thèmes | **Confirmé** |

Les trois étages existent sur l'instance de développement, avec 18,5 millions de nœuds : **Observé sur instance (dev)** ([données observées](/03-crisalid/06-instance-saclay/01-donnees-observees)).

## Personnes, structures et rattachements

Le graphe distingue deux liens d'une personne :

- l'**appartenance** à une structure de recherche ou assimilée (relation `MEMBER_OF`) ;
- l'**emploi** dans un établissement (relation `EMPLOYED_AT`), qui peut porter un code de poste, donnée RH non publiable.

Les structures forment leur propre hiérarchie : **inclusion** (`PART_OF`) ou **rattachement souple** (`MEMBER_OF`). Ces liens entre structures portent des dates de début et de fin. Toutes les structures partagent un même type de base (`OrganizationUnit`), puis un type concret : établissement et subdivision, école doctorale, unité de recherche, d'appui, administrative ou d'enseignement, sous-unité, équipe. Pour la notion d'unité sans jargon, voir [Qu'est-ce qu'une unité ?](/03-crisalid/00-reperes/quest-ce-quune-unite).

### Rattachements de personnes sans dates

Statut : **Confirmé** (requêtes d'écriture du graphe).

Les modèles d'entrée acceptent des dates de début et de fin pour l'appartenance et l'emploi, et l'API de lecture (Apollo) comme SoVisu+ les déclarent. Mais **les requêtes qui créent ces deux liens n'écrivent aucune date**. Conséquence : une vitrine **ne peut pas montrer l'historique des affiliations** d'une personne, ni dater un rattachement. Le détail champ par champ est dans le [dictionnaire](./dictionnaire-de-donnees#appartenances-et-emplois).

### Règles de chargement

1. **Structures avant personnes** : un lien n'est créé que si la structure cible existe déjà ; sinon il est ignoré.
2. **Un identifiant obligatoire** : sans identifiant unique ou prioritaire, la personne ou la structure n'est pas créée.
3. **Affiliation scientifique et emploi RH sont distincts** : la première vise une unité, le second un établissement.

Sur l'instance, **51 unités sur 235** ont des chercheurs rattachés : **Observé sur instance (dev)** ; le détail est dans les [données observées](/03-crisalid/06-instance-saclay/01-donnees-observees).

## Publications : notice source et publication consolidée

CRISalid garde deux niveaux : la **notice source**, fidèle à ce qu'une source a livré, et la **publication consolidée**, recalculée à partir des notices rapprochées. La provenance reste ainsi traçable. Les règles de rapprochement, de choix des métadonnées et de correction sont dans [Provenance, qualité et fusion](./provenance-qualite-fusion).

| Lien | Cardinalité | Statut |
| --- | ---: | --- |
| Notice → titres | 1 ou plus | **Confirmé** |
| Notice → contributions sources, chacune vers une personne source | 0 ou plus | **Confirmé** |
| Contribution source → affiliations telles que déclarées | 0 ou plus | **Confirmé** |
| Publication consolidée → notices regroupées | 1 ou plus attendu ; le moteur n'impose pas qu'une notice n'appartienne qu'à une publication | **Confirmé** |
| Contribution → une publication et une personne consolidée | exactement 1 et 1 | **Confirmé** |

Les cardinalités décrivent ce que le code accepte ou construit, pas des volumes observés.

**Correspondance des noms** : le code lu écrit les publications sous le nom `Document` ; l'instance les range sous `ScholarlyPublication` et ses sous-types, sans nœud `Document` : **Observé sur instance (dev)**. L'écart tient sans doute à la version déployée : **À confirmer**. Toute requête d'extrait doit partir des noms observés.

## CERIF : une inspiration, pas une implémentation

[CERIF-Core](https://github.com/EuroCRIS/CERIF-Core) est le modèle européen des systèmes d'information de la recherche, publié par euroCRIS sous forme d'ontologie. **CRISalid s'en inspire sans l'implémenter ni l'exporter** : statut **Confirmé** (code du graphe, schéma Apollo, ontologie CERIF). Cette page fait foi sur ce point.

| Concept CERIF | Dans CRISalid | Statut |
| --- | --- | --- |
| Personne, structure, identifiant | Repris | **Confirmé** |
| Rattachement entre structures | Repris, avec dates | **Confirmé** |
| Appartenance et emploi d'une personne | Repris, **sans dates** | **Partiel** |
| Publication, contribution | Repris | **Confirmé** |
| Projet, financement, équipement, prix | Absents | **Confirmé** |
| Export CERIF ou RDF | Aucun : les échanges se font en GraphQL, REST et messages JSON | **Confirmé** |

**Pour la vitrine** : « compatible CERIF » ne signifie ni interopérabilité garantie avec un autre système CERIF, ni export normalisé disponible.

## Preuves principales

- Graphe (crisalid-ikg) : [modèles](https://github.com/CRISalid-esr/crisalid-ikg/tree/dev-main/app/models) et [requêtes d'écriture](https://github.com/CRISalid-esr/crisalid-ikg/tree/dev-main/app/graph/neo4j/queries), dont [`create_membership.cypher`](https://github.com/CRISalid-esr/crisalid-ikg/blob/dev-main/app/graph/neo4j/queries/create_membership.cypher), [`create_employment.cypher`](https://github.com/CRISalid-esr/crisalid-ikg/blob/dev-main/app/graph/neo4j/queries/create_employment.cypher) et [`create_organization_unit_part_of.cypher`](https://github.com/CRISalid-esr/crisalid-ikg/blob/dev-main/app/graph/neo4j/queries/create_organization_unit_part_of.cypher).
- [Schéma Prisma de SoVisu+](https://github.com/CRISalid-esr/SoVisuPlus/blob/dev-main/prisma/schema.prisma).
- CERIF-Core : [entités](https://github.com/EuroCRIS/CERIF-Core/tree/main/entities), dont [`Project`](https://github.com/EuroCRIS/CERIF-Core/blob/main/entities/Project.md) et [`Funding`](https://github.com/EuroCRIS/CERIF-Core/blob/main/entities/Funding.md).

Les révisions examinées sont centralisées dans [Sources et preuves](/03-crisalid/00-reperes/sources-et-preuves).
