NoSQL Cours PDF [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

I Les bases de données NoSQL A N A A N E l i d A Adil ENAANAI

[email protected]

Département d’Informatique Sup’Technology-Casablanca-

PLAN

I A

Introduction

N A

MongoDB

A N

Cassandra

E il

Neo4J

d A

I A

N A

Chapitre 1 Introduction aux bases de données NoSQL

A N

d A

E il

Introduction Les bases de données relationnelles

I A

Les bases de données de données relationnelles sont basées sur trois éléments : • Structure de données • Des contraintes • Des opérations

N A

A N

E il

Limites:

• La distribution de données sur plusieurs serveurs devient impossible dans le cas où il y’a un très grand nombre de relations. • Le temps consacré à la vérification des contraintes est élevé par rapport au simple stockage sans contraintes. • Les données doivent suivre la structure d’un schéma défini préalablement. Donc, il n y’a pas de possibilité de sauvegarder des données semi structurées

d A

Introduction Pourquoi NoSQL?

I A

Avec l’augmentation exponentielle des données mondiales, on a commencé à analyser et traiter les données massives (Big data). Donc, il est nécessaire de concevoir un SGBD léger qui garantit les points suivants: • • • • • •

Distribution des données La haut disponibilité La tolérance aux pannes L’extensibilité horizontale L’hétérogénéité de données La rapidité

d A

E il

A N

N A

Introduction Types de bases de données

I A

N A

A N

d A

E il

Introduction NoSQL orientées colonnes Structure

I A

N A

A N

d A

E il

Introduction NoSQL orientées colonnes Exemple

I A

Personnel Row Key

Prénom

Contact

N A

Age

Juvénal timestamp: 10/09/2011 13:05:17:09

00001

téléphone

ville

22 06 90 98 76 52 timestamp: timestamp: 10/09/2011 13:05:17:09 10/09/2011 13:05:17:09

Douala timestamp: 10/09/2011 13:05:17:09

25 timestamp: 20/09/2013 15:00:05:09

Lille timestamp: 20/09/2013 15:00:05:09

A N

E il

d A

Paris timestamp: 30/10/2016 16:18:50:10

00002

Paul timestamp: 10/09/2011 13:10:05:09

30 07 90 94 86 52 timestamp: 10/09/2011 timestamp: 13:10:05:09 10/09/2011 13:10:05:09

Nancy timestamp: 10/09/2011 13:10:05:09

00003

Jean timestamp: 12/09/2011 11:30:20:09

34 06 74 98 76 25 timestamp: timestamp: 12/09/2011 11:30:20:09 12/09/2011 11:30:20:09

Marseille timestamp: 12/09/2011 11:30:20:09

Introduction NoSQL orientées document Structure

I A

N A

A N

d A

E il

Introduction NoSQL orientées document Exemple

I A

N A

A N

d A

E il

Introduction NoSQL orientées Clé/Valeur Structure

I A

Exemple

N A

A N

d A

E il

Introduction NoSQL orientées Graphe Structure

I A

N A

A N

d A

E il

Introduction NoSQL orientées Graphe Exemple

I A

N A

A N

d A

E il

Introduction Notion de cluster

I A

Un Cluster est un ensemble de machines interconnectées. Les données d’une base NoSQL sont distribuées sur les différentes machines

N A

A N

d A

E il

Introduction Le partitionnement (Sharding) Le partitionnement consiste à • découper une (grande) collection en fragments en fonction d’une clé • placer chaque fragment sur un serveur • Maintenir un répertoire indiquant que telle clé se trouve dans tel fragment sur tel serveur Le partitionnement apporte la répartition de charge (load balancing ) Il doit être dynamique (ajout/retrait de serveurs) pour s’adapter “élastiquement” S’applique à des collections de paires (clé, valeur), où valeur est n’importe quelle information structurée.

I A

N A

A N

d A

E il

Introduction Le partitionnement (Sharding)

I A

La clé de partitionnement

La clé indique à quel fragment appartient un document. Si un grand nombre de documents partagent la même clé, ils ne peuvent être que dans le même fragment => le système perd en souplesse de distribution. La valeur de la clé pour un document ne devrait pas être modifiable (nécessité de déplacement). L’identifiant séquentiel d’un document est un bon choix

N A

A N

d A

E il

Introduction Le partitionnement (Sharding)

I A

Avec catalogue Où se trouve l’élément de clé #13?

N A

A N

E il

La clé #13 se trouve dans le serveur 2

Client

d A Server1

Server2

Server3

Server4

Server5

Introduction Distribution de données

I A

Dans un cluster, les partitions dans une table sont réparties entre plusieurs nœuds. Il y a 2 façons de répartir les données : 1) De manière ordonnée, chaque nœud prend en charge une plage de clé de partition triée par ordre croissant.

A N

N A

d A

E il

Exemple : si la clé de partition est le nom de famille, les noms commençant entre A et E se répartissent sur le noeud1, entre F et J sur le noeud2 etc...

Introduction Distribution de données

I A

Dans un cluster, les partitions dans une table sont réparties entre plusieurs nœuds. Il y a 2 façons de répartir les données : 2) De manière aléatoire, chaque nœud prend en charge une plage de la clé de partition distribuée uniformément Si l'on prend le hash MD5, la valeur du token se situe dans l'intervalle [0 .. 2127-1]. On répartit uniformément cette plage de valeur de token entre les différents noeuds du cluster.

A N

N A

d A

E il

Introduction Distribution de données

I A

Le nœud coordinateur Dans un cluster, les partitions dans une table sont réparties entre plusieurs nœuds. Il y a 2 façons de répartir les données :

N A

Une architecture sans maître/esclave garantit l'absence de point unique de défaillance (SPOF). Par contre, pendant la durée d'une requête (lecture ou écriture), le client fournit toujours une #partition. Le noeud qui reçoit la requête ne l'exécute pas nécessairement en local car le hash de cette #partition ne tombe pas forcément dans la plage de hash dont il est responsable. Il va rediriger cette requête vers un autre noeud du cluster responsable de ces données. Dans ce cas là, il jouera le rôle de noeud coordinateur pour la requête actuelle.

A N

d A

E il

Introduction Distribution de données

I A

Le nœud coordinateur

N A

A N

d A

E il

Introduction Exemple de SGBD NoSQL

I A

N A

A N

d A

E il

N A

I A

Chapitre 2 MongoDB

A N

d A

E il

Installation Pour bien fonctionner, une base MongoDB a besoin de trois choses :

I A

1) L’installation du serveur, que vous pouvez télécharger ici: https://www.mongodb.com/download-center/community

N A

2) La création d’un répertoire pour stocker les données. Par exemple : C:\data\db (par défaut)

A N

E il

3) Le lancement du serveur, avec l’exécutable mongod (disponible sur $MONGO/bin)

d A

Installation Interface utilisateur

I A

Maintenant que le serveur tourne, on peut s’attaquer à son administration avec une interface graphique. Vous pouvez télécharger MongodbCompass par exemple: https://www.mongodb.com/download-center/compass

N A

A N

d A

E il

Solution cloud Vous pouvez aussi utiliser la solution cloud sur le lien: https://www.mongodb.com/cloud

I A

N A

A N

E il

d A

Cliquer sur « Login » et saisir vos données d’authentification si vous avez déjà un compte. Sinon cliquer sur « Get started now » et créer un compte

Solution cloud Dans le menu à gauche, cliquer sur « Projects », puis sur «New Project »

I A

N A

A N

E il

d A

Taper le nom de votre projet et cliquer sur « Next »

Solution cloud Dans le menu à gauche, cliquer sur « Projects », puis sur «New Project »

I A

N A

A N

E il

d A

Taper le nom de votre projet et cliquer sur « Next »

Solution cloud Cliquer sur « Create project »

I A

N A

A N

d A

E il

Solution cloud Quand vous voyez cet interface, cliquer sur « Build a Cluster »

I A

N A

A N

d A

E il

Solution cloud Sélectionner ensuite le choix qui vous convient

N A

I A

A N

d A

E il

Solution cloud Ensuite, choisissez le fournisseur Cloud que vous souhaitez et cliquer sur « Create Cluster »

I A

N A

A N

d A

E il

Solution cloud Quand votre Cluster et prêt, cliquer sur « Connect »

N A

I A

A N

d A

E il

Solution cloud Ecrire votre adresse IP et cliquer sur « Add IP Address »

I A

N A

Saisir les données d’authentification et cliquer sur « Create MongoDB User »

d A

E il

A N

Solution cloud Choisissez la méthode de gestion de base de données. Dans ce cours, nous allons utiliser La GUI MongoDBCompass

I A

N A

A N

d A

E il

Solution cloud Si vous n’avez pas encore téléchargé MongoDB Compass, vous pouvez le télécharger de cet interface.

I A

N A

A N

d A

E il

Copier le lien de connexion

Solution cloud Lancer maintenant MongoDB Compass et créer une nouvelle connexion

I A

N A

A N

Coller le lien que vous avez copié déjà

E il

d A

N’oublier pas de mettre votre mot de passe ici

Solution cloud Maintenant, vous pouvez voir la liste des bases de données, et même créer une

I A

N A

A N

d A

E il

Manipulation Lors de la création de la base de données SupTech, on vous propose de créer une collection (Table). Capped collection est une collection de taille fixe. Lorsqu’on atteint la fin, on commence à remplacer les anciens documents par les nouveaux

I A

N A

d A

E il

A N

Manipulation A chaque moment, vous pouvez créer une nouvelle collection en cliquant sur le +

Tester en créant la collection professeur

N A

Cliquer sur la collection « Etudiant » et commencer à manipuler la collection

A N

d A

E il

I A

Manipulation Importer les données externes

I A

Vous avez le choix entre l’importation de fichier JSON ou CSV

N A

A N

Dans ce cours, nous allons utiliser le fichier « Etudiants.json »

d A

E il

Manipulation Importer les données externes

I A

Vous pouvez voir vos données importées

N A

A N

d A

E il

Ajouter un nouveau document

Manipulation Importer les données externes

I A

Vous saisissez le document sous format JSON

N A

A N

d A

E il

MongoShell mongoShell

I A

Le mongoshell est une interface JavaScript interactive pour MongoDB. Vous pouvez utiliser le mongoshell pour interroger et mettre à jour des données ainsi que pour effectuer des opérations administratives. Assurez-vous que MongoDB est en cours d'exécution avant de tenter de démarrer le mongoshell.

N A

A N

E il

Ouvrez une fenêtre de terminal (ou une invite de commande pour Windows) et accédez à votre répertoire: /bin cd db.movie.insert({"name":“ENAANAI"}) >show dbs local 0.78125GB mydb 0.23012GB test 0.23012GB

d A

E il

Manipulation Les requêtes MongoDB -Supprimer une base de données-

I A

La commande MongoDB db.dropDatabase () est utilisée pour supprimer une base de données existante. db.dropDatabase()

N A

A N

Cela supprimera la base de données sélectionnée. Si vous n'avez sélectionné aucune base de données, elle supprimera la base de données «test» par défaut.

E il

>use mydb switched to db mydb >db.dropDatabase() >{ "dropped" : "mydb", "ok" : 1 } >

d A

Manipulation Les requêtes MongoDB -Créer une collection-

I A

La syntaxe de base de la commande createCollection () est la suivante: db.createCollection(name, options) Voici la liste des options que vous pouvez utiliser: Champ

N A

A N

Type

La description

capped

Booléen

(Facultatif) Si vrai, active une collection plafonnée. La collection plafonnée est une collection de taille fixe qui écrase automatiquement ses entrées les plus anciennes lorsqu'elle atteint sa taille maximale. Si vous spécifiez true, vous devez également spécifier le paramètre de taille.

autoIndexId

Booléen

(Facultatif) Si vrai, créez automatiquement un index sur _id field.s La valeur par défaut est false.

size

nombre

(Facultatif) Spécifie une taille maximale en octets pour une collection plafonnée. Si plafonné est vrai, vous devez également spécifier ce champ.

max

nombre

(Facultatif) Spécifie le nombre maximal de documents autorisés dans la collection plafonnée.

E il

d A

Manipulation Les requêtes MongoDB -Créer une collection-

I A

Examples

La syntaxe de base de la méthode createCollection () sans options est la suivante >use test switched to db test >db.createCollection("mycollection") { "ok" : 1 } >

N A

A N

d A

E il

Vous pouvez vérifier la collection créée à l'aide de la commande show collections . >show collections mycollection system.indexes

Manipulation Les requêtes MongoDB -Créer une collection-

I A

Examples

L'exemple suivant montre la syntaxe de la méthode createCollection () avec quelques options importantes:

N A

A N

> db.createCollection("mycol", { capped : true, autoIndexID : true, size : 6142800, max : 10000 } ){ "ok" : 0, "errmsg" : "BSON field 'create.autoIndexID' is an unknown field.", "code" : 40415, "codeName" : "Location40415" } > Dans MongoDB, vous n'avez pas besoin de créer de collection. MongoDB crée automatiquement une collection lorsque vous insérez un document.

d A

E il

Manipulation Les requêtes MongoDB -Insérer un document-

I A

La syntaxe de base de la commande insert () est la suivante: >db.COLLECTION_NAME.insert(document)

N A

Exemple

A N

> db.users.insert({ ... _id : ObjectId("507f191e810c19729de860ea"), ... title: "MongoDB", ... description: "MongoDB is no sql database", ... by: "Adil ENAANAI", Vous pouvez également passer ... url: "https://www.mongodb.com", ... tags: ['mongodb', 'database', 'NoSQL'], un tableau de documents dans ... likes: 100 la méthode insert () ... }) WriteResult({ "nInserted" : 1 }) >

d A

E il

Manipulation Les requêtes MongoDB -Insérer un document-

I A

La méthode insertOne() Si vous devez insérer un seul document dans une collection, vous pouvez utiliser cette méthode

N A

A N

> db.empDetails.insertOne( { First_Name: "Adil", Last_Name: "ENAANAI", Email: "[email protected]", }) { "acknowledged" : true, "insertedId" : ObjectId("5dd62b4070fb13eec3963bea") } >

d A

E il

Manipulation Les requêtes MongoDB -Insérer un document-

I A

La méthode insertMany() Vous pouvez insérer plusieurs documents à l'aide de la méthode insertMany (). Pour cette méthode, vous devez transmettre un tableau de documents.

N A

A N

> db.empDetails.insertMany( [{ First_Name: "Adil", Last_Name: "ENAANAI", Email: "[email protected]", }, { First_Name: "Mohamed", Last_Name: "SAFIR", Email: "[email protected]", }] )

d A

E il

Manipulation Les requêtes MongoDB -Modifier un document-

I A

La méthode Update () La méthode update () met à jour les valeurs dans le document existant.

N A

Syntaxe

A N

db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)

Exemple L'exemple suivant définira le nouveau titre «New MongoDB» des documents dont le titre est «MongoDB».

E il

d A

db.mycol.update({'title':'MongoDB'},{$set:{'title':'New MongoDB'}}) Par défaut, MongoDB ne mettra à jour qu'un seul document. Pour mettre à jour plusieurs documents, vous devez définir un paramètre «multi» sur true. db.mycol.update({'title':'MongoDB'},{$set:{'title':'New MongoDB'}},{multi:true})

Manipulation Les requêtes MongoDB -Modifier un document-

I A

La méthode Save () La méthode save () remplace le document existant par le nouveau document passé dans la méthode save (). Syntaxe

N A

A N

db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA}) Exemple L'exemple suivant remplacera le document par le _id '5983548781331adf45ec5'.

d A

E il

db.mycol.save( {"_id" : ObjectId("507f191e810c19729de860ea"), "title":"Cours MongoDB", "by":"SupTech" } )

Manipulation Les requêtes MongoDB -Modifier un document-

I A

La méthode findOneAndUpdate() La méthode findOneAndUpdate () met à jour les valeurs dans le document existant. Syntaxe

N A

A N

db.COLLECTION_NAME. findOneAndUpdate(SELECTION_CRITERIA, UPDATED_DATA)

E il

Exemple

d A

db.empDetails.findOneAndUpdate( {First_Name: 'Adil'}, { $set: { Age: '30',e_mail: ‘[email protected]'}} )

Manipulation Les requêtes MongoDB -Modifier un document-

I A

La méthode updateOne() Cette méthode met à jour un document unique qui correspond au filtre donné.

N A

A N

Syntaxe

db.COLLECTION_NAME.updateOne(, )

E il

Exemple

d A

db.empDetails.updateOne( {First_Name: 'Adil'}, { $set: { Age: '39',e_mail: '[email protected]'}} )

Manipulation Les requêtes MongoDB -Modifier un document-

I A

La méthode updateMany() La méthode updateMany () met à jour tous les documents qui correspondent au filtre donné. Syntaxe

N A

A N

db.COLLECTION_NAME.updateMany(, )

E il

Exemple

d A

db.empDetails.updateMany( {Age:{ $gt: "25" }}, { $set: { Age: '00'}} )

Manipulation Les requêtes MongoDB -Supprimer un document-

I A

La méthode remove() La méthode remove() de MongoDB est utilisée pour supprimer un document de la collection. Syntaxe

N A

A N

db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)

E il

Exemple

L'exemple suivant supprimera tous les documents dont le titre est «MongoDB».

d A

db.empDetails.remove({Age:{ $gt: "25" }})

Manipulation Les requêtes MongoDB -Supprimer un document-

I A

La méthode remove() Supprimer un seul

N A

S'il existe plusieurs enregistrements et que vous souhaitez supprimer uniquement le premier enregistrement, définissez le paramètre justOne dans la méthode remove () .

A N

E il

db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

d A

Supprimer tous les documents

Si vous ne spécifiez pas de critères de suppression, MongoDB supprimera des documents entiers de la collection. C'est l'équivalent de la commande truncate de SQL. db.mycol.remove({})

Manipulation Les requêtes MongoDB -Interroger un document-

I A

La méthode find() Pour interroger les données de la collection MongoDB, vous devez utiliser la méthode find () de MongoDB. Syntaxe

N A

A N

db.COLLECTION_NAME.find()

E il

d A

La méthode pretty() Pour afficher les résultats de manière formatée, vous pouvez utiliser la méthode pretty (). Syntaxe

db.COLLECTION_NAME.find().pretty()

Manipulation Les requêtes MongoDB -Interroger un document-

I A

La méthode findOne() Outre la méthode find (), il existe la méthode findOne () , qui ne renvoie qu'un seul document. Syntaxe

A N

N A

db.COLLECTION_NAME.findOne()

E il

Exemple

d A

db.mycol.findOne({title: "MongoDB"})

Manipulation Les requêtes MongoDB -Interroger un document-

I A

Les clauses MongoDB SQL

MongoDB

N A

where prenom = 'adil'

db.mycol.find({"prenom":"adil"}).pretty()

where age < 50

db.mycol.find({"age":{$lt:50}}).pretty()

where age 50 where age >= 50 where age != 50

db.mycol.find({"age":{$gt:50}}).pretty()

d A

db.mycol.find({"age":{$gte:50}}).pretty()

db.mycol.find({"age":{$ne:50}}).pretty()

Where prenom in ("adil", "kamal", "Ahmed")

db.mycol.find({"name":{$in:[("adil", "kamal", "Ahmed"]}}).pretty()

Where prenom not in ("adil", "kamal", "Ahmed")

db.mycol.find({"name":{$nin:[("adil", "kamal", "Ahmed"]}}).pretty()

Manipulation Les requêtes MongoDB -Interroger un document-

I A

Le ET logique Syntaxe

N A

db.mycol.find({ $and: [ {:}, { :} ] })

A N

Exemple

E il

db.mycol.find({$and:[{"prenom":"adil"},{"title": "MongoDB"}]}).pretty() Le OU logique Syntaxe

d A

db.mycol.find({ $or: [ {:}, { :} ] }) Exemple db.mycol.find({$or:[{"prenom":"adil"},{"title": "MongoDB"}]}).pretty()

Manipulation Les requêtes MongoDB -Interroger un document-

I A

Utiliser AND et OR ensemble Exemple

N A

db.mycol.find({"age": {$gt:10}, $or: [{"prenom": "adil"}, {"title": "MongoDB"}]}).pretty() La négation Exemple

A N

d A

E il

db.empDetails.find( { "Age": { $not: { $gt: "25" } } } )

Manipulation Les requêtes MongoDB -La projection-

I A

Dans MongoDB, lorsque vous exécutez la méthode find(), elle affiche tous les champs d'un document. Pour limiter cela, vous devez définir une liste de champs avec la valeur 1 ou 0. 1 est utilisé pour afficher le champ tandis que 0 est utilisé pour masquer les champs.

N A

A N

E il

db.mycol.find({},{"title":1,_id:0})

d A

Manipulation Les requêtes MongoDB -Limitation des résultats-

I A

La méthode limit() Pour limiter les enregistrements dans MongoDB, vous devez utiliser la méthode limit () . La méthode accepte un argument de type numérique, qui est le nombre de documents que vous souhaitez afficher.

N A

A N

db.mycol.find({},{"title":1,_id:0}).limit(2)

E il

La méthode skip() Outre la méthode limit (), il existe une autre méthode skip () qui accepte également l'argument de type numérique et est utilisée pour ignorer le nombre de documents.

d A

db.mycol.find({},{"title":1,_id:0}).limit(1).skip(1)

Manipulation Les requêtes MongoDB -Trier des résultats-

I A

La méthode sort() Pour spécifier l'ordre de tri 1 et -1 sont utilisés. 1 est utilisé pour l'ordre croissant tandis que -1 est utilisé pour l'ordre décroissant.

N A

A N

db.mycol.find({},{"title":1,_id:0}).sort({"title":-1})

d A

E il

Manipulation Les requêtes MongoDB -Créer les index-

I A

La méthode createIndex() Les index prennent en charge la résolution efficace des requêtes. Sans index, MongoDB doit analyser chaque document d'une collection pour sélectionner les documents qui correspondent à l'instruction de requête. Cette analyse est très inefficace et nécessite MongoDB pour traiter un grand volume de données. Les index sont des structures de données spéciales, qui stockent une petite partie de l'ensemble de données sous une forme facile à parcourir. L'index stocke la valeur d'un champ spécifique ou d'un ensemble de champs, triée par la valeur du champ comme spécifié dans l'index.

N A

A N

E il

d A

db.mycol.createIndex({"title":1,"description":-1})

Manipulation Les requêtes MongoDB -L’aggregation-

I A

La méthode aggregate() si vous souhaitez afficher une liste indiquant le nombre de didacticiels écrits par chaque utilisateur, vous utiliserez la méthode d'agrégat()

N A

A N

db.Employe.aggregate([{$group:{_id:"$sexe",moyenne_age:{$avg:"$age"}}}])

E il

La requête équivalente SQL pour le cas d'utilisation ci-dessus sera select user, count(*) from mycol group by user.

d A

Dans l'exemple ci-dessus, nous avons regroupé les documents par champ by_user et à chaque occurrence de par utilisateur, la valeur précédente de sum est incrémentée.

Manipulation Exercice

I A

Exprimez des requêtes simples (pas de MapReduce) pour les recherches suivantes : 1. Liste de tous les livres (type « Book ») ; 2. Liste des publications depuis 2011 ; 3. Liste des livres depuis 2014 ; 4. Liste des publications de l’auteur « Toru Ishida » ; 5. Liste de tous les éditeurs (type « publisher »), distincts ; 6. Liste de tous les auteurs distincts ; 7. Trier les publications de « Toru Ishida » par titre de livre et par page de début ; 8. Projeter le résultat sur le titre de la publication, et les pages ; 9. Compter le nombre de ses publications ; 10. Compter le nombre de publications depuis 2011 et par type ; 11. Compter le nombre de publications par auteur et trier le résultat par ordre croissant

N A

A N

d A

E il

Manipulation Correction 1. 2. 3. 4. 5. 6. 7.

db.publis.find({"type" : "Book"}); db.publis.find({year : {$gte : 2011}}); db.publis.find({"type" : "Book", year : {$gte : 2014}}); db.publis.find({authors : "Toru Ishida"}); db.publis.distinct("publisher"); db.publis.distinct("authors"); db.publis.aggregate([{$match:{authors : "Toru Ishida"}}, { $sort : { booktitle : 1, "pages.start" : 1 } }]); 8. db.publis.aggregate([{$match:{authors : "Toru Ishida"}}, {$sort : { booktitle : 1, "pages.start" : 1 }}, {$project : {title : 1, pages : 1}}]); 9. db.publis.aggregate([{$match:{authors : "Toru Ishida"}}, {$group:{_id:null, total : { $sum : 1}}}]); 10. db.publis.aggregate([{$match:{year : {$gte : 2011}}}, {$group:{_id:"$type", total : { $sum : 1}}}]); 11. db.publis.aggregate([{ $unwind : "$authors" }, { $group : { _id : "$authors", number : { $sum : 1 } }}, {$sort : {number : -1}}] );

I A

N A

A N

d A

E il

Manipulation L’imbrication d’objets

I A

Soit le modèle relationnel suivant

N A

A N

d A

E il

Manipulation L’imbrication d’objets

I A

La forme de données json sera comme suit: { "id":1, "nom":"SELLAMI", "prenom":"Nadia", "sexe":"F", "filiere":"GL", "cycle":"Master", "notes":{ "semestre1":{ "Angular":14, "SI":15, "BigData":13} } }

N A

d A

E il

A N

Manipulation L’imbrication d’objets

I A

Accès aux données imbriquées Modifier la note de la matière « BigData » de Mlle « SELLAMI »

N A

db.Etudiants.updateOne({nom:"SELLAMI"},{$set:{"notes.semestre1.BigData":10}})

A N

Chercher tous les étudiants ayant 10 en BigData

E il

db.Etudiants.find({"notes.semestre1.BigData":10})

Enlever le champs Big Data pour Mlle SELLAMI

d A

db.Etudiants.update({nom:"SELLAMI"},{$unset:{"notes.semestre1.BigData":1}})

Client MongoDB en Java Installation du pilote

I A

Pour utiliser MongoDB, il faut importer le pilote à votre projet Java.

N A

Vous pouvez créer un projet Maven et importer le pilote en utilisant cette dépendance.

A N

org.mongodb mongo-java-driver 3.12.2

d A

E il

Client MongoDB en Java Se connecter à la base de données et créer une collection

Pour connecter la base de données, vous devez spécifier le nom de la base de données, si la base de données n'existe pas, MongoDB la crée automatiquement.

I A

N A

public class MongoDBTest { public static void main( String args[] ) { // Creating a Mongo client MongoClient mongo = new MongoClient( "localhost" , 27017 ); // Creating Credentials MongoCredential credential; credential = MongoCredential.createCredential("adil", "myDb","1234".toCharArray()); System.out.println("Connected to the database successfully"); // Accessing the database MongoDatabase database = mongo.getDatabase("myDb"); System.out.println("Credentials ::"+ credential); //Creating a collection database.createCollection("Person"); System.out.println("Collection created successfully"); } }

A N

d A

E il

Client MongoDB en Java Sélectionner une collection

I A

Pour obtenir / sélectionner une collection à partir de la base de données, la méthode getCollection() de la classe com.mongodb.client.MongoDatabase est utilisée. import import import import import public

com.mongodb.client.MongoCollection; com.mongodb.client.MongoDatabase; org.bson.Document; com.mongodb.MongoClient; com.mongodb.MongoCredential; class ConnectToDB {

N A

E il

A N

public static void main( String args[] ) { // Creating a Mongo client // Creating Credentials // Accessing the database // Creating a collection // Retrieving a collection MongoCollection collection = database.getCollection("Person"); System.out.println("Collection myCollection selected successfully"); }

d A

}

Client MongoDB en Java Insérer un document

I A

Pour insérer un document dans MongoDB, la méthode insert() de la classe com.mongodb.client.MongoCollection est utilisée.

N A

import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import org.bson.Document; import com.mongodb.MongoClient; import com.mongodb.MongoCredential; public class ConnectToDB { public static void main( String args[] ) { // Creating a Mongo client // Creating Credentials // Accessing the database // Creating a collection // Retrieving a collection Document document = new Document("nom", "ENAANAI").append("prenom", "Adil").append("email", "[email protected]"); //Inserting document into the collection collection.insertOne(document); System.out.println("Document inserted successfully"); } }

A N

d A

E il

Client MongoDB en Java Insérer et récupérer plusieurs documents

I A

public class ConnectToDB { public static void main( String args[] ) { // Creating a Mongo client // Creating Credentials // Accessing the database // Creating a collection // Retrieving a collection Document document1 = new Document("nom", "MARFOUK").append("prenom", "Youssef").append("email", "[email protected]"); Document document2 = new Document("nom", "SAFIR").append("prenom", "Laila").append("email", "[email protected]"); List list = new ArrayList(); list.add(document1); list.add(document2); collection.insertMany(list); // Getting the iterable object FindIterable iterDoc = collection.find(); int i = 1; // Getting the iterator Iterator it = iterDoc.iterator(); while (it.hasNext()) { System.out.println(it.next()); i++; } } }

N A

A N

d A

E il

Client MongoDB en Java Mettre à jour le document

I A

public class ConnectToDB { public static void main( String args[] ) { // Creating a Mongo client // Creating Credentials // Accessing the database // Creating a collection // Retrieving a collection

N A

collection.updateOne(Filters.eq("nom", "SAFIR"), Updates.combine(Updates.set("prenom", "Amine"),Updates.set("email", "[email protected]"))); System.out.println("Document update successfully...");

A N

// Retrieving the documents after updation // Getting the iterable object FindIterable iterDoc = collection.find(); int i = 1; // Getting the iterator Iterator it = iterDoc.iterator(); while (it.hasNext()) { System.out.println(it.next()); i++; }

E il

d A

} }

Client MongoDB en Java Supprimer un document

I A

public class ConnectToDB { public static void main( String args[] ) { // Creating a Mongo client // Creating Credentials // Accessing the database // Creating a collection // Retrieving a collection

N A

// Deleting the documents collection.deleteOne(Filters.eq("nom", "SAFIR")); System.out.println("Document deleted successfully...");

A N

// Retrieving the documents after updation // Getting the iterable object FindIterable iterDoc = collection.find(); int i = 1; // Getting the iterator Iterator it = iterDoc.iterator(); while (it.hasNext()) { System.out.println(it.next()); i++; }

E il

d A

} }

Client MongoDB en Python PyMongo

I A

Python a besoin d'un pilote MongoDB pour accéder à la base de données MongoDB. Nous vous recommandons d'utiliser PIP pour installer "PyMongo". PIP est probablement déjà installé dans votre environnement Python. Accédez à votre ligne de commande jusqu'à l'emplacement de PIP et tapez ce qui suit:

N A

A N

E il

C:\Users\ADIL\AppData\Local\Programs\Python\Python38\Scripts>pip install pymongo

d A

Client MongoDB en Python Créer une base de données

I A

Pour créer une base de données dans MongoDB, commencez par créer un objet MongoClient, puis spécifiez une URL de connexion avec l'adresse IP correcte et le nom de la base de données que vous souhaitez créer.

N A

import pymongo

A N

myclient = pymongo.MongoClient("mongodb://localhost:27017/")

E il

mydb = myclient["mydatabase"]

d A

Client MongoDB en Python Créer une collection

I A

Pour créer une collection dans MongoDB, utilisez l'objet de base de données et spécifiez le nom de la collection que vous souhaitez créer.

N A

import pymongo

A N

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["mydatabase"]

mycol = mydb["persons"]

d A

E il

Client MongoDB en Python Insérer un document

I A

Pour insérer un enregistrement, ou un document comme on l'appelle dans MongoDB, dans une collection, nous utilisons la insert_one()méthode. Le premier paramètre de la insert_one()méthode est un dictionnaire contenant le (s) nom (s) et valeur (s) de chaque champ du document que vous souhaitez insérer.

N A

A N

import pymongo

E il

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["mydatabase"] mycol = mydb["persons"]

d A

mydict = { "nom": "NACIRI", "prenom": "Hassan" }

x = mycol.insert_one(mydict) print(x.inserted_id)

Client MongoDB en Python Insérer plusieurs documents

I A

Pour insérer plusieurs documents dans une collection dans MongoDB, nous utilisons la méthode insert_many().

N A

import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["mydatabase"] mycol = mydb["persons"]

A N

E il

mylist = [ { "nom": "NACIRI", "prenom": "Mohamed"}, { "nom": "JALIL", "prenom": "Hasnaa"}, { "nom": "RAHRAMOUI", "prenom": "Kenza"}, ] x = mycol.insert_many(mylist)

d A

#print list of the _id values of the inserted documents: print(x.inserted_ids)

Client MongoDB en Python Chercher un document

I A

Pour sélectionner les données d'une collection dans MongoDB, nous pouvons utiliser la méthode find_one(). La méthode find_one() renvoie la première occurrence de la sélection.

N A

import pymongo

A N

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["mydatabase"] mycol = mydb["persons"]

x = mycol.find_one() print(x)

d A

E il

Client MongoDB en Python Chercher plusieurs documents

I A

La méthode find() renvoie toutes les occurrences de la sélection. Le premier paramètre de la méthode find() est un objet de requête. Dans cet exemple, nous utilisons un objet de requête vide, qui sélectionne tous les documents de la collection.

N A

A N

import pymongo

E il

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["mydatabase"] mycol = mydb["persons"]

d A

for x in mycol.find(): print(x)

Client MongoDB en Python Renvoyer uniquement certains champs

I A

Le deuxième paramètre de la find()méthode est un objet décrivant les champs à inclure dans le résultat.

N A

import pymongo

A N

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["mydatabase"] mycol = mydb["persons"]

E il

for x in mycol.find({},{ "_id": 0, "nom": 1, "prenom": 1 }): print(x)

d A

Client MongoDB en Python Filtrer le résultat

I A

Lorsque vous recherchez des documents dans une collection, vous pouvez filtrer le résultat à l'aide d'un objet de requête. Le premier argument de la méthode find() est un objet de requête et est utilisé pour limiter la recherche.

N A

A N

import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["mydatabase"] mycol = mydb["persons"]

E il

d A

myquery = { "nom": "NACIRI" }

mydoc = mycol.find(myquery) for x in mydoc: print(x)

Client MongoDB en Python Requête avancée

I A

Pour effectuer des requêtes avancées, vous pouvez utiliser des modificateurs comme valeurs dans l'objet de requête. Par exemple, pour trouver les documents où le champ "adresse" commence par la lettre "S" ou plus (par ordre alphabétique), utilisez le modificateur supérieur à {"$gt": "S"}

N A

A N

import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["mydatabase"] mycol = mydb["persons"]

E il

d A

myquery = { "nom": { "$gt": "N" } } mydoc = mycol.find(myquery) for x in mydoc: print(x)

Client MongoDB en Python Filtre avec des expressions régulières

I A

Pour rechercher uniquement les documents dont le champ "adresse" commence par la lettre "S", utilisez l'expression régulière {"$regex": "^S"}:

N A

import pymongo

A N

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["mydatabase"] mycol = mydb["persons"]

E il

myquery = { "nom": { "$regex": "^N" } }

d A

mydoc = mycol.find(myquery)

for x in mydoc: print(x)

Client MongoDB en Python Supprimer un document

I A

Pour supprimer un document, nous utilisons la delete_one()méthode. Le premier paramètre de la méthode delete_one() est un objet de requête définissant le document à supprimer.

N A

A N

import pymongo

E il

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["mydatabase"] mycol = mydb["Persons"]

d A

myquery = { "nom": "SAFIR" } mycol.delete_one(myquery)

Client MongoDB en Python Supprimer plusieurs documents

I A

Pour supprimer plusieurs documents, utilisez la méthode delete_many(). Le premier paramètre de la méthode delete_many() est un objet de requête définissant les documents à supprimer.

N A

A N

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["mydatabase"] mycol = mydb["Persons"]

E il

d A

myquery = { "nom": {"$regex": "^N"} } x = mycol.delete_many(myquery)

print(x.deleted_count, " documents deleted.")

Client MongoDB en Python Modifier un document

I A

Vous pouvez mettre à jour un enregistrement ou un document comme il est appelé dans MongoDB, en utilisant la méthode update_one(). Le premier paramètre de la méthode update_one() est un objet de requête définissant le document à mettre à jour.

N A

A N

import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["mydatabase"] mycol = mydb["Persons"]

E il

d A

myquery = { "nom": "MANSOURI" } newvalues = { "$set": { "prenom": "Hassan" } }

mycol.update_one(myquery, newvalues) #print "customers" after the update: for x in mycol.find(): print(x)

Client MongoDB en Python Modifier plusieurs documents

I A

Pour mettre à jour tous les documents qui répondent aux critères de la requête, utilisez la méthode update_many().

N A

import pymongo

A N

myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["mydatabase"] mycol = mydb["customers"]

E il

myquery = { "address": { "$regex": "^S" } } newvalues = { "$set": { "name": "Minnie" } }

d A

x = mycol.update_many(myquery, newvalues) print(x.modified_count, "documents updated.")

N A

I A

Chapitre 3 Cassandra

A N

d A

E il

Introduction Apache Cassandra est un système de stockage (base de données) open source, distribué et décentralisé / distribué, pour gérer de très grandes quantités de données structurées réparties à travers le monde. Il fournit un service hautement disponible sans point de défaillance unique.

I A

N A

A N

Historique de Cassandra

• Cassandra a été développée sur Facebook pour la recherche dans la boîte de réception. • Il a été open source par Facebook en juillet 2008. • Cassandra a été acceptée dans l'incubateur Apache en mars 2009. • Il est devenu un projet Apache de haut niveau depuis février 2010.

d A

E il

Architecture Cassandra utilise le protocole Gossip en arrière-plan pour permettre aux nœuds de communiquer entre eux et de détecter tout nœud défectueux dans le cluster.

La principale caractéristique de Cassandra est de stocker des données sur plusieurs nœuds sans point de défaillance unique.

A N

N A

E il

Cassandra stocke les données sur différents nœuds avec une architecture de mode distribuée peer to peer.

d A

I A

Architecture Composants de Cassandra Chaque opération d'écriture est écrite dans Commit Log. Le journal de validation est utilisé pour la récupération après incident.

I A

N A

Après les données écrites dans le journal de validation, les données sont écrites dans Mem-table. Les données sont écrites temporairement dans Mem-table.

A N

Lorsque Mem-table atteint un certain seuil, les données sont vidées dans un fichier disque SSTable.

d A

E il

Modèle de données Colonne

I A

La colonne est la plus petite unité de donnée de Cassandra. Elle est constituée du triplet : •Nom •Valeur : Maximum 2G. Elle n'est pas obligatoire. •Timestamp : Sauvegarde la mise à jour la plus récente.

N A

A N

E il

d A

Une colonne dans cassandra n'a pas le même sens que dans un SGBDR. Il s'agit là d'un attribut d'un enregistrement.

Modèle de données Ligne

I A

Une ligne est un ensemble de colonnes (jusqu'à 2 Milliards). Elle est identifiée par une clé. C'est l'équivalent d'une ligne dans un SGBDR, c'est donc un enregistrement.

N A

A N

Exemple

d A

E il

Modèle de données Column Family

I A

Une Column Family est un regroupement de lignes.

N A

A N

d A

E il

Modèle de données Column Family

I A

Une Column Family est un regroupement de lignes.

N A

A N

d A

E il

Modèle de données Column Family

I A

Une Column Family est l'équivalent d'une Table dans un SGBDR.

N A

On peut d'ailleurs y ajouter des "métadonnées", en quelque sorte des "entêtes" de colonnes. Néanmoins, les colonnes définies ne seront pas forcément exploités lors de la création de ligne.

A N

E il

Il existe deux types de familles de colonnes • statique : les colonnes sont définies lors de la création ou modification de la famille de colonnes ; • dynamique : les colonnes sont définies lors de la création ou modification d'une ligne.

d A

Modèle de données Keyspace

I A

Un KeySpace est un regroupement de Column Family. Il équivaut au schéma dans un SGBDR.

N A

d A

E il

A N

Langage CQL Créer un KeySpace

I A

Syntaxe

CREATE KEYSPACE WITH

N A

C.à.d:

A N

CREATE KEYSPACE "KeySpace Name" WITH replication = {'class': 'Strategy name', 'replication_factor' : 'No.Of replicas'};

E il

CREATE KEYSPACE "KeySpace Name" WITH replication = {'class': 'Strategy name', 'replication_factor' : 'No.Of replicas'} AND durable_writes = 'Boolean value';

Exemple

d A

CREATE KEYSPACE test WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };

La valeur par défaut de durable_writes est true.

Langage CQL Créer un KeySpace

I A

La stratégie de copie (replication)

Il existe 2 types de stratégies : SimpleStrategy : à utiliser uniquement lorsque le cluster est composé d'un unique data-center et une seule rack. La première copie est placée dans le noeud déterminé à partir de la clé de partition, les suivants sont placés sur les noeuds voisins dans le sens des aiguilles d'une montre.

N A

A N

E il

d A

NetworkTopologyStrategy : à utiliser lorsque le cluster est déployé sur plusieurs data-centers. Cette stratégie permet de spécifier le nombre de copies voulu dans chaque data-center. Pour la suite, nous nous intéresserons uniquement à la SimpleStrategy.

Langage CQL Créer un KeySpace

I A

La stratégie de copie (replication)

N A

A N

d A

E il

Langage CQL Créer un KeySpace

I A

durable_writes

N A

Lorsqu'une demande d'écriture est reçue, le noeud écrit d'abord une copie des données dans une structure à ajout uniquement sur disque appelée commitlog . Ensuite, il écrit les données dans une structure en mémoire appelée memtable . Lorsque la mémtable est pleine ou atteint une certaine taille, elle est vidée vers une structure immuable sur disque appelée SSTable . La définition d' écritures durables sur true garantit que les données sont écrites dans le journal de validation. Dans le cas où le nœud redémarre, les tables de mémoire ont disparu car elles résident en mémoire. Cependant, les tables de mémoire peuvent être reconstruites en relisant le commitlog, car la structure du disque ne sera pas effacée même avec les redémarrages de nœuds.

A N

d A

E il

Langage CQL Créer un KeySpace

I A

durable_writes

N A

A N

d A

E il

Langage CQL Vérifier les KeySpaces ou Utiliser un KeySpaces

I A

N A

use school;

A N

E il

Modifier un KeySpaces

d A

Supprimer un KeySpaces

DESCRIBE keyspaces; SELECT * FROM system_schema.keyspaces;

ALTER KEYSPACE school WITH replication = {'class':'NetworkTopologyStrategy', 'replication_factor' : 3};

DROP KEYSPACE school;

Langage CQL Création d'une table CREATE TABLE emp( emp_id int PRIMARY KEY, emp_name text, emp_city text, emp_sal varint, emp_phone varint );

N A

A N

Vérification

E il

d A

I A

select * from emp

Langage CQL Modification d'une table

I A

Ajout d'une colonne

ALTER TABLE emp ADD emp_email text;

Suppression d'une colonne

ALTER TABLE emp DROP emp_email;

Détruire une table

DROP TABLE emp;

Effacer une table

TRUNCATE emp;

Appliquer un batch

N A

A N

d A

E il

BEGIN BATCH ... INSERT INTO emp (emp_id, emp_city, emp_name, emp_phone, emp_sal) values( 4,'Rabat','Adil',0677205790, 30000); ... UPDATE emp SET emp_sal = 50000 WHERE emp_id =3; ... DELETE emp_city FROM emp WHERE emp_id = 2; ... APPLY BATCH;

Langage CQL Les opérations CRUD

I A

Ajouter une ligne

INSERT INTO emp ( emp_id, emp_name, emp_city, emp_phone, emp_sal ) VALUES(1,'Rabat','Adil', 0677205790, 50000);

N A

Modifier une ligne

A N

UPDATE emp SET emp_city ='Casa', emp_sal = 50000 WHERE emp_id = 2;

E il

Sélectionner une ligne

d A

SELECT * FROM emp WHERE emp_sal=50000;

Suppression de données d'une table DELETE emp_sal FROM emp WHERE emp_id=3;

Suppression d'une ligne entière DELETE FROM emp WHERE emp_id=3;

Langage CQL Exercice Soit le schéma suivant:

I A

N A

A N

d A

E il

1) Créer un keyspace ‘Mediatheque’ 2) Créer les column family nécessaires. Pour faciliter les exercices suivants, nous allons aussi créer une table user qui ne contiendra que le login, nom et prénom des utilisateurs créés.

Langage CQL Exercice 3) Insérer les vidéos suivantes et vérifier que l'insertion est correcte. Id

Video_name

Video_updoaded

1

KeyboardCat

now

2

NyanCat

now

A N

N A

I A

Login Cschmidt saraj00n

4) Ajouter ensuite l'utilisateur suivant (sans vidéo) : MasterTroll (Jean Fabrice) 5) Vérifier l'insertion dans la table vidéo, puis recherchez les vidéos de l'utilisateur 'saraj00n'. 5) Insérer le commentaires suivants : 1 - le 15/01/2017 à 12h00, saraj00n a écrit 'first' sur la vidéo 'Keyboard Cat' 2 - le 15/01/2017 à 12h05, MasterTroll a écrit 'thats lame' sur la vidéo 'Keyboard Cat’

d A

E il

Langage CQL Exercice 6) Insérer cet utilisateur : INSERT INTO users (client_id , nom, prenom , age) VALUES ('saraj00n', 'Sarah', 'Junior'); Que se passe-t-il ? L'utilisateur MasterTroll décide de dévoiler son identité au grand jour, il change son nom pour PAUL L'utilisateur Jean PAUL se fait banir, supprimer l'utilisateur Supprimez la column family users. Supprimer le keyspace.

I A

N A

A N

d A

E il

Langage CQL Correction 1) CREATE KEYSPACE Mediatheque WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };

I A

A N

N A

2)CREATE TABLE videos ( video_id uuid, video_name varchar, video_uploaded timestamp, user_login varchar, PRIMARY KEY(video_id));

d A

E il

Langage CQL Correction CREATE TABLE user_videos_index ( login varchar, video_id uuid, video_name varchar, PRIMARY KEY(login, video_id));

I A

N A

A N

E il

CREATE TABLE comments_by_video ( video_id uuid, user_login varchar, comment_dat timestamp, comment varchar, PRIMARY KEY(video_id, user_login));

d A

Langage CQL Correction CREATE TABLE comments_by_user ( user_login varchar, video_id uuid, comment_dat timestamp, comment varchar, PRIMARY KEY(user_login, video_id));

I A

N A

E il

A N

CREATE TABLE users ( login varchar, firstname varchar, lastname varchar, PRIMARY KEY(login));

d A

Langage CQL Correction

I A

INSERT INTO users(login, firstname, lastname) VALUES ('cschmidt', 'chris', 'SCHMIDT'); INSERT INTO users(login, firstname, lastname) VALUES ('saraj00n', 'Sarah', 'JUNE'); INSERT INTO users(login, firstname, lastname) VALUES ('MasterTroll', 'Jean', 'FABRICE'); INSERT INTO videos (video_id, video_name, video_uploaded, user_login) VALUES (uuid(),'Keyboard Cat', dateof(now()), 'cshmidt'); INSERT INTO user_videos_index (login, video_id, video_name) VALUES ('cschmidt', the generated uuid, 'Keyboard Cat'); INSERT INTO videos (video_id, video_name, video_uploaded, user_login) VALUES (uuid(),'nyan cat', dateof(now()), 'saraj00n'); INSERT INTO user_videos_index (login, video_id, video_name) VALUES ('saraj00n', the generated uuid, 'nyan cat'); SELECT * FROM videos; SELECT video_name FROM user_videos_index WHERE login='saraj00n';

N A

A N

d A

E il

Langage CQL Correction

I A

INSERT INTO comments_by_user (user_login, video_id, comment_dat, comment) VALUES (saraj00n, generated uuid, '1484481600', 'first'); INSERT INTO comments_by_videos (video_id, user_login, comment_dat, comment) VALUES (generated uuid, saraj00n, '1484481600', 'first'); INSERT INTO comments_by_user (user_login, video_id, comment_dat, comment) VALUES (MasterTroll, generated uuid, '1484481900', 'thats lame'); INSERT INTO comments_by_videos (video_id, user_login, comment_dat, comment) VALUES (generated uuid, 'MasterTroll', 1484481900, 'thats lame'); SELECT * FROM comments_by_user; SELECT * FROM comments_by_video;

N A

A N

d A

E il

Langage CQL Les types complexes

I A

Les listes CREATE TABLE "school".personne ( id int, age int, enfants list, nom text, prenom text, PRIMARY KEY (id) );

A N

N A

d A

E il

Langage CQL Les types complexes

I A

Les listes

insert into personne JSON '{"id":1,"nom":"AMZIL","prenom":"Kamal","age":35}';

N A

A N

insert into personne JSON '{"id":2,"nom":"MOUHTADI","prenom":"Salah","age":35,"enfants":["Hamza", "Meriem","Wael"]}‘;

E il

update personne set enfants=['Fatima','Hanane'] where id=1;

d A

update personne set enfants=enfants+['Mohamed','Karim'] where id=1; update personne set enfants[2]='Nada' where id=1; delete enfants[2] from personne where id=1;

Langage CQL Les types complexes

I A

Les Maps CREATE TABLE school.teacher ( id int, age int, enfants MAP, nom text, prenom text, PRIMARY KEY (id) );

N A

A N

d A

E il

Langage CQL Les types complexes

I A

Les Maps

N A

Insertion

Insertion

insert into "teacher" JSON '{ "id":1, "nom":"KHALIFI", "prenom":"Hamza", "age":48, "enfants":{ "Khawla":12, "Brahim":23 } }';

update "teacher" set enfants['Khawla']=16 where id=1;

A N

d A

E il

Suppression delete enfants['Khawla'] from "teacher" where id=1;

Langage CQL Les types complexes

I A

Création d’un type utilisateur

N A

CREATE TYPE "school".enfant ( prenom text, age int, sexe text );

A N

d A

E il

Langage CQL Les types complexes Avec le type MAP Insertion insert into "Personne" JSON '{ "id":1, "nom":"TAHIRI", "prenom":"Mohamed", "age":47, "enfants":{ "1":{"prenom":"Adam","age":15,"sexe":"H"}, "2":{"prenom":"Kawtar","age":10,"sexe":"F"}, "3":{"prenom":"Imad","age":5,"sexe":"H"} } }';

I A

N A

A N

d A

E il

L’API Java La dépendance Maven

I A

Nous devons définir la dépendance Cassandra suivante dans le pom.xml

N A

com.datastax.cassandra cassandra-driver-core 3.1.0

A N

d A

E il

L’API Java La connexion au serveur Cassandra Créons tout d’abord la classe « CassandraConnector » public class CassandraConnector { private Cluster cluster; private Session session;

N A

A N

public void connect(String node, Integer port) { cluster = Cluster.builder().addContactPoint(node) .withPort(port) .build(); session = cluster.connect(); System.out.println("Connecté"); }

E il

d A

public Session getSession() { return this.session; } public void close() { session.close(); cluster.close(); } }

I A

L’API Java La connexion au serveur Cassandra Tester la connexion avec la classe « ClientCassandra »

I A

public class ClientCassandra { public static void main(String[] args) { CassandraConnector connector=new CassandraConnector(); connector.connect("localhost", 9042); connector.close(); }

N A

A N

E il

}

d A

L’API Java Créer un KeySpace Créons notre espace-clé « Ecole »:

I A

public void createKeyspace( String keyspaceName, String replicationStrategy, int replicationFactor) { String query="CREATE KEYSPACE IF NOT EXISTS "+keyspaceName +" WITH replication = {'class':'"+replicationStrategy +"','replication_factor':"+replicationFactor+"};";

N A

session.execute(query); }

d A

E il

A N

L’API Java Créer un une columnFamily Créons la table « Etudiants »:

I A

public void createTable(String keyspace,String tablename, HashMap columns) { session.execute("use "+keyspace); String query= "CREATE TABLE IF NOT EXISTS "+tablename+"("; int size=columns.size(); int i=1; Set keys=columns.keySet(); for(String key:keys) { query+=key+" "+columns.get(key); if (i!=size) {query+=",";}else {query+=");";} i++; }

N A

A N

E il

d A

session.execute(query); }

N A

I A

Chapitre 4 Neo4J

A N

d A

E il

Introduction Qu'est-ce qu'une base de données orientée graphe?

I A

La base de données orientée graphe est une base de données utilisée pour modéliser les données sous forme de graphe. Ici, les nœuds d'un graphe représentent les entités tandis que les relations décrivent l'association de ces nœuds.

N A

A N

Neo4j est une base de données orientée graphe populaire. Les autres bases de données graphiques sont Oracle NoSQL Database, OrientDB, HypherGraphDB, GraphBase, InfiniteGraph et AllegroGraph.

d A

E il

Introduction Modèle de données

I A

Neo4j utilise Native GPE (Graph Processing Engine) pour fonctionner avec son format de stockage de graphe natif.

N A

Les principaux éléments constitutifs du modèle de données Graph DB sont:

• Noeuds • Des relations • Propriétés

A N

d A

E il

Ci-contre un exemple simple de graphique de propriété.

Introduction Modèle de données

I A

Exemple: Facebook

N A

A N

d A

E il

Installation Visitez le site officiel de Neo4j en utilisant https://neo4j.com/ . En cliquant, ce lien vous mènera à la page d'accueil du site Web neo4j. Télécharger Neo4J

I A

N A

A N

d A

E il

Blocs de construction Modèle de données

I A

La base de données de graphes Neo4j a les blocs de construction suivants -

• • • • •

Noeuds Propriétés Des relations Étiquettes Navigateur de données

N A

d A

E il

A N

Blocs de construction Nœud

I A

Le nœud est une unité fondamentale d'un graphe. Il contient des propriétés avec des paires clé-valeur comme indiqué dans l'image suivante.

N A

A N

E il

d A

Ici, Node Name = "Employee" et il contient un ensemble de propriétés sous forme de paires clé-valeur.

Blocs de construction Propriétés

I A

La propriété est une paire clé-valeur pour décrire les nœuds de graphique et les relations. Key = Value

N A

A N

Où Key est une chaîne et la valeur peut être représentée à l'aide de n'importe quel type de données Neo4

d A

E il

Blocs de construction Des relations

I A

Les relations sont un autre élément constitutif majeur d'une base de données de graphes. Il connecte deux nœuds comme illustré dans la figure suivante.

N A

A N

E il

Ici, Emp et Dept sont deux nœuds différents. "WORKS_FOR" est une relation entre les nœuds Emp et Dept. Comme cette marque de flèche de relation représente une relation entre le nœud "Emp" et le nœud "Dept", cette relation est connue sous le nom de "relation entrante" vers le nœud "Dept" et "relation sortante" vers le nœud "Emp".

d A

Blocs de construction Des relations

I A

Comme les nœuds, les relations peuvent également contenir des propriétés sous forme de paires clé-valeur.

N A

A N

d A

E il

Blocs de construction Étiquettes

I A

L'étiquette associe un nom commun à un ensemble de nœuds ou de relations. Un nœud ou une relation peut contenir une ou plusieurs étiquettes. Nous pouvons créer de nouvelles étiquettes pour les nœuds ou relations existants. Nous pouvons supprimer les étiquettes existantes des nœuds ou relations existants.

N A

A N

E il

Du diagramme précédent, nous pouvons observer qu'il y a deux nœuds.

d A

Le nœud du côté gauche a une étiquette: "Emp" et le nœud du côté droit a une étiquette: "Dept". La relation entre ces deux nœuds a également une étiquette: "WORKS_FOR".

CQL CQL signifie Cypher Query Language. Comme Oracle Database a un langage de requête SQL, Neo4j a CQL comme langage de requête.

I A

N A

Neo4j CQL • Est un langage de requête pour Neo4j Graph Database. • Est un langage déclaratif de correspondance de modèles. • Suit SQL comme la syntaxe. • La syntaxe est très simple et dans un format lisible par l'homme. • Comme Oracle SQL • Neo4j CQL a des commandes pour effectuer des opérations de base de données.

A N

d A

E il

CQL Création d'un nœud

I A

Vous pouvez créer un nœud dans Neo4j en spécifiant simplement le nom du nœud à créer avec la clause CREATE. CREATE(Hassan)

N A

Pour vérifier la création du type de nœud, exécutez la requête suivante dans l'invite dollar. MATCH (n) RETURN n

A N

E il

d A

La clause CREATE de Neo4j CQL est également utilisée pour créer plusieurs nœuds en même temps. Pour ce faire, vous devez transmettre les noms des nœuds à créer, séparés par une virgule.

CQL Création d'un nœud avec une étiquette

I A

Une étiquette dans Neo4j est utilisée pour regrouper (classer) les nœuds à l'aide d'étiquettes.

N A

CREATE(Hassan:Etudiant)

A N

Vous pouvez également créer plusieurs étiquettes pour un seul nœud. Vous devez spécifier les étiquettes du nœud en les séparant par deux points «:».

d A

E il

CREATE(Hassan:Personne:Etudiant)

CQL Créer un nœud avec des propriétés

I A

Les propriétés sont les paires clé-valeur à l'aide desquelles un nœud stocke des données. Vous pouvez créer un nœud avec des propriétés à l'aide de la clause CREATE. Vous devez spécifier ces propriétés séparées par des virgules dans les accolades de fleurs "{}".

N A

A N

CREATE(kamal:Etudiant{nom:"AMZIL",prenom:"Kamal",age:23})

E il

Retour du nœud créé Nous pouvons utiliser la clause RETURN avec CREATE pour afficher le nœud nouvellement créé.

d A

CREATE(kamal:Etudiant{nom:"AMZIL",prenom:"Kamal",age:23}) return kamal

CQL Créer des relations

I A

Nous pouvons créer une relation en utilisant la clause CREATE. Nous spécifierons la relation entre les accolades carrées «[]» en fonction de la direction de la relation entre le trait d'union «-» et la flèche «→»,

N A

CREATE(Khalid:Etudiant{nom:"SALMI",prenom:"Khalid",age:21}) CREATE(Math:Filière{nom:"Info",Coefficient:4}) CREATE (Khalid)-[r:inscrit_dans]->(Math)

A N

d A

E il

CQL Création d'une relation entre les nœuds existants

I A

Vous pouvez également créer une relation entre les nœuds existants à l'aide de la clause MATCH .

N A

MATCH (a:Etudiant), (b:Filière) WHERE a.name = "MANSOURI" AND b.name = "Informatique" CREATE (a)-[r:inscrit_dans]->(b) RETURN a,b

A N

d A

E il

CQL Création d'une relation avec l'étiquette et les propriétés

I A

Vous pouvez créer une relation avec l'étiquette et les propriétés à l'aide de la clause CREATE.

N A

MATCH (a:Etudiant), (b:Filière) WHERE a.name = "MANSOURI" AND b.name = "Informatique" CREATE (a)-[r:inscrit_dans{date: "19/09/2019", Etat: "actif "}]->(b) RETURN a,b

A N

d A

E il

CQL Création d'un chemin complet

I A

Dans Neo4j, un chemin est formé en utilisant des relations continues. Un chemin peut être créé à l'aide de la clause create.

N A

CREATE (j:Joueur{nom:"NAKACH",prenom:"Ibrahim",age:36})[r1:capitain]->(e:Equipe{nom:"Wydad"})[r2:vinqueur{année:2019}]->(c:Championnat{nom:"Botola Marocaine"})

A N

d A

E il

CQL Fusion d'un nœud avec une étiquette

I A

Vous pouvez fusionner un nœud dans la base de données en fonction de l'étiquette à l'aide de la clause MERGE. Si vous essayez de fusionner un nœud basé sur l'étiquette, Neo4j vérifie s'il existe un nœud avec l'étiquette donnée. Sinon, le nœud actuel sera créé.

N A

A N

merge (n:Joueur{nom:"NAKACH"}) return n

d A

E il

CQL OnCreate et OnMatch

I A

Vous pouvez fusionner un nœud dans la base de données en fonction de l'étiquette à l'aide de la clause MERGE. Si vous essayez de fusionner un nœud basé sur l'étiquette, Neo4j vérifie s'il existe un nœud avec l'étiquette donnée. Sinon, le nœud actuel sera créé.

N A

A N

merge (n:Joueur{nom:"NAKACH"}) ON CREATE SET n.isCreated = "true" ON MATCH SET n.isFound = "true" return n

d A

E il

CQL Fusionner une relation

I A

Tout comme les nœuds, vous pouvez également fusionner les relations à l'aide de la clause MERGE. Créer d’abord les deux nœuds suivants:

N A

create (e:Equipe{nom:"RAJA"}) return e create (j:Joueur{nom:"BANOUN",prénom:"Badr",age:26}) return j MATCH (a:Joueur), (b:Equipe) WHERE a.nom = "BANOUN" AND b.nom = "RAJA" MERGE (a)-[r:CapitainDe]->(b) RETURN a, b

A N

d A

E il

CQL Définition d'une propriété

I A

À l'aide de la clause SET, vous pouvez créer une nouvelle propriété dans un nœud.

N A

MATCH (j:Joueur{nom:"BANOUN"}) set j.titres = 2, ancienneté = 6 return j

A N

E il

MATCH (j:Joueur{nom:"NAKACH"}) set j.titres = 7, ancienneté = 6 return j

d A

CQL Suppression d'une propriété

I A

Vous pouvez supprimer une propriété existante en lui passant la valeur NULL .

N A

MATCH (j:Joueur{nom:"BANOUN"}) set j.titres = null return j

A N

E il

MATCH (j:Joueur{nom:"NAKACH"}) set j.titres = null return j

d A

CQL Définition d'une étiquette sur un nœud

I A

Avant de poursuivre avec l'exemple, créez d'abord un nœud «Anderson» comme indiqué ci-dessous.

N A

create (n{nom:"Anderson",prenom:"Bobley",age:27}) return n

A N

MATCH(n{nom:"Anderson"}) set n:Joueur return n

d A

E il

CQL Suppression de tous les nœuds et relations

I A

Voici la requête pour supprimer tous les nœuds et les relations dans la base de données à l'aide de la clause DELETE

N A

MATCH (n) DETACH DELETE n

A N

Suppression d'un nœud particulier

Pour supprimer un nœud particulier, vous devez spécifier les détails du nœud à la place de «n» dans la requête ci-dessus.

d A

E il

MATCH(n{nom:"Anderson"}) DETACH DELETE n

CQL Suppression d'une propriété Vous pouvez supprimer une propriété d'un nœud à l'aide de MATCH avec la clause REMOVE.

I A

N A

MATCH (j:Joueur{nom:"BANOUN"}) REMOVE j.titres return j

A N

E il

Suppression d'une étiquette d'un nœud Semblable à la propriété, vous pouvez également supprimer une étiquette d'un nœud existant à l'aide de la clause remove.

d A

MATCH (j:Joueur{nom:"BANOUN"}) REMOVE j:Joueur return j