grafová databáze neo4j
DESCRIPTION
Prezentace o grafové databázi neo4J z CZJUGU z května 2012.TRANSCRIPT
Josef Holý@[email protected]
Grafová databáze neo4j
NOSQL =
Not Only SQL
3
NOSQL Databáze
Komplexita
Objem
4
NOSQL Databáze
Komplexita
Key-value(Cassandra)
Objem
5
NOSQL Databáze
Komplexita
Column-family(HBase)
Objem
Key-value(Cassandra)
6
NOSQL Databáze
Komplexita
Document(MongoDB)
Objem
Key-value(Cassandra)
Column-family(HBase)
7
NOSQL Databáze
Objem
Komplexita
RDBMS
Key-value(Cassandra)
Column-family(HBase)
Document(MongoDB)
8
NOSQL Databáze
Objem
Komplexita
Graph
Key-value(Cassandra)
Column-family(HBase)
Document(MongoDB)
9
NOSQL Databáze
Objem
Komplexita
Graph
Key-value(Cassandra)
Column-family(HBase)
Document(MongoDB)
90% Use Cases
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?
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?
12
(Social) Graph v RDBMS
1 Adam
2 Bedřich
3 Čenda
4 David
5 Eduard
...
id name
PERSON
13
(Social) Graph v RDBMS
1 Adam
2 Bedřich
3 Čenda
4 David
5 Eduard
...
id name
1 KNOWS 2
start starttype
2 KNOWS 5
3 KNOWS 4
...
PERSON
RELATIONSHIP
14
Social Graph v RDBMS
1 Adam
2 Bedřich
3 Čenda
4 David
5 Eduard
...
id name
1 KNOWS 2
start starttype
1 Adam
2 Bedřich
3 Čenda
4 David
5 Eduard
...
id name
2 KNOWS 5
3 KNOWS 4
...
PERSON PERSON
RELATIONSHIP
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
17
Graph DB?
=Explicitně Definované
Uzly A Hrany
18
Graph DB?
=Explicitně Definované
Uzly A Hrany
19
Graph DB?
=Explicitně Definované
Uzly A Hrany
20
Graph DB?
=Explicitně Definované
Uzly A Hrany
Name:Čenda Name:David
Type: KNOWS
21
Graph DB?
=Explicitně Definované
Uzly A Hrany A Property
Name:Čenda Name:DavidSince:1992
Type: KNOWS
22
RDBMS vs. GraphDB
1 Adam
2 Bedřich
3 Čenda
4 David
5 Eduard
...
id name
1 KNOWS 2
start startlabel
1 Adam
2 Bedřich
3 Čenda
4 David
5 Eduard
...
id name
2 KNOWS 5
3 KNOWS 4
1 2 3
5 4
3 KNOWS 5
RELATIONSHIP
PERSON PERSON
23
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í.
24
Grafové databáze
● AllegroGraph – 'Quad Store'● OrientDB – 'Document-graph'● FlockDB – 'Adjacency lists store'● …● Neo4j
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
Neo4j
● 'Property Graph Database'● Edice a Licence:
● Community ~ (A)GPL● Advanced ~ Commercial● Enterprise ~ Commercial
● Nasazení:● Embedded Mode (Java, JAR)● Standalone Mode (REST API)
27
Write: ACID
GraphDabaseService gdb = new EmbeddedGraphDatabase(„/data/graph/test“, PARAMS);
28
Write: ACID
GraphDabaseService gdb = new EmbeddedGraphDatabase(„/data/graph/test“, PARAMS);
Transaction tx = gdb.beginTx(); //FULL ACID TX support
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();
}
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();
}
31
Read: (Lucene) Index
32
Read: Pattern-matching
START cenda=node:node_auto_index(name = 'Čenda')MATCH (cenda)-[:KNOWS]->(friend)RETURN friend
CYPHER:Najdi všechny Čendovy přátele
33
Read: Pattern-matching
START cenda=node:node_auto_index(name = 'Čenda')MATCH (cenda)-[:KNOWS*5]->(friend)RETURN friend
CYPHER:Najdi všechny Čendovy přátele do hloubky 5
34
Read: Traversal
result = []cenda = ...najdi v indexu...cenda.outE('KNOWS').inV.aggregate(result)return result
Gremlin:Najdi všechny Čendovy přátele
35
Read: Traversal + closure
result = []cenda = ...najdi v indexu...cenda.outE('KNOWS').inV.loop(2){it.loops < 5}.aggergate(result)return result
Gremlin:Najdi všechny Čendovy přátele do hloubky 5
36
Traversals vs. JOINs
1MNodes/
4MEdgesSELECT c.inV FROM graph as a, graph as b, graph as cWHEREa.inV=b.outV AND b.inV=c.outV AND a.outV=?
3-step traversal v MySQL – table JOINs
1 2 3
g.V(?).outE.inV.outE.inV.outE.inV
3-step traversal: Gremlin
1 2 3
37
Zkušenosti: „Interest Graph“
LIKES
LIKES
LIKES
LIKES
LIKES
LIKESweight: 0.5
Weight: 0.3
weight: 0.83
weight: 0.745
weight: 0.2
weight: 0.6
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
39
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í.
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
41
For anything with multiple relationships, multiple connections,
Neo4j absolutely ROCKS!
~ Werner VogelsAmazon CTO
Josef Holý@[email protected]