NEO4J ET SON ECOSYSTÈME
                                                                              Sylvain ROUSSY
                                                        Ingénieur conseil – HINNOYA
                                                                sroussy@hinnoya.fr
                                                                                 @SylvainRoussy




   JUG Lyon : – Neo4j et son ecosystème                      15 Janvier 2013 –
   sroussy@hinnoya.fr
JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Plan


     Qu’est-ce que NEO4j ?
     Qu’est qu’une BDD orientée « Graphe » ?
     Pourquoi utiliser une BDD orientée « Graphe » ?
     A propos de NEO4j…
     NEO4j avec Java
     NEO4j sans Java
     Interroger NEO4j
     Intégrer NEO4j
     S’abstraire de NEO4j
     Outillage
     Conclusions

JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
QU’EST-CE QUE NEO4J ?




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Qu’est-ce que NEO4j ?




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Qu’est-ce que NEO4j ?




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr   5
Qu’est-ce que NEO4j ?




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr   6
Qu’est-ce que NEO4j ?




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr   7
Qu’est-ce que NEO4j ?




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr   8
Qu’est-ce que NEO4j ?




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr   9
Qu’est-ce que NEO4j ?




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr   10
QU’EST-CE QU’UNE BASE DE
       DONNÉES ORIENTÉE « GRAPHE »?




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Base de données orientée « Graphe »


* Une base dont la structure est représentée sous forme de
  « graphe » (théorie des graphes)




     Ce graphe est basé sur des Nœuds et des Arcs

             NEO4j :                    Node – Relationships
             Blueprints :               Vertex – Edges


JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Base de données orientée « Graphe »


* Dans cette structure de données, nous considérons
  que la relation est aussi importante que l’entité

     La relation est identifiée par un nom (sémantique)




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Quelques bases de données orientées « Graphe »


   NEO4j (Java)
 Neo Technology

   OrientDB (Java)
 Nuvela Base

   DEX (C++)
 Sparsity Technologies

   TinkerGraph (Java)
 TinkerPop



JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
POURQUOI UTILISER UNE BASE DE
      DONNÉES ORIENTÉE « GRAPHE »?




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Reconnaître des structures




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Reconnaître des structures




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Reconnaître des structures




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Reconnaître des structures


     Quels sont, dans mon cercle d’amis, les victimes et les
     revendeurs de mes livres ?

                                Sylvain -> « PRETE » -> Ami
                                 Ami -> « VENDS » -> Ami2
                               Ami2 -> « OFFRE » -> Sylvain




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Cas d’utilisations


     Où la relation est importante !
       Réseaux sociaux (Viadeo, LinkedIn, etc.)

     Où la reconnaissance de structure est importante !
       Fraudes, Excellences
       Mes amis qui n’en sont pas…

     Où le chemin est important ! (Shortest Path, …)
       Généalogie (Héritage)
       Système d’information géographique
       Séquence (Groupware, etc.)

JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
A PROPOS DE NEO4J




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
A propos de NEO4j

     Editeur : Neo Technology (créée en 2000 – Suède/USA)

     Version stable à ce jour : 1.8.1 (14/12/2012)
     Version en cours de stabilisation : 1.9 M03

     30 Milliards de nœuds
     30 Milliards de relations
     64 Milliards de propriétés

     www.neo4j.org
     « HEROKU »




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
A propos de NEO4j


     Deux types d’utilisation :

           Embedded
      GraphDatabaseService graph =
                          new EmbeddedGraphDatabase("/var/mydb");



           Server (JETTY)
                 REST API




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
NEO4J AVEC JAVA




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Créer des nœuds…

     // Création d’un premier nœud

     Node node1 = graph.createNode();
     node1.setProperty("name", "Base de données");


     // Création d’un second nœud

     Node node2 = graph.createNode();
     node1.setProperty("name", « NEO4j");




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
… et créer des relations

     // Création d'une relation "EST" du second noeud vers le premier

     Relationship rel =
                 node2.createRelationshipTo(node1,
                 DynamicRelationshipType.withName("EST")) ;




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Indexer des propriétés (Lucène)


     Basé sur triplette : propriété, valeur, objet

     Implicitement par configuration
           node_auto_indexing=true
           node_keys_indexable=name,age
           relationship_auto_indexing=true
           relationship_keys_indexable=name,age


     Explicitement
       Par le code (IndexManager)
       Manuellement (Shell)
       REST

JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Utiliser les transactions (ACID)

     // Ouverture et Commit d’une transaction

     Transaction tx = graph.beginTx ();
     […]
     tx.success ();

     // RollBack

     tx.failure ();

     Fermeture de la transaction                                    (relâchement des
     verrous)

     tx.finish ();


JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
NEO4J SANS JAVA




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Créer des nœuds…
      // Création d’un premier noeud

      POST http://localhost:7474/db/data/node
      Accept: application/json
      Content-Type: application/json

      {
          "name" : "base de données"
      }

      // Création d’un second noeud

      POST http://localhost:7474/db/data/node
      Accept: application/json
      Content-Type: application/json

      {
          "name" : « NEO4j"
      }

JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
… et créer des relations
      // Création d’un premier noeud

      POST http://localhost:7474/db/data/node/1/relationships
      Accept: application/json
      Content-Type: application/json

      {
          "to" : "http://localhost:7474/db/data/node/0",
          "type" : « EST"
      }




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Batch


     Transaction atomique

     POST http://localhost:7474/db/data/batch
     Accept: application/json
     Content-Type: application/json




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
INTERROGER NEO4J




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
CYPHER : Langage d’interrogation


     Langage d’interrogation propriétaire à NEO4j
     Proche de SQL
     Permet l’interrogation et la modification des
     données

     Basé sur quatre éléments clés :

           START : nœud(s) ou relation(s) de départ
           MATCH : motif relationnel
           WHERE : restriction
           RETURN : éléments à retourner
JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
CYPHER : Langage d’interrogation

     Quels sont, dans mon cercle d’amis, les victimes et
     les revendeurs de mes livres ?

START sylvain=node(0)

MATCH sylvain-[:PRETE]->ami-[:VENDS]->ami2-[:OFFRE]->sylvain

RETURN ami.Nom AS REVENDEUR, ami2.Nom AS VICTIME




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
CYPHER : Langage d’interrogation



     CYPHER s’utilise depuis :

           Le code JAVA

           L’API REST

           La console d’administration Web

           Le Shell




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Code Java : Utiliser un « traversier » (Traversal)


     TraversalDescription description =
     Traversal.description()
        .breadthFirst()
        .relationships (PRETE, Direction.OUTGOING )
        .relationships(VENDS, Direction.OUTGOING )
        .relationships(OFFRE, Direction.OUTGOING )
        .evaluator( Evaluators.toDepth( 5 ) )
        .uniqueness (Uniqueness.RELATIONSHIP_PATH);




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Code Java : Utiliser un traversier (Traversal)

     Node sylvain = graph.getNodeById(0);
     for (Path position : description.traverse( sylvain ) )
     {
       System.out.println ("Path :"+position.toString());
     }



         Path :(0)
         Path :(0)--[PRETE,1]-->(2)
         Path :(0)--[PRETE,1]-->(2)--[VENDS,2]-->(3)
         Path :(0)--[PRETE,1]-->(2)--[VENDS,2]-->(3)--[OFFRE,3]-->(0)




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
GREMLIN : Langage d’interrogation (Tinkerpop)

     GREMLIN est Groovy
     NEO4J, Tinkergraph, DEX, OrientDB, etc.




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
INTÉGRER NEO4J (DAO)




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
En pure Java
     public class Person
     {
       static final String NAME = "name";

         private final Node underlyingNode;

         Person( Node personNode ) {
           this.underlyingNode = personNode;
         }

         protected Node getUnderlyingNode() {
           return underlyingNode;
         }

            public String getName() {
             return (String)underlyingNode.getProperty( NAME );
         } […]


JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Avec Spring DATA
      @NodeEntity
      public class Movie
      {
        @GraphId
        Long id;

         @Indexed(type = FULLTEXT, indexName = "search")
         String title;

         Person director;

         @RelatedTo(type="ACTS_IN", direction = INCOMING)
         Set<Person> actors;

         @RelatedToVia(type = "RATED")
         Iterable<Rating> ratings;

        @Query("start movie=node({self}) match movie-->genre<--similar return
      similar")
         Iterable<Movie> similarMovies;
      }
                                      http://www.springsource.org/spring-data/neo4j

JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
S’ABSTRAIRE DE NEO4J




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Tinkerpop




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Tinkerpop : Blueprints


     Graph blueGraph = new Neo4jGraph("/var/mydb");

     Vertex v1 = blueGraph.addVertex(1);
     v1.setProperty("name", "Base de données");

     Vertex v2 = blueGraph.addVertex(2);
     v2.setProperty("name", "NEO4j");

     Edge rel = blueGraph.addEdge(3, v1, v2, "EST");



JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Tinkerpop : Frames

     public interface FramesPerson extends VertexFrame
     {
         @Property ("lastname")
         public String getLastname ();

             @Property ("lastname")
             public void setLastName (String lastname);

             @Adjacency (label = "KNOWS")
             public Iterable<FramePerson> getFriends ();

             @Adjacency (label = "KNOWS")
             public void addFriend (FramesPerson friend);
     }

JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
OUTILLAGE




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Shell


     Permet la consultation d’une base en cours
     d’utilisation !

 $> Neo4jShell -path /var/mydb -readonly




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Console Web - Dashboard

     http://monserveur_db:7474




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Console Web – Data browser




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Console Web – Console




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Neoclipse




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
POURQUOI NEO4J ?




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Pourquoi NEO4j ?


     Support d’un éditeur : Neo Technology

      • Version communautaire (GPL)

      • Version Advanced (AGPL)
             • Advanced monitoring

      • Version Enterprise (AGPL)
             • Sauvegarde à chaud
             • HA


     Documentation dense (+500 pages pour le manuel)

JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
CONCLUSION




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Conclusion



     Représentation naturelle des relations


     « Data driven »



     Savoir-faire en cours…




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr
Merci de votre attention !



     Questions ?




JUG Lyon : – Neo4j et son écosystème   15 Janvier 2013 – sroussy@hinnoya.fr

201301 - Focus Neo4j

  • 1.
    NEO4J ET SONECOSYSTÈME Sylvain ROUSSY Ingénieur conseil – HINNOYA sroussy@hinnoya.fr @SylvainRoussy JUG Lyon : – Neo4j et son ecosystème 15 Janvier 2013 – sroussy@hinnoya.fr JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 2.
    Plan Qu’est-ce que NEO4j ? Qu’est qu’une BDD orientée « Graphe » ? Pourquoi utiliser une BDD orientée « Graphe » ? A propos de NEO4j… NEO4j avec Java NEO4j sans Java Interroger NEO4j Intégrer NEO4j S’abstraire de NEO4j Outillage Conclusions JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 3.
    QU’EST-CE QUE NEO4J? JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 4.
    Qu’est-ce que NEO4j? JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 5.
    Qu’est-ce que NEO4j? JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr 5
  • 6.
    Qu’est-ce que NEO4j? JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr 6
  • 7.
    Qu’est-ce que NEO4j? JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr 7
  • 8.
    Qu’est-ce que NEO4j? JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr 8
  • 9.
    Qu’est-ce que NEO4j? JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr 9
  • 10.
    Qu’est-ce que NEO4j? JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr 10
  • 11.
    QU’EST-CE QU’UNE BASEDE DONNÉES ORIENTÉE « GRAPHE »? JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 12.
    Base de donnéesorientée « Graphe » * Une base dont la structure est représentée sous forme de « graphe » (théorie des graphes) Ce graphe est basé sur des Nœuds et des Arcs NEO4j : Node – Relationships Blueprints : Vertex – Edges JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 13.
    Base de donnéesorientée « Graphe » * Dans cette structure de données, nous considérons que la relation est aussi importante que l’entité La relation est identifiée par un nom (sémantique) JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 14.
    Quelques bases dedonnées orientées « Graphe » NEO4j (Java) Neo Technology OrientDB (Java) Nuvela Base DEX (C++) Sparsity Technologies TinkerGraph (Java) TinkerPop JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 15.
    POURQUOI UTILISER UNEBASE DE DONNÉES ORIENTÉE « GRAPHE »? JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 16.
    Reconnaître des structures JUGLyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 17.
    Reconnaître des structures JUGLyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 18.
    Reconnaître des structures JUGLyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 19.
    Reconnaître des structures Quels sont, dans mon cercle d’amis, les victimes et les revendeurs de mes livres ? Sylvain -> « PRETE » -> Ami Ami -> « VENDS » -> Ami2 Ami2 -> « OFFRE » -> Sylvain JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 20.
    Cas d’utilisations Où la relation est importante ! Réseaux sociaux (Viadeo, LinkedIn, etc.) Où la reconnaissance de structure est importante ! Fraudes, Excellences Mes amis qui n’en sont pas… Où le chemin est important ! (Shortest Path, …) Généalogie (Héritage) Système d’information géographique Séquence (Groupware, etc.) JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 21.
    A PROPOS DENEO4J JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 22.
    A propos deNEO4j Editeur : Neo Technology (créée en 2000 – Suède/USA) Version stable à ce jour : 1.8.1 (14/12/2012) Version en cours de stabilisation : 1.9 M03 30 Milliards de nœuds 30 Milliards de relations 64 Milliards de propriétés www.neo4j.org « HEROKU » JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 23.
    A propos deNEO4j Deux types d’utilisation : Embedded GraphDatabaseService graph = new EmbeddedGraphDatabase("/var/mydb"); Server (JETTY) REST API JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 24.
    NEO4J AVEC JAVA JUGLyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 25.
    Créer des nœuds… // Création d’un premier nœud Node node1 = graph.createNode(); node1.setProperty("name", "Base de données"); // Création d’un second nœud Node node2 = graph.createNode(); node1.setProperty("name", « NEO4j"); JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 26.
    … et créerdes relations // Création d'une relation "EST" du second noeud vers le premier Relationship rel = node2.createRelationshipTo(node1, DynamicRelationshipType.withName("EST")) ; JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 27.
    Indexer des propriétés(Lucène) Basé sur triplette : propriété, valeur, objet Implicitement par configuration node_auto_indexing=true node_keys_indexable=name,age relationship_auto_indexing=true relationship_keys_indexable=name,age Explicitement Par le code (IndexManager) Manuellement (Shell) REST JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 28.
    Utiliser les transactions(ACID) // Ouverture et Commit d’une transaction Transaction tx = graph.beginTx (); […] tx.success (); // RollBack tx.failure (); Fermeture de la transaction (relâchement des verrous) tx.finish (); JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 29.
    NEO4J SANS JAVA JUGLyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 30.
    Créer des nœuds… // Création d’un premier noeud POST http://localhost:7474/db/data/node Accept: application/json Content-Type: application/json { "name" : "base de données" } // Création d’un second noeud POST http://localhost:7474/db/data/node Accept: application/json Content-Type: application/json { "name" : « NEO4j" } JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 31.
    … et créerdes relations // Création d’un premier noeud POST http://localhost:7474/db/data/node/1/relationships Accept: application/json Content-Type: application/json { "to" : "http://localhost:7474/db/data/node/0", "type" : « EST" } JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 32.
    Batch Transaction atomique POST http://localhost:7474/db/data/batch Accept: application/json Content-Type: application/json JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 33.
    INTERROGER NEO4J JUG Lyon: – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 34.
    CYPHER : Langaged’interrogation Langage d’interrogation propriétaire à NEO4j Proche de SQL Permet l’interrogation et la modification des données Basé sur quatre éléments clés : START : nœud(s) ou relation(s) de départ MATCH : motif relationnel WHERE : restriction RETURN : éléments à retourner JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 35.
    CYPHER : Langaged’interrogation Quels sont, dans mon cercle d’amis, les victimes et les revendeurs de mes livres ? START sylvain=node(0) MATCH sylvain-[:PRETE]->ami-[:VENDS]->ami2-[:OFFRE]->sylvain RETURN ami.Nom AS REVENDEUR, ami2.Nom AS VICTIME JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 36.
    CYPHER : Langaged’interrogation CYPHER s’utilise depuis : Le code JAVA L’API REST La console d’administration Web Le Shell JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 37.
    Code Java :Utiliser un « traversier » (Traversal) TraversalDescription description = Traversal.description() .breadthFirst() .relationships (PRETE, Direction.OUTGOING ) .relationships(VENDS, Direction.OUTGOING ) .relationships(OFFRE, Direction.OUTGOING ) .evaluator( Evaluators.toDepth( 5 ) ) .uniqueness (Uniqueness.RELATIONSHIP_PATH); JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 38.
    Code Java :Utiliser un traversier (Traversal) Node sylvain = graph.getNodeById(0); for (Path position : description.traverse( sylvain ) ) { System.out.println ("Path :"+position.toString()); } Path :(0) Path :(0)--[PRETE,1]-->(2) Path :(0)--[PRETE,1]-->(2)--[VENDS,2]-->(3) Path :(0)--[PRETE,1]-->(2)--[VENDS,2]-->(3)--[OFFRE,3]-->(0) JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 39.
    GREMLIN : Langaged’interrogation (Tinkerpop) GREMLIN est Groovy NEO4J, Tinkergraph, DEX, OrientDB, etc. JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 40.
    INTÉGRER NEO4J (DAO) JUGLyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 41.
    En pure Java public class Person { static final String NAME = "name"; private final Node underlyingNode; Person( Node personNode ) { this.underlyingNode = personNode; } protected Node getUnderlyingNode() { return underlyingNode; } public String getName() { return (String)underlyingNode.getProperty( NAME ); } […] JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 42.
    Avec Spring DATA @NodeEntity public class Movie { @GraphId Long id; @Indexed(type = FULLTEXT, indexName = "search") String title; Person director; @RelatedTo(type="ACTS_IN", direction = INCOMING) Set<Person> actors; @RelatedToVia(type = "RATED") Iterable<Rating> ratings; @Query("start movie=node({self}) match movie-->genre<--similar return similar") Iterable<Movie> similarMovies; } http://www.springsource.org/spring-data/neo4j JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 43.
    S’ABSTRAIRE DE NEO4J JUGLyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 44.
    Tinkerpop JUG Lyon :– Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 45.
    Tinkerpop : Blueprints Graph blueGraph = new Neo4jGraph("/var/mydb"); Vertex v1 = blueGraph.addVertex(1); v1.setProperty("name", "Base de données"); Vertex v2 = blueGraph.addVertex(2); v2.setProperty("name", "NEO4j"); Edge rel = blueGraph.addEdge(3, v1, v2, "EST"); JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 46.
    Tinkerpop : Frames public interface FramesPerson extends VertexFrame { @Property ("lastname") public String getLastname (); @Property ("lastname") public void setLastName (String lastname); @Adjacency (label = "KNOWS") public Iterable<FramePerson> getFriends (); @Adjacency (label = "KNOWS") public void addFriend (FramesPerson friend); } JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 47.
    OUTILLAGE JUG Lyon :– Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 48.
    Shell Permet la consultation d’une base en cours d’utilisation ! $> Neo4jShell -path /var/mydb -readonly JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 49.
    Console Web -Dashboard http://monserveur_db:7474 JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 50.
    Console Web –Data browser JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 51.
    Console Web –Console JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 52.
    Neoclipse JUG Lyon :– Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 53.
    POURQUOI NEO4J ? JUGLyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 54.
    Pourquoi NEO4j ? Support d’un éditeur : Neo Technology • Version communautaire (GPL) • Version Advanced (AGPL) • Advanced monitoring • Version Enterprise (AGPL) • Sauvegarde à chaud • HA Documentation dense (+500 pages pour le manuel) JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 55.
    CONCLUSION JUG Lyon :– Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 56.
    Conclusion Représentation naturelle des relations « Data driven » Savoir-faire en cours… JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr
  • 57.
    Merci de votreattention ! Questions ? JUG Lyon : – Neo4j et son écosystème 15 Janvier 2013 – sroussy@hinnoya.fr