Grafová databáze
neo4j

Josef Holý
@holyj
Josef.Holy@Proactify.com
NOSQL
     =
Not Only SQL
NOSQL Databáze

Komplexita




                              Objem



                   3
NOSQL Databáze

Komplexita




                           Key-value
                          (Cassandra)


                                    Objem



                   4
NOSQL Databáze

Komplexita




                       Column-family
                         (HBase)
                                        Key-value
                                       (Cassandra)


                                                 Objem



                   5
NOSQL Databáze

Komplexita




                   Document
                  (MongoDB)

                          Column-family
                            (HBase)
                                           Key-value
                                          (Cassandra)


                                                    Objem



                   6
NOSQL Databáze

Komplexita


                RDBMS

                         Document
                        (MongoDB)

                                Column-family
                                  (HBase)
                                                 Key-value
                                                (Cassandra)


                                                          Objem



                         7
NOSQL Databáze

Komplexita


                Graph

                         Document
                        (MongoDB)

                                Column-family
                                  (HBase)
                                                 Key-value
                                                (Cassandra)


                                                          Objem



                         8
NOSQL Databáze

Komplexita


                   Graph

                            Document
                           (MongoDB)

                                   Column-family
                                     (HBase)
                                                    Key-value
                                                   (Cassandra)



               90%                                           Objem
             Use Cases

                            9
NOSQL Databáze
 Key-value, Column, Document, Tables
              ~ agregační problémy ~

Jaký je průměrný věk lidí na této přednášce?




                       10
NOSQL Databáze
  Key-value, Column, Document, Tables
                 ~ agregační problémy ~

Jaký je průměrný věk lidí na této přednášce?


                     Graph DB
           ~ strukturální, 'vztahové', problémy ~

S kým z lidí na této přednášce bych měl jít na
                     pivo?

                            11
(Social) Graph v RDBMS
id     name

1      Adam

2     Bedřich

3     Čenda

4      David

5     Eduard



        ...


     PERSON



                12
(Social) Graph v RDBMS
id     name     start      type        start

1      Adam       1       KNOWS         2

2     Bedřich     2       KNOWS         5

3     Čenda       3       KNOWS         4

4      David                   ...

5     Eduard            RELATIONSHIP



        ...


     PERSON



                          13
Social Graph v RDBMS
id     name     start      type        start   id     name

1      Adam       1       KNOWS         2      1      Adam

2     Bedřich     2       KNOWS         5      2     Bedřich

3     Čenda       3       KNOWS         4      3     Čenda

4      David                   ...             4      David

5     Eduard            RELATIONSHIP           5     Eduard



        ...                                            ...


     PERSON                                         PERSON



                          14
Problém:

           Najdi všechny
              přátele
                přátel
                  ...
                přátel
         Čendových přátel
                   ~
V RDBMS = 'multiple JOINs' => time cost
Graph DB?


           =
Explicitně Definované
         Uzly




         16
Graph DB?


           =
Explicitně Definované
    Uzly A Hrany




         17
Graph DB?


           =
Explicitně Definované
    Uzly A Hrany




         18
Graph DB?


           =
Explicitně Definované
    Uzly A Hrany




         19
Graph DB?


                        =
             Explicitně Definované
                 Uzly A Hrany

                  Type: KNOWS




Name:Čenda                           Name:David



                       20
Graph DB?


                         =
              Explicitně Definované
             Uzly A Hrany A Property

                   Type: KNOWS




Name:Čenda              Since:1992     Name:David



                        21
RDBMS vs. GraphDB
id     name     start         label    start   id     name

1      Adam         1     KNOWS         2      1      Adam

2     Bedřich       2     KNOWS         5      2     Bedřich

3     Čenda         3     KNOWS         4      3     Čenda

4      David        3     KNOWS         5      4      David

5     Eduard            RELATIONSHIP           5     Eduard



        ...     1         2            3               ...


     PERSON                                         PERSON
                          5            4


                          22
Výhoda Graph DB
V Graph DB platíme 'cenu za vztah' při
              vytváření.


V Ostatních Databázích se cena platí při
             vyhledávání.




                   23
Grafové databáze
●
    AllegroGraph – 'Quad Store'
●
    OrientDB – 'Document-graph'
●
    FlockDB – 'Adjacency lists store'
●
    …
●
    Neo4j




                        24
Neo4j
●
    'Property Graph Database'
●
    Edice a Licence:
    ●
        Community ~ (A)GPL
    ●
        Advanced ~ Commercial
    ●
        Enterprise ~ Commercial
●
    Nasazení:
    ●
        Embedded Mode (Java, JAR)
    ●
        Standalone Mode (REST API)

                          25
Neo4j
●
    'Property Graph Database'
●
    Edice a Licence:
    ●
        Community ~ (A)GPL
    ●
        Advanced ~ Commercial
    ●
        Enterprise ~ Commercial
●
    Nasazení:
    ●
        Embedded Mode (Java, JAR)
    ●
        Standalone Mode (REST API)

                          26
Write: ACID

GraphDabaseService gdb = new
EmbeddedGraphDatabase(„/data/graph/test“, PARAMS);




                               27
Write: ACID

GraphDabaseService gdb = new EmbeddedGraphDatabase(„/data/graph/test“, PARAMS);

Transaction tx = gdb.beginTx(); //FULL ACID TX support




                                               28
Write: ACID

GraphDabaseService gdb = new EmbeddedGraphDatabase(„/data/graph/test“, PARAMS);

Transaction tx = gdb.beginTx();

try{


       tx.success();
}catch(SomeException ex){
       tx.failure();
}finally{
       tx.finish();
}




                                               29
Write: ACID
GraphDabaseService gdb = new EmbeddedGraphDatabase(„/data/graph/test“, PARAMS);

Transaction tx = gdb.beginTx();

try{

       Node c = gdb.createNode();
       c.setProperty(„name“, „ enda“);
       Node e = gdb.createNode();
       e.setProperty(„name“, „Eduard“);
       Relationship rel = c.setRelationshipTo(e, KNOWS);
    tx.success();

}catch(SomeException ex){

    tx.failure();

}finally{

    tx.finish();

}

                                               30
Read: (Lucene) Index




         31
Read: Pattern-matching


CYPHER:Najdi všechny Čendovy přátele
START cenda=node:node_auto_index(name = 'Čenda')
MATCH (cenda)-[:KNOWS]->(friend)
RETURN friend




                        32
Read: Pattern-matching


CYPHER:Najdi všechny Čendovy přátele do hloubky 5
START cenda=node:node_auto_index(name = 'Čenda')
MATCH (cenda)-[:KNOWS*5]->(friend)
RETURN friend




                        33
Read: Traversal


Gremlin:Najdi všechny Čendovy přátele
result = []
cenda = ...najdi v indexu...
cenda.outE('KNOWS').inV.aggregate(result)
return result




                        34
Read: Traversal + closure


Gremlin:Najdi všechny Čendovy přátele do hloubky 5
result = []
cenda = ...najdi v indexu...
cenda.outE('KNOWS').inV.loop(2){it.loops   <
5}.aggergate(result)
return result




                         35
Traversals vs. JOINs
       3-step traversal: Gremlin
  g.V(?).outE.inV.outE.inV.outE.inV
             1         2           3




     3-step traversal v MySQL – table JOINs
                                              1MNodes
SELECT c.inV                                     /
FROM graph as a, graph as b, graph as c       4MEdges
WHERE
a.inV=b.outV AND b.inV=c.outV AND a.outV=?
      1                2                3



                                       36
Zkušenosti: „Interest Graph“

                                      weight: 0.83
                                      LIKES



                                                     LIKES
                  LIKES                                weight: 0.745
                   Weight: 0.3
       LIKES
    weight: 0.5
                                                                              LIKES 0.6
                                                                                 weight:


                                                                LIKES
                                                                weight: 0.2




                                 37
Zkušenosti: „Interest Graph“
●
    po 10 měsících pilotního provozu
    ●
        Embedded mode (Java, Linux, Amazon EC2)
    ●
        100M+ nodes
    ●
        200M+relationships
    ●
        avg <50ms recommendations response time,
        100 reads per second




                         38
Pozor
V Graph DB platíme 'cenu za vztah' při
              vytváření.


V Ostatních Databázích se cena platí při
             vyhledávání.




                   39
Pozor
●
    Super-nodes = (10k+ relationships)
    ●
        Index-free traversal → time
    ●
        Write performance – node locked při vytvoření
        relationshipu
●
    Lucene Index
    ●
        Write performance – index locking
    ●
        'Vendor Lock-in' – messy JTA/JTS
        implementace
●
    Horizontální škálovatelnost pro Write
    ●
        Sharding support se připravuje
                         40
For anything with
multiple relationships, multiple connections,
          Neo4j absolutely ROCKS!

                                  ~ Werner Vogels
                                     Amazon CTO




                     41
Josef Holý
@holyj
Josef.Holy@Proactify.com

Grafová databáze neo4j

  • 1.
  • 2.
    NOSQL = Not Only SQL
  • 3.
  • 4.
    NOSQL Databáze Komplexita Key-value (Cassandra) Objem 4
  • 5.
    NOSQL Databáze Komplexita Column-family (HBase) Key-value (Cassandra) Objem 5
  • 6.
    NOSQL Databáze Komplexita Document (MongoDB) Column-family (HBase) Key-value (Cassandra) Objem 6
  • 7.
    NOSQL Databáze Komplexita RDBMS Document (MongoDB) Column-family (HBase) Key-value (Cassandra) Objem 7
  • 8.
    NOSQL Databáze Komplexita Graph Document (MongoDB) Column-family (HBase) Key-value (Cassandra) Objem 8
  • 9.
    NOSQL Databáze Komplexita Graph Document (MongoDB) Column-family (HBase) Key-value (Cassandra) 90% Objem Use Cases 9
  • 10.
    NOSQL Databáze Key-value,Column, Document, Tables ~ agregační problémy ~ Jaký je průměrný věk lidí na této přednášce? 10
  • 11.
    NOSQL Databáze Key-value, Column, Document, Tables ~ agregační problémy ~ Jaký je průměrný věk lidí na této přednášce? Graph DB ~ strukturální, 'vztahové', problémy ~ S kým z lidí na této přednášce bych měl jít na pivo? 11
  • 12.
    (Social) Graph vRDBMS id name 1 Adam 2 Bedřich 3 Čenda 4 David 5 Eduard ... PERSON 12
  • 13.
    (Social) Graph vRDBMS id name start type start 1 Adam 1 KNOWS 2 2 Bedřich 2 KNOWS 5 3 Čenda 3 KNOWS 4 4 David ... 5 Eduard RELATIONSHIP ... PERSON 13
  • 14.
    Social Graph vRDBMS id name start type start id name 1 Adam 1 KNOWS 2 1 Adam 2 Bedřich 2 KNOWS 5 2 Bedřich 3 Čenda 3 KNOWS 4 3 Čenda 4 David ... 4 David 5 Eduard RELATIONSHIP 5 Eduard ... ... PERSON PERSON 14
  • 15.
    Problém: Najdi všechny přátele přátel ... přátel Čendových přátel ~ V RDBMS = 'multiple JOINs' => time cost
  • 16.
    Graph DB? = Explicitně Definované Uzly 16
  • 17.
    Graph DB? = Explicitně Definované Uzly A Hrany 17
  • 18.
    Graph DB? = Explicitně Definované Uzly A Hrany 18
  • 19.
    Graph DB? = Explicitně Definované Uzly A Hrany 19
  • 20.
    Graph DB? = Explicitně Definované Uzly A Hrany Type: KNOWS Name:Čenda Name:David 20
  • 21.
    Graph DB? = Explicitně Definované Uzly A Hrany A Property Type: KNOWS Name:Čenda Since:1992 Name:David 21
  • 22.
    RDBMS vs. GraphDB id name start label start id name 1 Adam 1 KNOWS 2 1 Adam 2 Bedřich 2 KNOWS 5 2 Bedřich 3 Čenda 3 KNOWS 4 3 Čenda 4 David 3 KNOWS 5 4 David 5 Eduard RELATIONSHIP 5 Eduard ... 1 2 3 ... PERSON PERSON 5 4 22
  • 23.
    Výhoda Graph DB VGraph DB platíme 'cenu za vztah' při vytváření. V Ostatních Databázích se cena platí při vyhledávání. 23
  • 24.
    Grafové databáze ● AllegroGraph – 'Quad Store' ● OrientDB – 'Document-graph' ● FlockDB – 'Adjacency lists store' ● … ● Neo4j 24
  • 25.
    Neo4j ● 'Property Graph Database' ● Edice a Licence: ● Community ~ (A)GPL ● Advanced ~ Commercial ● Enterprise ~ Commercial ● Nasazení: ● Embedded Mode (Java, JAR) ● Standalone Mode (REST API) 25
  • 26.
    Neo4j ● 'Property Graph Database' ● Edice a Licence: ● Community ~ (A)GPL ● Advanced ~ Commercial ● Enterprise ~ Commercial ● Nasazení: ● Embedded Mode (Java, JAR) ● Standalone Mode (REST API) 26
  • 27.
    Write: ACID GraphDabaseService gdb= new EmbeddedGraphDatabase(„/data/graph/test“, PARAMS); 27
  • 28.
    Write: ACID GraphDabaseService gdb= new EmbeddedGraphDatabase(„/data/graph/test“, PARAMS); Transaction tx = gdb.beginTx(); //FULL ACID TX support 28
  • 29.
    Write: ACID GraphDabaseService gdb= new EmbeddedGraphDatabase(„/data/graph/test“, PARAMS); Transaction tx = gdb.beginTx(); try{ tx.success(); }catch(SomeException ex){ tx.failure(); }finally{ tx.finish(); } 29
  • 30.
    Write: ACID GraphDabaseService gdb= new EmbeddedGraphDatabase(„/data/graph/test“, PARAMS); Transaction tx = gdb.beginTx(); try{ Node c = gdb.createNode(); c.setProperty(„name“, „ enda“); Node e = gdb.createNode(); e.setProperty(„name“, „Eduard“); Relationship rel = c.setRelationshipTo(e, KNOWS); tx.success(); }catch(SomeException ex){ tx.failure(); }finally{ tx.finish(); } 30
  • 31.
  • 32.
    Read: Pattern-matching CYPHER:Najdi všechnyČendovy přátele START cenda=node:node_auto_index(name = 'Čenda') MATCH (cenda)-[:KNOWS]->(friend) RETURN friend 32
  • 33.
    Read: Pattern-matching CYPHER:Najdi všechnyČendovy přátele do hloubky 5 START cenda=node:node_auto_index(name = 'Čenda') MATCH (cenda)-[:KNOWS*5]->(friend) RETURN friend 33
  • 34.
    Read: Traversal Gremlin:Najdi všechnyČendovy přátele result = [] cenda = ...najdi v indexu... cenda.outE('KNOWS').inV.aggregate(result) return result 34
  • 35.
    Read: Traversal +closure Gremlin:Najdi všechny Čendovy přátele do hloubky 5 result = [] cenda = ...najdi v indexu... cenda.outE('KNOWS').inV.loop(2){it.loops < 5}.aggergate(result) return result 35
  • 36.
    Traversals vs. JOINs 3-step traversal: Gremlin g.V(?).outE.inV.outE.inV.outE.inV 1 2 3 3-step traversal v MySQL – table JOINs 1MNodes SELECT c.inV / FROM graph as a, graph as b, graph as c 4MEdges WHERE a.inV=b.outV AND b.inV=c.outV AND a.outV=? 1 2 3 36
  • 37.
    Zkušenosti: „Interest Graph“ weight: 0.83 LIKES LIKES LIKES weight: 0.745 Weight: 0.3 LIKES weight: 0.5 LIKES 0.6 weight: LIKES weight: 0.2 37
  • 38.
    Zkušenosti: „Interest Graph“ ● po 10 měsících pilotního provozu ● Embedded mode (Java, Linux, Amazon EC2) ● 100M+ nodes ● 200M+relationships ● avg <50ms recommendations response time, 100 reads per second 38
  • 39.
    Pozor V Graph DBplatíme 'cenu za vztah' při vytváření. V Ostatních Databázích se cena platí při vyhledávání. 39
  • 40.
    Pozor ● Super-nodes = (10k+ relationships) ● Index-free traversal → time ● Write performance – node locked při vytvoření relationshipu ● Lucene Index ● Write performance – index locking ● 'Vendor Lock-in' – messy JTA/JTS implementace ● Horizontální škálovatelnost pro Write ● Sharding support se připravuje 40
  • 41.
    For anything with multiplerelationships, multiple connections, Neo4j absolutely ROCKS! ~ Werner Vogels Amazon CTO 41
  • 42.