maintenance.graphdb

Interface avec la partie de la base de données en graphe reflétant le dépôt.

Modifié le 30/03/23 @author: remy

  • Définit des outils utiles pour tous les dépôts
  • Importe le sous-module bdg_xxxx spécifique au dépôt sous le nom specific.
  • Définit la classe Maquis.

La maintenance de la base est réalisée par des requêtes cypher définies dans specific et exécutés lors de l'instanciation de la classe Maquis par l'appel specific.exec().

Les sous-modules spécifiques sont bdg_mathCours, bdg_mathExos et bdg_mathPbs

  1# -*- coding: utf-8 -*-
  2"""
  3Interface avec la partie de la base de données en graphe reflétant le dépôt.
  4
  5Modifié le 30/03/23   @author: remy
  6
  7- Définit des outils utiles pour tous les dépôts
  8- Importe le sous-module `bdg_xxxx` spécifique au dépôt sous le nom `specific`.
  9- Définit la classe `Maquis`.
 10
 11La maintenance de la base est réalisée par des requêtes cypher définies
 12 dans `specific` et exécutés lors de l'instanciation de la classe `Maquis`
 13 par l'appel `specific.exec()`.
 14 
 15Les sous-modules spécifiques sont [`bdg_mathCours`](bdg_mathCours.html), [`bdg_mathExos`](bdg_mathExos.html) et [`bdg_mathPbs`](bdg_mathPbs.html)
 16
 17"""
 18import importlib
 19# import neo4j
 20
 21
 22class Maquis:
 23    """
 24    Classe Maquis. Interface la base de données neo4j.
 25    - exécute les requêtes de mise à jour de la partie de la base associée au dépôt.
 26    - présente dans la propriété `.log` le journal de l'exécution des requêtes.
 27
 28    """
 29
 30    def __init__(self, data, specific_results):
 31        """
 32        Instancie la classe
 33
 34        #### Paramètres
 35        - data : dictionnaire `manifeste['context']` du module d'Initialisation.
 36    
 37        - specific_results : dictionnaire de données de contextalisation extraites du dépôt par le module d'exécution locale spécifique.
 38    
 39        #### Propriétés
 40        - `.log` : journal
 41        - `.connect_data` : `manifeste['context']` données de connexion.
 42        - `.specific_results` : données extraites du dépot par l'exécution locale spécifique
 43    
 44        #### Renvoie
 45
 46        None.
 47
 48        """
 49        self.connect_data = data
 50        self.specific_results = specific_results
 51        self.log = "\t Initialisation de la classe Maquis \n"
 52
 53        print("coucou du module graphdb")
 54
 55        lineprefix = "\n \t \t"
 56
 57        # Importation du module spécifique
 58        module = data['modulespec']
 59        if module:
 60            try:
 61                specific = importlib.import_module(module)
 62                self.log += lineprefix
 63                self.log += "Importation du module spécifique " + module
 64                # exécution des scripts de contextualisation
 65                self.log += specific.exec(self)
 66            except ImportError as error:
 67                self.log += lineprefix + "Module " + error.name + " pas trouvé"
 68
 69
 70    def format_cypher_RETURN(self, param):
 71        """
 72        Renvoie une requête cypher de type `RETURN`.
 73
 74        Dans la chaîne modèle
 75
 76            "MATCH (n: {label} {propsF}) RETURN {propsR}"
 77
 78        remplace les variables entre accolades par les valeurs dans `param`.
 79        Utilise la méthode `.format()` d'une chaine.
 80
 81        #### Parametres
 82
 83        param : TYPE dictionnaire
 84            DESCRIPTION exemple:
 85
 86            {'label': "Document",
 87             'propsF':" {typeDoc:'problème'}",
 88             'propsR': "n.titre, n.description"}.
 89
 90        #### Renvoie
 91
 92        TYPE chaine de caractères
 93        DESCRIPTION requête cypher.
 94
 95        """
 96        req = "MATCH (n: {label} {propsF}) RETURN {propsR}"
 97        req = req.format(**param)
 98        return req
 99
100    def format_cypher_DELETE(self, param):
101        """
102        Renvoie une requête cypher de type `DETACH DELETE`.
103
104        ATTENTION ! Ce type de requte est à manier avec précaution.
105         Toujours vérifier ce qui sera détruit.
106
107        Dans la chaîne modèle
108
109            "MATCH (n: {label} {propsF}) DETACH DELETE n"
110
111        remplace les variables entre accolades par les valeurs dans `param`.
112        Utilise la méthode `.format()` d'une chaine.
113
114        #### Parametres
115
116        param : TYPE dictionnaire
117           DESCRIPTION exemple pour supprimer le problème de titre 'grpe2'
118           dans la base:
119
120            {'label' : "Document",
121             'propsF' :"{typeDoc:'problème' titre:'grpe2'}"}
122
123        #### Renvoie
124
125        TYPE chaine de caractères
126        DESCRIPTION requête cypher.
127
128        """
129        req = "MATCH (n: {label} {propsF}) DETACH DELETE n"
130        req = req.format(**param)
131        return req
132
133    def format_cypher_SET(self, param):
134        """
135        Renvoie une requête cypher de type `SET`.
136
137        Dans la chaîne modèle
138
139            "MATCH (n: {label} {propsF}) SET {propsV}"
140
141        remplace les variables entre accolades par les valeurs dans `param`.
142        Utilise la méthode `.format()` d'une chaine.
143
144        #### Parametres
145
146        param : TYPE dictionnaire
147            DESCRIPTION exemple:
148
149            {'label' : "Document",
150             'propsF' :"{typeDoc:'problème'}",
151             'propsV' : "n.description = tagada"}.
152
153        #### Renvoie
154
155        TYPE chaine de caractères
156        DESCRIPTION requête cypher.
157
158        """
159        req = "MATCH (n: {label} {propsF}) SET {propsV}"
160        req = req.format(**param)
161        return req
162
163    def format_cypher_CREATE(self, param):
164        """
165        Renvoie une requête cypher de type `CREATE`.
166
167        Dans la chaîne modèle
168
169            "CREATE (n: {label} {propsF})"
170
171        remplace les variables entre accolades par les valeurs dans `param`.
172        Utilise la méthode `.format()` d'une chaine.
173
174        #### Parametres
175
176        param : TYPE dictionnaire
177            DESCRIPTION exemple:
178
179            {'label' : "Document",
180             'propsF' :"{typeDoc:'exercice',
181                         titre:'co01'
182                         discipline: 'mathématique}"}.
183
184        #### Renvoie
185
186        TYPE chaine de caractères
187        DESCRIPTION requête cypher.
188
189        """
190        req = "CREATE (n: {label} {propsF})"
191        req = req.format(**param)
192        return req
193
194    def do_cypher_tx(self, tx, cypher):
195        """
196        Exécute une requête cypher et renvoie les valeurs retournées.
197
198        #### Parametres
199
200        tx: TYPE transaction neo4j DESCRIPTION lié à la session neo4j
201        *pas clair!*
202
203        cypher: TYPE chaine de caractères DESCRIPTION requête cypher
204
205        #### Renvoie
206
207        TYPE liste
208
209        DESCRIPTION valeurs retournées par la requête
210        """
211        result = tx.run(cypher)
212        values = [record.values() for record in result]
213        return values
class Maquis:
 23class Maquis:
 24    """
 25    Classe Maquis. Interface la base de données neo4j.
 26    - exécute les requêtes de mise à jour de la partie de la base associée au dépôt.
 27    - présente dans la propriété `.log` le journal de l'exécution des requêtes.
 28
 29    """
 30
 31    def __init__(self, data, specific_results):
 32        """
 33        Instancie la classe
 34
 35        #### Paramètres
 36        - data : dictionnaire `manifeste['context']` du module d'Initialisation.
 37    
 38        - specific_results : dictionnaire de données de contextalisation extraites du dépôt par le module d'exécution locale spécifique.
 39    
 40        #### Propriétés
 41        - `.log` : journal
 42        - `.connect_data` : `manifeste['context']` données de connexion.
 43        - `.specific_results` : données extraites du dépot par l'exécution locale spécifique
 44    
 45        #### Renvoie
 46
 47        None.
 48
 49        """
 50        self.connect_data = data
 51        self.specific_results = specific_results
 52        self.log = "\t Initialisation de la classe Maquis \n"
 53
 54        print("coucou du module graphdb")
 55
 56        lineprefix = "\n \t \t"
 57
 58        # Importation du module spécifique
 59        module = data['modulespec']
 60        if module:
 61            try:
 62                specific = importlib.import_module(module)
 63                self.log += lineprefix
 64                self.log += "Importation du module spécifique " + module
 65                # exécution des scripts de contextualisation
 66                self.log += specific.exec(self)
 67            except ImportError as error:
 68                self.log += lineprefix + "Module " + error.name + " pas trouvé"
 69
 70
 71    def format_cypher_RETURN(self, param):
 72        """
 73        Renvoie une requête cypher de type `RETURN`.
 74
 75        Dans la chaîne modèle
 76
 77            "MATCH (n: {label} {propsF}) RETURN {propsR}"
 78
 79        remplace les variables entre accolades par les valeurs dans `param`.
 80        Utilise la méthode `.format()` d'une chaine.
 81
 82        #### Parametres
 83
 84        param : TYPE dictionnaire
 85            DESCRIPTION exemple:
 86
 87            {'label': "Document",
 88             'propsF':" {typeDoc:'problème'}",
 89             'propsR': "n.titre, n.description"}.
 90
 91        #### Renvoie
 92
 93        TYPE chaine de caractères
 94        DESCRIPTION requête cypher.
 95
 96        """
 97        req = "MATCH (n: {label} {propsF}) RETURN {propsR}"
 98        req = req.format(**param)
 99        return req
100
101    def format_cypher_DELETE(self, param):
102        """
103        Renvoie une requête cypher de type `DETACH DELETE`.
104
105        ATTENTION ! Ce type de requte est à manier avec précaution.
106         Toujours vérifier ce qui sera détruit.
107
108        Dans la chaîne modèle
109
110            "MATCH (n: {label} {propsF}) DETACH DELETE n"
111
112        remplace les variables entre accolades par les valeurs dans `param`.
113        Utilise la méthode `.format()` d'une chaine.
114
115        #### Parametres
116
117        param : TYPE dictionnaire
118           DESCRIPTION exemple pour supprimer le problème de titre 'grpe2'
119           dans la base:
120
121            {'label' : "Document",
122             'propsF' :"{typeDoc:'problème' titre:'grpe2'}"}
123
124        #### Renvoie
125
126        TYPE chaine de caractères
127        DESCRIPTION requête cypher.
128
129        """
130        req = "MATCH (n: {label} {propsF}) DETACH DELETE n"
131        req = req.format(**param)
132        return req
133
134    def format_cypher_SET(self, param):
135        """
136        Renvoie une requête cypher de type `SET`.
137
138        Dans la chaîne modèle
139
140            "MATCH (n: {label} {propsF}) SET {propsV}"
141
142        remplace les variables entre accolades par les valeurs dans `param`.
143        Utilise la méthode `.format()` d'une chaine.
144
145        #### Parametres
146
147        param : TYPE dictionnaire
148            DESCRIPTION exemple:
149
150            {'label' : "Document",
151             'propsF' :"{typeDoc:'problème'}",
152             'propsV' : "n.description = tagada"}.
153
154        #### Renvoie
155
156        TYPE chaine de caractères
157        DESCRIPTION requête cypher.
158
159        """
160        req = "MATCH (n: {label} {propsF}) SET {propsV}"
161        req = req.format(**param)
162        return req
163
164    def format_cypher_CREATE(self, param):
165        """
166        Renvoie une requête cypher de type `CREATE`.
167
168        Dans la chaîne modèle
169
170            "CREATE (n: {label} {propsF})"
171
172        remplace les variables entre accolades par les valeurs dans `param`.
173        Utilise la méthode `.format()` d'une chaine.
174
175        #### Parametres
176
177        param : TYPE dictionnaire
178            DESCRIPTION exemple:
179
180            {'label' : "Document",
181             'propsF' :"{typeDoc:'exercice',
182                         titre:'co01'
183                         discipline: 'mathématique}"}.
184
185        #### Renvoie
186
187        TYPE chaine de caractères
188        DESCRIPTION requête cypher.
189
190        """
191        req = "CREATE (n: {label} {propsF})"
192        req = req.format(**param)
193        return req
194
195    def do_cypher_tx(self, tx, cypher):
196        """
197        Exécute une requête cypher et renvoie les valeurs retournées.
198
199        #### Parametres
200
201        tx: TYPE transaction neo4j DESCRIPTION lié à la session neo4j
202        *pas clair!*
203
204        cypher: TYPE chaine de caractères DESCRIPTION requête cypher
205
206        #### Renvoie
207
208        TYPE liste
209
210        DESCRIPTION valeurs retournées par la requête
211        """
212        result = tx.run(cypher)
213        values = [record.values() for record in result]
214        return values

Classe Maquis. Interface la base de données neo4j.

  • exécute les requêtes de mise à jour de la partie de la base associée au dépôt.
  • présente dans la propriété .log le journal de l'exécution des requêtes.
Maquis(data, specific_results)
31    def __init__(self, data, specific_results):
32        """
33        Instancie la classe
34
35        #### Paramètres
36        - data : dictionnaire `manifeste['context']` du module d'Initialisation.
37    
38        - specific_results : dictionnaire de données de contextalisation extraites du dépôt par le module d'exécution locale spécifique.
39    
40        #### Propriétés
41        - `.log` : journal
42        - `.connect_data` : `manifeste['context']` données de connexion.
43        - `.specific_results` : données extraites du dépot par l'exécution locale spécifique
44    
45        #### Renvoie
46
47        None.
48
49        """
50        self.connect_data = data
51        self.specific_results = specific_results
52        self.log = "\t Initialisation de la classe Maquis \n"
53
54        print("coucou du module graphdb")
55
56        lineprefix = "\n \t \t"
57
58        # Importation du module spécifique
59        module = data['modulespec']
60        if module:
61            try:
62                specific = importlib.import_module(module)
63                self.log += lineprefix
64                self.log += "Importation du module spécifique " + module
65                # exécution des scripts de contextualisation
66                self.log += specific.exec(self)
67            except ImportError as error:
68                self.log += lineprefix + "Module " + error.name + " pas trouvé"

Instancie la classe

Paramètres

  • data : dictionnaire manifeste['context'] du module d'Initialisation.

  • specific_results : dictionnaire de données de contextalisation extraites du dépôt par le module d'exécution locale spécifique.

Propriétés

  • .log : journal
  • .connect_data : manifeste['context'] données de connexion.
  • .specific_results : données extraites du dépot par l'exécution locale spécifique

Renvoie

None.

def format_cypher_RETURN(self, param):
71    def format_cypher_RETURN(self, param):
72        """
73        Renvoie une requête cypher de type `RETURN`.
74
75        Dans la chaîne modèle
76
77            "MATCH (n: {label} {propsF}) RETURN {propsR}"
78
79        remplace les variables entre accolades par les valeurs dans `param`.
80        Utilise la méthode `.format()` d'une chaine.
81
82        #### Parametres
83
84        param : TYPE dictionnaire
85            DESCRIPTION exemple:
86
87            {'label': "Document",
88             'propsF':" {typeDoc:'problème'}",
89             'propsR': "n.titre, n.description"}.
90
91        #### Renvoie
92
93        TYPE chaine de caractères
94        DESCRIPTION requête cypher.
95
96        """
97        req = "MATCH (n: {label} {propsF}) RETURN {propsR}"
98        req = req.format(**param)
99        return req

Renvoie une requête cypher de type RETURN.

Dans la chaîne modèle

"MATCH (n: {label} {propsF}) RETURN {propsR}"

remplace les variables entre accolades par les valeurs dans param. Utilise la méthode .format() d'une chaine.

Parametres

param : TYPE dictionnaire DESCRIPTION exemple:

{'label': "Document",
 'propsF':" {typeDoc:'problème'}",
 'propsR': "n.titre, n.description"}.

Renvoie

TYPE chaine de caractères DESCRIPTION requête cypher.

def format_cypher_DELETE(self, param):
101    def format_cypher_DELETE(self, param):
102        """
103        Renvoie une requête cypher de type `DETACH DELETE`.
104
105        ATTENTION ! Ce type de requte est à manier avec précaution.
106         Toujours vérifier ce qui sera détruit.
107
108        Dans la chaîne modèle
109
110            "MATCH (n: {label} {propsF}) DETACH DELETE n"
111
112        remplace les variables entre accolades par les valeurs dans `param`.
113        Utilise la méthode `.format()` d'une chaine.
114
115        #### Parametres
116
117        param : TYPE dictionnaire
118           DESCRIPTION exemple pour supprimer le problème de titre 'grpe2'
119           dans la base:
120
121            {'label' : "Document",
122             'propsF' :"{typeDoc:'problème' titre:'grpe2'}"}
123
124        #### Renvoie
125
126        TYPE chaine de caractères
127        DESCRIPTION requête cypher.
128
129        """
130        req = "MATCH (n: {label} {propsF}) DETACH DELETE n"
131        req = req.format(**param)
132        return req

Renvoie une requête cypher de type DETACH DELETE.

ATTENTION ! Ce type de requte est à manier avec précaution. Toujours vérifier ce qui sera détruit.

Dans la chaîne modèle

"MATCH (n: {label} {propsF}) DETACH DELETE n"

remplace les variables entre accolades par les valeurs dans param. Utilise la méthode .format() d'une chaine.

Parametres

param : TYPE dictionnaire DESCRIPTION exemple pour supprimer le problème de titre 'grpe2' dans la base:

{'label' : "Document",
 'propsF' :"{typeDoc:'problème' titre:'grpe2'}"}

Renvoie

TYPE chaine de caractères DESCRIPTION requête cypher.

def format_cypher_SET(self, param):
134    def format_cypher_SET(self, param):
135        """
136        Renvoie une requête cypher de type `SET`.
137
138        Dans la chaîne modèle
139
140            "MATCH (n: {label} {propsF}) SET {propsV}"
141
142        remplace les variables entre accolades par les valeurs dans `param`.
143        Utilise la méthode `.format()` d'une chaine.
144
145        #### Parametres
146
147        param : TYPE dictionnaire
148            DESCRIPTION exemple:
149
150            {'label' : "Document",
151             'propsF' :"{typeDoc:'problème'}",
152             'propsV' : "n.description = tagada"}.
153
154        #### Renvoie
155
156        TYPE chaine de caractères
157        DESCRIPTION requête cypher.
158
159        """
160        req = "MATCH (n: {label} {propsF}) SET {propsV}"
161        req = req.format(**param)
162        return req

Renvoie une requête cypher de type SET.

Dans la chaîne modèle

"MATCH (n: {label} {propsF}) SET {propsV}"

remplace les variables entre accolades par les valeurs dans param. Utilise la méthode .format() d'une chaine.

Parametres

param : TYPE dictionnaire DESCRIPTION exemple:

{'label' : "Document",
 'propsF' :"{typeDoc:'problème'}",
 'propsV' : "n.description = tagada"}.

Renvoie

TYPE chaine de caractères DESCRIPTION requête cypher.

def format_cypher_CREATE(self, param):
164    def format_cypher_CREATE(self, param):
165        """
166        Renvoie une requête cypher de type `CREATE`.
167
168        Dans la chaîne modèle
169
170            "CREATE (n: {label} {propsF})"
171
172        remplace les variables entre accolades par les valeurs dans `param`.
173        Utilise la méthode `.format()` d'une chaine.
174
175        #### Parametres
176
177        param : TYPE dictionnaire
178            DESCRIPTION exemple:
179
180            {'label' : "Document",
181             'propsF' :"{typeDoc:'exercice',
182                         titre:'co01'
183                         discipline: 'mathématique}"}.
184
185        #### Renvoie
186
187        TYPE chaine de caractères
188        DESCRIPTION requête cypher.
189
190        """
191        req = "CREATE (n: {label} {propsF})"
192        req = req.format(**param)
193        return req

Renvoie une requête cypher de type CREATE.

Dans la chaîne modèle

"CREATE (n: {label} {propsF})"

remplace les variables entre accolades par les valeurs dans param. Utilise la méthode .format() d'une chaine.

Parametres

param : TYPE dictionnaire DESCRIPTION exemple:

{'label' : "Document",
 'propsF' :"{typeDoc:'exercice',
             titre:'co01'
             discipline: 'mathématique}"}.

Renvoie

TYPE chaine de caractères DESCRIPTION requête cypher.

def do_cypher_tx(self, tx, cypher):
195    def do_cypher_tx(self, tx, cypher):
196        """
197        Exécute une requête cypher et renvoie les valeurs retournées.
198
199        #### Parametres
200
201        tx: TYPE transaction neo4j DESCRIPTION lié à la session neo4j
202        *pas clair!*
203
204        cypher: TYPE chaine de caractères DESCRIPTION requête cypher
205
206        #### Renvoie
207
208        TYPE liste
209
210        DESCRIPTION valeurs retournées par la requête
211        """
212        result = tx.run(cypher)
213        values = [record.values() for record in result]
214        return values

Exécute une requête cypher et renvoie les valeurs retournées.

Parametres

tx: TYPE transaction neo4j DESCRIPTION lié à la session neo4j pas clair!

cypher: TYPE chaine de caractères DESCRIPTION requête cypher

Renvoie

TYPE liste

DESCRIPTION valeurs retournées par la requête