IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NoSQL Discussion :

Tutoriel sur une introduction à Neo4j, une base de données orientée graphe


Sujet :

NoSQL

  1. #1
    Rédacteur

    Avatar de Mickael Baron
    Homme Profil pro
    Ingénieur de Recherche en Informatique
    Inscrit en
    Juillet 2005
    Messages
    14 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche en Informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2005
    Messages : 14 974
    Points : 72 948
    Points
    72 948
    Par défaut Tutoriel sur une introduction à Neo4j, une base de données orientée graphe
    Bonjour,

    Benoit Simard expert et consultat technique de la société Neo Technology, la société qui édite le NoSQL Neo4J, nous propose une introduction autour de cette base de données orientée graphe.

    Le tutoriel est disponible ici : http://logisima.developpez.com/tutor...duction-neo4j/

    Profitez de cette discussion pour laisser vos commentaires

    Mickael

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 126
    Points : 31 658
    Points
    31 658
    Billets dans le blog
    16
    Par défaut
    Bonsoir,

    Je viens seulement de découvrir l’article rédigé par Benoit Simard en 2016. Manifestement l’opérateur JOIN de la théorie relationnelle de Codd - et repris par la suite dans SQL - n’y est pas en odeur de sainteté...

    Quoi qu’il en soit, on a une présentation d’un système orienté graphe, Neo4j, gérant des noeuds et leurs relations. Au paragraphe I-C-3-a, on apprend qu’une relation connecte un noeud de départ à un noeud d’arrivée : une relation est donc exclusivement binaire. Ainsi une relation ternaire (et plus) ne peut pas être prise en compte en tant que telle. Pour ma part, en 40 ans de conception, de modélisation, d’audit de bases de données, j’ai eu à faire à des wagons de ce type de relations de degré > 2).

    A titre d’exemple, je reprends ici la structure de base de données utilisée par l’inventeur du modèle relationnel de données, E. F. Codd (cf. son article A Data Base Sublanguage Founded on the Relational Calculus. IBM Research Report RJ893 (July 26th 1971)). Cet article largement cinquantenaire n’a pas vieilli.

    j’ai repris cette structure en utilisant Looping (enfant du professeur Patrick Bergougnoux, Paprick chez developpez.com), sous la forme d’un MCD (modèle conceptuel des données) :



    Pour l’utilisateur, le but de la manoeuvre est de savoir à quelle date, pour quels projets et en quelle quantité des pièces lui ont été livrées par ses fournisseurs.

    Dans le MCD, Les entités-types (classes d’entités) sont les suivantes :

    Supplier (fournisseur)

    Part (produit)

    Project (projet)

    ShipDate (date de livraison)

    Ces entités-types sont mises en relation au moyen de l’association Supply, porteuse de la quantité de pièces livrées (attribut Quantity).

    Est en gras le nom de chaque attribut faisant l’objet d’un identifiant d’entité-type :

    SupplierId, PartId, ProjectId (pour ces identifiants principaux, « primaires », le nom est souligné),

    SupplierName, ProjectName sont des identifiants alternatifs.

    Les cardinalités portées par les pattes d’association sont ici de deux types :

    « 0,n » pour préciser qu’une entité-type participe facultativement à une ou plusieurs fois à une association (par exemple, un fournisseur peut participer à plusieurs livraisons),

    « 1,n » pour préciser qu’une entité-type doit participer au moins une fois à l’association (un projet a fait l’objet d’au moins une livraison).

    Looping nous fournit le code SQL suivant, inféré du MCD :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    CREATE TABLE Supplier
    (
       SupplierId CHAR(4),
       SupplierName VARCHAR(50) NOT NULL,
       Location VARCHAR(50) NOT NULL,
       CONSTRAINT Supplier_PK PRIMARY KEY(SupplierId),
       CONSTRAINT Supplier_AK UNIQUE(SupplierName)
    );
     
    CREATE TABLE Part
    (
       PartId CHAR(4),
       PartName VARCHAR(50) NOT NULL,
       Color VARCHAR(16) NOT NULL,
       Weight SMALLINT NOT NULL,
       QuantityOnHand SMALLINT NOT NULL,
       CONSTRAINT Part_PK PRIMARY KEY(PartId),
    );
     
    CREATE TABLE Project
    (
       ProjectId CHAR(4),
       ProjectName VARCHAR(50) NOT NULL,
       ManagerName VARCHAR(50) NOT NULL,
       CONSTRAINT Project_PK PRIMARY KEY(ProjectId),
       CONSTRAINT Project_AK UNIQUE(ProjectName)
    );
     
    CREATE TABLE Supply
    (
       SupplierId CHAR(4),
       PartId CHAR(4),
       ProjectId CHAR(4),
       ShipDate DATE,
       Quantity SMALLINT NOT NULL,
       CONSTRAINT Supply_PK PRIMARY KEY(SupplierId, PartId, ProjectId, ShipDate),
       CONSTRAINT Supply_Supplier_FK FOREIGN KEY(SupplierId) REFERENCES Supplier(SupplierId),
       CONSTRAINT Supply_Part_FK FOREIGN KEY(PartId) REFERENCES Part(PartId),
       CONSTRAINT Supply_Project_FK FOREIGN KEY(ProjectId) REFERENCES Project(ProjectId)
    ) ;

    Code auquel il faut ajouter une contrainte garantissant la participation d’un projet à au moins une livraison :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE ASSERTION Project_Supply_Chk CHECK 
      (select count(y.ProjectId) from Supply y join Inserted i on y.ProjectId = i.ProjectId) > 0)

    Le SGBD que j’utilise ici (à savoir SQL Server) ne connaissant pas l’instruction CREATE ASSERTION, je pallie au moyen d’un trigger :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    CREATE TRIGGER Project_Supply_Chk on Project after insert, update as
    begin
      declare @errTexte as varchar (255) -- message d'erreur
      declare @ProjectName as varchar(24) – projet illégal
     
      if  (select count(y.ProjectId) from Supply y join Inserted i on y.ProjectId = i.ProjectId) = 0
        begin
          set @ProjectName = (select top (1) ProjectName from Inserted)
          set @errTexte = 
              char(13)
            + 'Un projet doit être associé à au moins un fournisseur (Supplier) et une pièce (Part).' 
            + char(13)
            + 'Le projet '''
            + @ProjectName 
            + ''' ne répond pas à cette obligation.' 
            + char(13)
          ; throw 314116, @errTexte, 16
        end ;
    end

    A noter que la clé primaire de la table Supply est une conséquence de la dépendance fonctionnelle suivante :

    DF1 : {SupplierId, PartId, ProjectId, ShipDate} {Quantity}

    Questions que je pose dans le contexte de Neo4j :

    (Q1) Comment garantir cette dépendance fonctionnelle ?

    (Q2) Comment garantir la contrainte Project_Supply_Chk ?

    Suite à l’examen effectué par le service des achats, une modification doit être apportée dans le contenu de la base de données : ce n’est pas le projet j001 (ProjectId = 'j001') mais le projet j998 (ProjectId = 'j998') qui, en date du 18 janvier 1971, a fait l’objet de la livraison des pièces p001 (PartId = 'p001') par le fournisseur s001 (SupplierId = 's001').

    (Q3) Avec Neo4j, comment effectuer cette mise à jour de la base de données ?

    Je vous remercie d’avance pour vos réponses.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/10/2009, 14h33
  2. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 14h35
  3. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 14h48
  4. Réponses: 2
    Dernier message: 17/04/2007, 18h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo