# Persistance et bases de données ###### tags: `cours` ## Redis (2009) - Stocker les variables des applications à l'extérieur des applications. - En C Redis et Cli Jedis: client java redis-py: client python Fait pour du stockage en RAM (rapide) Pas d'interprétation de la valeur (pas de jointure, filtres...) ## String set key tot world set key expire.. ttl key .. mset a 10 b 10 ## list rpush list A lpush list B lrange list 0 -1 rpop lpop ltrim list _ _ brpop list2 ## hash hmset key:foo name enseirb adress talence creation 1900 hget ## set sadd sett 1 0 7 9 7 smembers sett sdel sett Intersection: sinter personne1 personne2 .... type foo keys regex zremrangebyscore deck _ _ zrangebyscore -inf +inf zrank deck _ pfadd SCAN 0 set: String dans clef push: Elements dans list `docker-compose up --build -d` see corrections Moodle ## MongoDB - Codé en C++ - Utilisé avec Javascript, JSON ou plutôt.. BSON - Utilisée pour la gestion de documents - Eviter jointures BSON: On étend JSON avec des timestamps, coordonées géographiques Exemple: "new Date('')", ObjectId(), NumberLong()... MongoDB - Database - Collections - Documents database always refered to db. `db.aCollection.insertOne({x:1})` `db.aCollection.insertMany( [{x:1}, ...` `db.aCollection.find({age: { $gt : 18}}, ...` `db.aCollection.updateMany( filter, $set: {...,...}` updateOne replaceOne createView() -> restreint visibilité, read only, dématérialisée $merge into -> vue matérialisée, read-write au moins: $all $in : {"toto", "tat"} $or [..., ..., ] $and $size $sum: "$amount" ORDRE important. PLus on a d'index plus c'est rapide en lecture, plus c'est lent en écriture. 1) filtre 2) projection pas hésiter à créer des collections, prend pas bcp de place ### Clusters Noeufs = shards Chaque shard a des chunks (ensemble de shard keys) Cette répartition doit être bien pensée car on souhaite faire des recherches sur un minimum de chunks. Il faut que les chunks soient équitablement répartis. --> shard key composées, attention aux key croissants ### TP (page 47) #### Find 1) {categories : "Python"} 2) {categories : "Python", pageCount : { \$lt: 500}} 3) {\$and : [{\$or : [{pageCount : { \$gt: 1000}}, {pageCount: { \$lt: 300}}]}, {pageCount: { $ne : 0 }}]} 4) collection.find({ arrayElementName: { \$exists: true, $not: {\$size: 0} } }) #### Agrégation page 22: https://moodle.bordeaux-inp.fr/pluginfile.php/189335/mod_resource/content/1/2021-10-12_mongodb.pdf 1) ```json {$group { _id: "$status", count:{$sum : 1} } } ``` 2) ```json { {$wind { path: "$authors" } } {$group { _id: "$authors", totalNbPages: {$sum: "$pageCount"} } } } ``` 3) Changer le `$group` pour pousser les livres/isbn: ```json { _id: "$authors", totalPages: { $sum: "$pageCount" }, books: { $push: { "title": "$title", "isbn": "$isbn" } } } ``` Rajouter un `$sort` inversé: ```json { totalPages: -1 } ``` Enlever la string vide avec un `$match`: ```json { "_id": { "$ne": "" } } ``` Et un `$limit` pour n’avoir que les 3 premiers. ``` ``` ## Neo4j (graphes) ### Intro - Titan - ArangoDB - Neptune (AWS) - Neo4j Aura (cloud) - graphes des pages web - des réseaux sociaux - ... beaucoup de *relations* ==> fait pour l'analyse des groupes etc ## Requêtes **Pour les noeuds:** `()` - (matrix) - `(:Movie)` : de label/type Movie - `(matrix:Movie)` : variable matrix de label Movie - `(matrix:Movie {title: 'The matrix; relased: 1997'})` `CREATE (:Person:Actor {name: 'Tom Hanks', born: 1956})` **Pour les relations:** `-->` - necessité du type - possiblité de propriétés de description - relation disstance - possibilité autoréférence `CREATE -(:Person:Actor {name: 'Tom Hanks', born: 1956})` filtrer selon propriétés, relation, label du nom ### TP ``` CREATE (f:Objet:Couvert {name: 'fourchette', prix: 3}) CREATE (c:Objet:Couvert {name: 'couteau', prix: 2}) CREATE (s:Objet:Aliment {name: 'steak', prix: 6}) CREATE (f)-[pi:PIQUE]->(s) CREATE (c)-[co:COUPE]->(s) ``` ``` MERGE (f:Objet:Couvert {name: 'fourchette'}) ON CREATE SET f.prix = 3 MERGE (c:Objet:Couvert {name: 'couteau'}) ON CREATE SET c.prix = 2 MERGE (s:Objet:Aliment {name: 'steak'}) ON CREATE SET s.prix = 6 ``` ``` MATCH (o:Objet) WHERE o.prix >= 3 RETURN o ``` ``` MATCH (c:Objet:Couvert) WHERE c.prix >= 3 RETURN c ``` ``` MATCH (c:Couvert {name: 'fourchette'}) RETURN c ``` ``` MATCH (c:Objet)-[:COUPE]->(:Objet) RETURN c ``` ``` MATCH (c:Objet {prix: 3})-[f:PIQUE]->(a:Objet) RETURN c, f, a ``` ``` MATCH (t:Person {name: 'Tom Hanks'})-[role:ACTED_IN]->(m:Movie) MATCH (p:Person) RETURN p, role, m ``` ``` MATCH(n) DETACH DELETE n ``` ``` MATCH(n) RETURN n ```