maintenance.bdg_mathCours

La contextualisation du dépôt de cours consiste à s'assurer que la base en graphe reflète les textes de cours et leurs méta-données locales. Ces méta-données sont définies par l'auteur c'est à dire écrites dans le dépôt local. La modification d'une méta-donnée de ce type se fait dans le dépôt et non dans la base en graphe.

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

La fonction exec() est appelée lors de l'instanciation de la classe Maquis. Elle maintient cette cohérence en exécutant des requêtes cypher.

Quelles sont les méta-données définies par l'auteur d'un problème?

  • des index

Noeud associé à un texte de cours.

Un noeud labélisé Document est associé à un texte de cours C et caractérisé par sa propriété titre qui est égale au titre dans le fichier Latex et pas au nom du fichier.
Exemple pour le fichier C1616.tex. Les premières lignes du fichier sont: \input{courspdf.tex}

\debutcours{TFCA - Primitives et équations différentielles linéaires}{0.3   iny{    oday}}

\section{Calculs de primitives.}
Les démonstrations des résultats admis dans cette section sont proposés dans le chapitre \href{aseurl C2190.pdf}{Intégrales et primitives}.

\subsection{Définition et primitives usuelles.}
\subsubsection{Résultats admis.}
egin{defi}
Une primitive d'une fonction $f$ définie dans un intervalle $I$ à valeurs complexes est une fonction $F$ dérivable dans $I$ et dont la dérivée est $f$. 
\end{defi}

Les lignes suivantes présentent la requête cypher pour extraire ce noeud

MATCH (c:Document {typeDoc:"cours", titre:"Primitives et équations différentielles linéaires"}) RETURN c

et le noeud renvoyé

{
  "identity": 0,
  "labels": [
    "Document"
  ],
  "properties": {
    "date": "2013-10-03T06:00:57Z",
    "titre": "Primitives et équations différentielles linéaires",
    "typeDoc": "cours",
    "urlSrc": "https://github.com/nicolair/math-cours/blob/master/C1616.tex",
    "discipline": "mathématiques",
    "url": "https://maquisdoc-math.fra1.digitaloceanspaces.com/math-cours/C1616.pdf"
  },
  "elementId": "0"
}

Index définis dans un texte de cours.

Les index sont définis dans la source LateX par la commande \index. Lors de la compilation, un fichier .idx est créé qui permet localement d'associer l'index et le texte de cours. Du côté de la base en graphe, un index est un noeud labelisé Concept. Une arête labélisée INDEXE issue du noeud associé au texte de cours pointe vers le noeud associé à l'index.

  1#!/usr/bin/env python3
  2# -*- coding: utf-8 -*-
  3"""
  4La contextualisation du dépôt de cours consiste à s'assurer que la base en graphe reflète les textes de cours et leurs méta-données locales. Ces méta-données sont définies par l'auteur c'est à dire écrites dans le dépôt local. La modification d'une méta-donnée de ce type se fait dans le dépôt et non dans la base en graphe.
  5
  6Modifié le 30/03/23 @author: remy
  7
  8La fonction `exec()` est appelée lors de l'instanciation de la classe `Maquis`. Elle maintient cette cohérence en exécutant des requêtes cypher.
  9
 10Quelles sont les méta-données définies par l'auteur d'un problème?
 11- des index
 12
 13#### Noeud associé à un texte de cours.
 14
 15Un noeud labélisé `Document` est associé à un texte de cours `C` et caractérisé par sa propriété titre qui est égale au titre dans le fichier Latex et pas au nom du fichier.  
 16Exemple pour le fichier C1616.tex.
 17Les premières lignes du fichier sont:
 18    \input{courspdf.tex}
 19    
 20    \debutcours{TFCA - Primitives et équations différentielles linéaires}{0.3 \tiny{\today}}
 21    
 22    \section{Calculs de primitives.}
 23    Les démonstrations des résultats admis dans cette section sont proposés dans le chapitre \href{\baseurl C2190.pdf}{Intégrales et primitives}.
 24    
 25    \subsection{Définition et primitives usuelles.}
 26    \subsubsection{Résultats admis.}
 27    \begin{defi}
 28    Une primitive d'une fonction $f$ définie dans un intervalle $I$ à valeurs complexes est une fonction $F$ dérivable dans $I$ et dont la dérivée est $f$. 
 29    \end{defi}
 30
 31Les lignes suivantes présentent la requête cypher pour extraire ce noeud 
 32
 33    MATCH (c:Document {typeDoc:"cours", titre:"Primitives et équations différentielles linéaires"}) RETURN c
 34    
 35et le noeud renvoyé
 36
 37    {
 38      "identity": 0,
 39      "labels": [
 40        "Document"
 41      ],
 42      "properties": {
 43        "date": "2013-10-03T06:00:57Z",
 44        "titre": "Primitives et équations différentielles linéaires",
 45        "typeDoc": "cours",
 46        "urlSrc": "https://github.com/nicolair/math-cours/blob/master/C1616.tex",
 47        "discipline": "mathématiques",
 48        "url": "https://maquisdoc-math.fra1.digitaloceanspaces.com/math-cours/C1616.pdf"
 49      },
 50      "elementId": "0"
 51    }
 52    
 53#### Index définis dans un texte de cours.
 54
 55Les index sont définis dans la source LateX par la commande `\index`. Lors de la compilation, un fichier `.idx` est créé qui permet localement d'associer l'index et le texte de cours. Du côté de la base en graphe, un index est un noeud labelisé `Concept`. Une arête labélisée `INDEXE` issue du noeud associé au texte de cours pointe vers le noeud associé à l'index.
 56
 57"""
 58import neo4j
 59
 60def exec(self):
 61    """
 62    Exécution des requêtes spécifques de maintenance de la base.
 63    - récupération des descriptions dans la base 
 64    - supprimer dans la base les problèmes absents localement
 65    - créer dans la base les problèmes locaux manquants
 66    - si description locale et distante différentes,
 67        - copier description locale sur distante
 68    - afficher les indexations locales
 69
 70    #### Renvoie
 71
 72    log: str journal
 73
 74    """
 75    print("coucou de exec() dans bdg_mathCours.py")
 76    
 77    data = self.connect_data
 78    URI = data['credentials']['URI']
 79    user = data['credentials']['user']
 80    password = data['credentials']['password']
 81    AUTH = (user, password)
 82    
 83    loc_indexations = self.specific_results['indexations']
 84    loc_titres = self.specific_results['titres']
 85    print("\n Titres des textes de cours locaux")
 86    print(loc_titres)
 87    
 88    # noeuds textes de cours
 89    param = {'label' : "Document", 
 90             'propsF' :'{typeDoc:"cours", discipline:"mathématique"}', 
 91             'propsR' : 'substring(n.urlSrc,51), n.titre'}
 92    req = self.format_cypher_RETURN(param)
 93    with neo4j.GraphDatabase.driver(URI, auth=AUTH).session(database="neo4j") as session:
 94        rem_cours = session.execute_read(self.do_cypher_tx, req)
 95    print("\n Titres des noeuds textes de cours")
 96    rem_cours.sort(key=lambda paire: paire[0])
 97    print(rem_cours)
 98    
 99    # Nbs de textes de cours
100    blabla = "\n Nbs de textes de cours. local: {nloc},  base: {nrem}"
101    blabla = blabla.format(
102        nloc= len(loc_titres), nrem=len(rem_cours))
103    print(blabla)
104
105    # indexations
106    indexe(self,loc_indexations)
107
108
109    log = ""
110    return log
111
112def indexe(self, loc_indexations):
113    '''
114        Assure que des relations `INDEXE` sont associées aux indexations locales.
115    '''
116    print("\n coucou de indexe()")
117    data = self.connect_data
118    URI = data['credentials']['URI']
119    user = data['credentials']['user']
120    password = data['credentials']['password']
121    AUTH = (user, password)
122
123    # indexations dans le graphe
124    req = ''' MATCH (p:Document {typeDoc:"cours"}) -[:INDEXE]-> (c:Concept)
125    RETURN "A" + p.titre, c.litteral
126    '''
127    #print(req)
128    with neo4j.GraphDatabase.driver(URI, auth=AUTH).session(database="neo4j") as session:
129        rem_indexations = session.execute_write(self.do_cypher_tx, req)
130
131    print("\n Indexations dans le graphe")
132    print(rem_indexations)
133    print("\n Indexations locales: {0}".format(len(loc_indexations)))
134    print(loc_indexations)
135"""
136        # création des indexations manquantes dans le graphe
137    req = ''' MATCH (p:Document {{typeDoc:"problème", titre: "{0}"}})
138    MERGE (c:Concept {{litteral:"{1}"}})
139    CREATE (p)-[:INDEXE]->(c)
140    '''
141    rem_index_orph = []
142    for index in loc_indexations :
143        if index not in rem_indexations:
144            nom = index[0][1:]
145            concept = index[1]
146            req1 = req.format(nom, concept)
147            print(nom, concept, req1)
148            with neo4j.GraphDatabase.driver(URI, auth=AUTH).session(database="neo4j") as session:
149                val = session.execute_write(self.do_cypher_tx, req1)
150
151"""
def exec(self):
 61def exec(self):
 62    """
 63    Exécution des requêtes spécifques de maintenance de la base.
 64    - récupération des descriptions dans la base 
 65    - supprimer dans la base les problèmes absents localement
 66    - créer dans la base les problèmes locaux manquants
 67    - si description locale et distante différentes,
 68        - copier description locale sur distante
 69    - afficher les indexations locales
 70
 71    #### Renvoie
 72
 73    log: str journal
 74
 75    """
 76    print("coucou de exec() dans bdg_mathCours.py")
 77    
 78    data = self.connect_data
 79    URI = data['credentials']['URI']
 80    user = data['credentials']['user']
 81    password = data['credentials']['password']
 82    AUTH = (user, password)
 83    
 84    loc_indexations = self.specific_results['indexations']
 85    loc_titres = self.specific_results['titres']
 86    print("\n Titres des textes de cours locaux")
 87    print(loc_titres)
 88    
 89    # noeuds textes de cours
 90    param = {'label' : "Document", 
 91             'propsF' :'{typeDoc:"cours", discipline:"mathématique"}', 
 92             'propsR' : 'substring(n.urlSrc,51), n.titre'}
 93    req = self.format_cypher_RETURN(param)
 94    with neo4j.GraphDatabase.driver(URI, auth=AUTH).session(database="neo4j") as session:
 95        rem_cours = session.execute_read(self.do_cypher_tx, req)
 96    print("\n Titres des noeuds textes de cours")
 97    rem_cours.sort(key=lambda paire: paire[0])
 98    print(rem_cours)
 99    
100    # Nbs de textes de cours
101    blabla = "\n Nbs de textes de cours. local: {nloc},  base: {nrem}"
102    blabla = blabla.format(
103        nloc= len(loc_titres), nrem=len(rem_cours))
104    print(blabla)
105
106    # indexations
107    indexe(self,loc_indexations)
108
109
110    log = ""
111    return log

Exécution des requêtes spécifques de maintenance de la base.

  • récupération des descriptions dans la base
  • supprimer dans la base les problèmes absents localement
  • créer dans la base les problèmes locaux manquants
  • si description locale et distante différentes,
    • copier description locale sur distante
  • afficher les indexations locales

Renvoie

log: str journal

def indexe(self, loc_indexations):
113def indexe(self, loc_indexations):
114    '''
115        Assure que des relations `INDEXE` sont associées aux indexations locales.
116    '''
117    print("\n coucou de indexe()")
118    data = self.connect_data
119    URI = data['credentials']['URI']
120    user = data['credentials']['user']
121    password = data['credentials']['password']
122    AUTH = (user, password)
123
124    # indexations dans le graphe
125    req = ''' MATCH (p:Document {typeDoc:"cours"}) -[:INDEXE]-> (c:Concept)
126    RETURN "A" + p.titre, c.litteral
127    '''
128    #print(req)
129    with neo4j.GraphDatabase.driver(URI, auth=AUTH).session(database="neo4j") as session:
130        rem_indexations = session.execute_write(self.do_cypher_tx, req)
131
132    print("\n Indexations dans le graphe")
133    print(rem_indexations)
134    print("\n Indexations locales: {0}".format(len(loc_indexations)))
135    print(loc_indexations)

Assure que des relations INDEXE sont associées aux indexations locales.