Utilisateur
Information sur l'utilisateur
| Champ | Signification | Exemple de Valeur |
|---|---|---|
elementId | Identifiant unique global dans Neo4j pour le nœud. | 4:d6babb03-ca8b-420a-adaa-b2560e937bd2:113982 |
id | Identifiant interne du nœud ou de l'entité (généralement une clé primaire). | 113982 |
UNIQUE IMPORT ID | Identifiant unique utilisé lors de l'importation des données dans la base. | 10255 |
accommodation | Type d'hébergement associé à l'utilisateur (par exemple, interne/externe). | INTERNE 6 JOURS |
activationCode | Code d'activation généré pour permettre à l'utilisateur de valider son compte. | gnp9zf6y |
address | Adresse postale de l'utilisateur. | 769 boulevard dominique jamet |
attachmentId | Identifiant lié à un fichier ou document attaché (par exemple, photo de profil). | 1984341 |
birthDate | Date de naissance de l'utilisateur au format ISO 8601. | 2002-08-14 |
checksum | Somme de contrôle générée pour vérifier l'intégrité des données associées à l'utilisateur. | 6017a638def692cc930f82815873a5dbe47c5701 |
city | Ville de résidence de l'utilisateur. | SEYSSINS |
classes | Identifiant(s) de classe(s) associée(s) à l'utilisateur, souvent structuré avec un préfixe. | 950436$PSI |
country | Pays de résidence de l'utilisateur. | FRANCE |
created | Date et heure de création de l'entité dans la base au format ISO 8601. | 2022-12-13T12:38:17.311Z |
displayName | Nom complet affiché de l'utilisateur (prénom + nom). | CARTHY001 Wilton |
displayNameSearchField | Version normalisée du nom complet utilisée pour les recherches (tout en minuscules, sans espaces). | carthy001wilton |
externalId | Identifiant externe provenant d'un système tiers (par exemple, un SSO ou autre annuaire). | 938535 |
fieldOfStudy | Codes des matières ou domaines d'études suivis par l'utilisateur. | 003300,022700,030102,030201,061300,063300,065700,067000,100100,240500 |
fieldOfStudyLabels | Noms des matières ou domaines d'études correspondants aux codes. | TRAVAUX INITIAT.PERSONNEL ENCADRES,FRANCAIS-PHILOSOPHIE,... |
firstName | Prénom de l'utilisateur. | Wilton |
firstNameSearchField | Version normalisée du prénom utilisée pour les recherches (tout en minuscules). | wilton |
groups | Identifiants des groupes ou classes auxquels l'utilisateur appartient. | 950436$CPGEAL12,950436$PSI GR2,950436$CPGE GREPS |
ine | Numéro INE (Identifiant National Élève), utilisé pour identifier les étudiants en France. | 977231106YZ |
joinKey | Clé utilisée pour joindre des données entre différents systèmes ou entités. | 938535 |
lastName | Nom de famille de l'utilisateur. | CARTHY001 |
lastNameSearchField | Version normalisée du nom de famille utilisée pour les recherches (tout en minuscules). | carthy001 |
level | Niveau scolaire ou académique actuel de l'utilisateur. | CLASSE PREPA.GRANDES ECOLES : 2EME ANNEE |
login | Identifiant de connexion utilisé par l'utilisateur (souvent basé sur le prénom et le nom). | wilton.carthy001 |
modified | Date et heure de la dernière modification de l'entité dans la base au format ISO 8601. | 2022-12-13T12:38:17.311Z |
module | Code ou identifiant du module pédagogique suivi par l'utilisateur. | 30111029220 |
moduleName | Nom du module pédagogique correspondant au code. | CPGE2 PSI (PHYSIQUE ET SC. INGENIEUR) |
otherNames | Autres prénoms possibles ou alias de l'utilisateur. | Wilton |
profiles | Profil(s) attribué(s) à l'utilisateur (par exemple, rôle ou fonction). | Student |
relative | Informations relatives aux contacts familiaux ou liens associés (structuré avec plusieurs valeurs). | 1841154$20$1$1$1$1,1932609$10$0$1$0$0 |
relativeAddress | Identifiant de l'adresse associée à un contact familial ou proche. | 1841154 |
scholarshipHolder | Indique si l'utilisateur est boursier (valeur booléenne). | true |
sector | Secteur ou domaine académique général de l'utilisateur. | CLASSE PREPA.GRDES ECOLES : 2EME ANNEE |
source | Source des données (par exemple, système tiers ou processus d'importation). | AAF |
status | Statut actuel de l'utilisateur (par exemple, scolaire, inactif, etc.). | SCOLAIRE |
structures | Identifiant(s) des structures auxquelles l'utilisateur appartient (par exemple, établissements). | 950436 |
surname | Nom de famille alternatif ou complémentaire (souvent identique au champ lastName). | CARTHY001 |
transport | Indique si l'utilisateur bénéficie d'un service de transport (valeur booléenne). | false |
zipCode | Code postal de la ville de résidence de l'utilisateur. | 17781 |
emailVerified | Indique si l'adresse e-mail de l'utilisateur a été vérifiée (valeur booléenne). | true |
enabled | Indique si le compte de l'utilisateur est activé (valeur booléenne). | true |
Le champ level permet de savoir si l'utilisateur est :
- du 1er degré/école primaire (1d),
- du 2ème degré/ (2d)
- ou du 3ème degré.
Rechercher un utilisateur par son nom
MATCH (u:User)
WHERE toLower(u.lastName) = toLower('Benzemou')
RETURN u
Récupération d'un utilisateur
MATCH (u:User { id: $id }) RETURN u
MATCH (u:User { login: 'tom.mate' }) RETURN u
// Récupération des structures liées à l'utilisateur
OPTIONAL MATCH (u)-[:IN]->(:ProfileGroup)-[:DEPENDS]->(s:Structure)
WITH COLLECT(DISTINCT s) AS structureNodes, u
// Récupération des fonctions et des scopes
OPTIONAL MATCH (u)-[rf:HAS_FUNCTION]->(f:Function)
WITH COLLECT(DISTINCT [f.externalId, rf.scope]) AS functions, u, structureNodes
// Récupération des enfants liés à l'utilisateur
OPTIONAL MATCH (u)<-[:RELATED]-(child:User)
WITH COLLECT(DISTINCT {id: child.id, displayName: child.displayName, externalId: child.externalId}) AS children, functions, u, structureNodes
// Récupération des parents liés à l'utilisateur
OPTIONAL MATCH (u)-[:RELATED]->(parent:User)
WITH COLLECT(DISTINCT {id: parent.id, displayName: parent.displayName, externalId: parent.externalId}) AS parents, children, functions, u, structureNodes
// Récupération des groupes fonctionnels administratifs
OPTIONAL MATCH (u)-[:IN]->(fgroup:FunctionalGroup)
WITH COLLECT(DISTINCT {id: fgroup.id, name: fgroup.name}) AS admGroups, parents, children, functions, u, structureNodes
// Récupération des structures administratives
OPTIONAL MATCH (u)-[:ADMINISTRATIVE_ATTACHMENT]->(admStruct:Structure)
WITH COLLECT(DISTINCT {id: admStruct.id}) AS admStruct, admGroups, parents, children, functions, u, structureNodes
// Récupération des matières enseignées par l'utilisateur
OPTIONAL MATCH (u)-[r:TEACHES]->(s:Subject)
WITH COLLECT(DISTINCT s.code) AS subjectCodes, admStruct, admGroups, parents, children, functions, u, structureNodes
// Récupération des groupes manuels
OPTIONAL MATCH (u)-[:IN]->(mgroup:ManualGroup)
WITH COLLECT(DISTINCT {id: mgroup.id, name: mgroup.name}) AS manualGroups, subjectCodes, admStruct, admGroups, parents, children, functions, u, structureNodes
// Retour des résultats
RETURN DISTINCT
u.profiles AS type,
structureNodes,
[x IN functions WHERE size(FILTER(y IN x WHERE NOT isEmpty(y))) > 0] AS functions,
u.functions AS aafFunctions,
[x IN COALESCE(children, []) WHERE NOT isEmpty(x.id)] AS children,
[x IN COALESCE(parents, []) WHERE x.id IS NOT NULL] AS parents,
[x IN COALESCE(admGroups, []) WHERE x.id IS NOT NULL] AS functionalGroups,
[x IN COALESCE(admStruct, []) WHERE x.id IS NOT NULL] AS administrativeStructures,
[x IN COALESCE(subjectCodes, []) WHERE x IS NOT NULL] AS subjectCodes,
CASE WHEN manualGroups IS NULL THEN [] ELSE manualGroups END AS manualGroups,
u
Liste de tous les utilisateurs pour une structure
MATCH (u:User)-[:IN]->(pg:ProfileGroup)-[:DEPENDS]->(s:Structure {id:$structureId})
OPTIONAL MATCH (u)-[:IN]->(:ProfileGroup)-[:DEPENDS]->(class:Class)
WITH DISTINCT u, class,
CASE
WHEN class IS NULL THEN []
ELSE COLLECT(DISTINCT {id: class.id, name: class.name, externalId: class.externalId})
END AS classes
OPTIONAL MATCH (u)-[d:DUPLICATE]-(duplicate:User)-[:IN]->(:ProfileGroup)-[:DEPENDS]->(sd:Structure)
WITH DISTINCT u, classes,
COLLECT(DISTINCT {id: sd.id, name: sd.name}) AS structuresDup,
duplicate, d
OPTIONAL MATCH (u)-[:IN]->(:ProfileGroup)-[:DEPENDS]->(struct:Structure)
WITH DISTINCT u, classes, structuresDup, duplicate, d,
CASE
WHEN duplicate IS NULL THEN []
ELSE COLLECT(DISTINCT {id: duplicate.id, firstName: duplicate.firstName, lastName: duplicate.lastName, score: d.score, code: duplicate.activationCode, structures: structuresDup})
END AS duplicates,
COLLECT(DISTINCT {id: struct.id, name: struct.name, externalId: struct.externalId}) AS structures
OPTIONAL MATCH (u)-[:IN]->(fgroup:FunctionalGroup)
WITH DISTINCT u, classes, structuresDup, duplicates, structures, fgroup,
CASE
WHEN fgroup IS NULL THEN []
ELSE COLLECT(DISTINCT fgroup.name)
END AS functionalGroups
OPTIONAL MATCH (u)-[:IN]->(mgroup:ManualGroup)
WITH DISTINCT u, classes, structuresDup, duplicates, structures, functionalGroups, mgroup,
CASE
WHEN mgroup IS NULL THEN []
ELSE COLLECT(DISTINCT mgroup.name)
END AS manualGroups
OPTIONAL MATCH (u)-[rf:HAS_FUNCTION]->(f:Function)
WITH DISTINCT u, classes, structuresDup, duplicates, structures, functionalGroups, manualGroups, f,
CASE
WHEN f IS NULL THEN []
ELSE COLLECT(DISTINCT [f.externalId, rf.scope])
END AS functions
RETURN DISTINCT
u.id AS id,
u.profiles[0] AS type,
u.activationCode AS code,
u.login
Explication détaillée de la requête
Cette requête vise à extraire des informations complexes et relationnelles sur des utilisateurs (u) dans une base de données Neo4j. Elle explore plusieurs niveaux de relations pour collecter des informations sur les utilisateurs, leurs classes, leurs groupes, leurs duplicatas, et d'autres données connexes.
-
Premier
MATCH: Filtrage initial sur les utilisateursMATCH (u:User)-[:IN]->(pg:ProfileGroup)-[:DEPENDS]->(s:Structure {id:$structureId})- Objectif : Trouver les utilisateurs (
u) associés à unProfileGroup(pg) dépendant d'une structure spécifique (s) identifiée par$structureId. - Relation :
(u)-[:IN]->(pg): L'utilisateur appartient à un groupe de profils.(pg)-[:DEPENDS]->(s): Ce groupe dépend de la structure spécifiée.
- Objectif : Trouver les utilisateurs (
-
Classes associées à l'utilisateur
OPTIONAL MATCH (u)-[:IN]->(:ProfileGroup)-[:DEPENDS]->(class:Class)
WITH DISTINCT u, class,
CASE
WHEN class IS NULL THEN []
ELSE COLLECT(DISTINCT {id: class.id, name: class.name, externalId: class.externalId})
END AS classes- Objectif : Trouver les classes (
class) liées indirectement à l'utilisateur. - Utilisation de
CASE:- Si aucune classe n'est trouvée, la valeur retournée est une liste vide.
- Sinon, les propriétés clés des classes sont collectées dans une liste.
- Objectif : Trouver les classes (
-
Duplicatas des utilisateurs
OPTIONAL MATCH (u)-[d:DUPLICATE]-(duplicate:User)-[:IN]->(:ProfileGroup)-[:DEPENDS]->(sd:Structure)
WITH DISTINCT u, classes,
COLLECT(DISTINCT {id: sd.id, name: sd.name}) AS structuresDup,
duplicate, d- Objectif : Identifier les utilisateurs duplicatas (
duplicate) et leurs structures (sd). - Relation :
(u)-[d:DUPLICATE]-(duplicate):uest en relation de duplicata avec un autre utilisateur.(duplicate)-[:IN]->(:ProfileGroup)-[:DEPENDS]->(sd): Le duplicata appartient à un groupe lié à une structure.
- Objectif : Identifier les utilisateurs duplicatas (
-
Structures liées à l'utilisateur principal
OPTIONAL MATCH (u)-[:IN]->(:ProfileGroup)-[:DEPENDS]->(struct:Structure)
WITH DISTINCT u, classes, structuresDup, duplicate, d,
CASE
WHEN duplicate IS NULL THEN []
ELSE COLLECT(DISTINCT {id: duplicate.id, firstName: duplicate.firstName, lastName: duplicate.lastName, score: d.score, code: duplicate.activationCode, structures: structuresDup})
END AS duplicates,
COLLECT(DISTINCT {id: struct.id, name: struct.name, externalId: struct.externalId}) AS structures- Objectif : Trouver toutes les structures directement liées à l'utilisateur (
struct). - Logique sur les duplicatas :
- Si aucun duplicata n'existe, la liste est vide.
- Sinon, collecter des informations détaillées sur chaque duplicata (propriétés et structures associées).
- Objectif : Trouver toutes les structures directement liées à l'utilisateur (
-
Groupes fonctionnels
OPTIONAL MATCH (u)-[:IN]->(fgroup:FunctionalGroup)
WITH DISTINCT u, classes, structuresDup, duplicates, structures, fgroup,
CASE
WHEN fgroup IS NULL THEN []
ELSE COLLECT(DISTINCT fgroup.name)
END AS functionalGroups- Objectif : Récupérer les noms des groupes fonctionnels associés à l'utilisateur.
-
Groupes manuels
OPTIONAL MATCH (u)-[:IN]->(mgroup:ManualGroup)
WITH DISTINCT u, classes, structuresDup, duplicates, structures, functionalGroups, mgroup,
CASE
WHEN mgroup IS NULL THEN []
ELSE COLLECT(DISTINCT mgroup.name)
END AS manualGroups- Objectif : Identifier les groupes manuels liés à l'utilisateur.
-
Fonctions de l'utilisateur
OPTIONAL MATCH (u)-[rf:HAS_FUNCTION]->(f:Function)
WITH DISTINCT u, classes, structuresDup, duplicates, structures, functionalGroups, manualGroups, f,
CASE
WHEN f IS NULL THEN []
ELSE COLLECT(DISTINCT [f.externalId, rf.scope])
END AS functions- Objectif : Collecter les fonctions (
f) associées à l'utilisateur, ainsi que leur étendue (rf.scope).
- Objectif : Collecter les fonctions (
-
Finalisation et retour des données
RETURN DISTINCT
u.id AS id,
u.profiles[0] AS type,
u.activationCode AS code,
u.login AS login- Objectif : Retourner un ensemble d'informations consolidées sur l'utilisateur :
- Identifiant (
id), profil principal (type), code d'activation, et login.
- Identifiant (
- Objectif : Retourner un ensemble d'informations consolidées sur l'utilisateur :
Relations explorées
- Liens directs : Utilisateur → Groupe de profils → Structure.
- Associations optionnelles :
- Classes liées, duplicatas, groupes fonctionnels et manuels, fonctions.
- Organisation des données :
- Les informations sont regroupées dans des collections (listes) pour des champs comme
classes,duplicates, etfunctions.
- Les informations sont regroupées dans des collections (listes) pour des champs comme
Créer un utilisateur et son UserBook (Profil utilisateur)
// Création de l'utilisateur
CREATE (:User {
id: 'user_123',
login: 'jean.dupont',
displayName: 'Jean Dupont'
});
// Création du UserBook associé
MATCH (u:User {id: 'user_123'})
MERGE (u)-[:HAS_USER_BOOK]->(:UserBook {
userid: 'user_123',
ine: '123456789AB',
quota: 1073741824,
storage: 536870912
});
Créer un lien parent/enfant
Un utilisateur de type élève est lié à ses parents.
MATCH (parent:User {id: 'parent_1'}), (child:User {id: 'user_123'})
MERGE (parent)-[:RELATED]->(child);
Créer un administrateur local (ADML)
// Création du groupe de fonction
CREATE (:FunctionGroup {
id: 'adml_group_1',
name: 'Admin Local Group',
filter: 'ADMIN_LOCAL'
});
// Liaison à la structure
MATCH (fg:FunctionGroup {id: 'adml_group_1'}), (s:Structure {id: 'structure_1'})
MERGE (fg)-[:SCOPE]->(s);
// Attribution à un utilisateur
MATCH (u:User {id: 'admin_1'}), (fg:FunctionGroup {id: 'adml_group_1'})
MERGE (u)-[:IN]->(fg);