ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

85
Conheça seu primeiro banco de dados orientado a GRAFOS Jean Carlo Nascimento aka Suissa

Upload: suissa

Post on 08-May-2015

1.337 views

Category:

Technology


0 download

DESCRIPTION

Palestra apresentada no PHPnRIo 2013. Pequena introdução sobre NoSQL e o modelo de grafos. Explicação de como o Neo4J funciona e exemplificação utilizando códigos. Finalizando com um pequeno exemplo de rede social com Neo4J e PHP.

TRANSCRIPT

Page 1: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Conheça seu primeiro banco de dados orientado

a GRAFOSJean Carlo Nascimento aka Suissa

Page 2: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 4: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

GRAFOWTF?

Page 5: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 6: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 7: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 8: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 9: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 10: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 11: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 12: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

parent_id é um grafo

Page 13: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Quem inventou isso?

Page 14: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 15: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Euler foi um dos mais prolíficos matemáticos,

calcula-se que toda a sua obra reunida teria entre

60 e 80 volumes.Fonte: Wikipedia, mas eu boto fé!

Page 16: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

● Número de Euler● Fórmula de Euler● Constante de Euler-Mascheroni● Conjectura de Euler● Igualdade de Euler● Teorema de Euler● Teoria dos grafos

Leonhard Euler

Page 17: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 18: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Paguei pau.

Page 19: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

De onde surgiu esse manolo?

Page 20: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 21: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 22: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Por que ele fez isso?

Page 23: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 24: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Por quê?!Ah é nessa época não tinha internet.

Page 25: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Sete pontes de Königsberg

Page 26: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 27: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 28: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 29: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 30: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 31: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 32: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

● Transações ACID● 32 bilhões de nós● 32 bilhões de relacionamentos● 64 bilhoões de propriedades● REST API ou JVM Embedded

Neo4J

Page 33: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Mas isso não é muito novo?

Page 34: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 35: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Modelo Relacional

Page 36: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

1970

Page 37: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Grafos

Page 38: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

1736

Page 39: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 40: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Tudo muito bonito mas qual a diferença?

Page 41: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

O custo da busca local de um grafo continua o

mesmo independente do seu tamanho.

Page 42: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 43: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 44: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 45: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Cypher

Page 46: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 47: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 48: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 49: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 50: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 51: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 52: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 53: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 54: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

REST APIAMEN!

Page 55: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Criar um novo nó vazio

POST http://localhost:7474/db/data/node201 Created

POST http://localhost:7474/db/data/node {"nome":"Suissa"}201 Created

Page 56: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Ler um nó

GET http://localhost:7474/db/data/node/27200 Ok

GET http://localhost:7474/db/data/node/666404 Not Found

Page 57: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Deleta um nó

DELETE http://localhost:7474/db/data/node/26204 No Content*Um nó com relacionamento não pode ser deletado

POST http://localhost:7474/db/data/node {"name":"NoSQL"}POST http://localhost:7474/db/data/node/27/relationships {"to" : "http://localhost:7474/db/data/node/28", "type" : "Evangeliza"}DELETE http://localhost:7474/db/data/node/27409 Conflict

Page 58: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 59: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Primeiro o relacionamentoDELETE http://localhost:7474/db/data/relationship/1204 No Content

DELETE http://localhost:7474/db/data/node/27204 No Content

E para deletar todos os nós?

Page 60: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 61: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Adicionando propriedadesPOST http://localhost:7474/db/data/node201 Created

PUT http://localhost:7474/db/data/node/29/properties/idade 28204 No Content

PUT http://localhost:7474/db/data/node/29/properties {"nome":"Suissa", "idade":28, "cursos":["neo4j", "mongodb"]}

*Um valor de propriedade não pode ser nulo ou um objeto JSON.

Page 62: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Adicionando propriedades

Estes dois comandos irão falhar:PUT http://localhost:7474/db/data/node/29/properties {"nome":"Suissa", "idade":28, "cursos":null}PUT http://localhost:7474/db/data/node/29/properties {"nome":"Suissa", "idade":28, "cursos":{"nosql":"mongodb", "nosql":"neo4j"}}

Mas estes irão funcionarPUT http://localhost:7474/db/data/node/29/properties {"nome":"Suissa", "idade":28, "cursos":""}PUT http://localhost:7474/db/data/node/29/properties {"nome":"Suissa", "idade":28, "cursos": "{\"nosql\":\"mongodb\", \"nosql\":\"neo4j\"}" }

Page 63: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Modificando uma propriedadePUT http://localhost:7474/db/data/node/29/properties/nome "Cumpadi Uóxinton"204 No Content

PUT http://localhost:7474/db/data/node/29/properties {"nome": "Cumpadi Uóxinton"}204 No Content

Page 64: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Deletando uma propriedadeDELETE http://localhost:7474/db/data/node/29/properties/cursos

Deletando todas as propriedadesDELETE http://localhost:7474/db/data/node/29/properties

Page 65: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 66: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Atravessando nósPOST http://localhost:7474/db/data/node/13/traverse/nodeAccept: application/jsonContent-Type: application/json{ "order": "breadth_first", "return_filter": { "body": "position.endNode().getProperty('name').toLowerCase().contains('t')", "language": "javascript" }, "prune_evaluator": { "body": "position.length() > 10", "language": "javascript" }, "uniqueness": "node_global", "relationships": [{ "direction": "all", "type": "knows" }, { "direction": "all", "type": "loves" }], "max_depth": 3}

Page 67: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 68: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Atravessando relacionamentosPOST http://localhost:7474/db/data/node/6/traverse/relationshipAccept: application/jsonContent-Type: application/json{ "order" : "breadth_first", "uniqueness" : "none", "return_filter" : { "language" : "builtin", "name" : "all" }}

Page 69: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Atravessando relacionamentos[ { "start" : "http://localhost:7474/db/data/node/6", "data" : { }, "self" : "http://localhost:7474/db/data/relationship/1", "property" : "http://localhost:7474/db/data/relationship/1/properties/{key}", "properties" : "http://localhost:7474/db/data/relationship/1/properties", "type" : "know", "extensions" : { }, "end" : "http://localhost:7474/db/data/node/5"}, { "start" : "http://localhost:7474/db/data/node/6", "data" : { }, "self" : "http://localhost:7474/db/data/relationship/2", "property" : "http://localhost:7474/db/data/relationship/2/properties/{key}", "properties" : "http://localhost:7474/db/data/relationship/2/properties", "type" : "own", "extensions" : { }, "end" : "http://localhost:7474/db/data/node/4"} ]

Page 70: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 71: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Atravessando caminhosPOST http://localhost:7474/db/data/node/9/traverse/pathAccept: application/jsonContent-Type: application/json{ "order" : "breadth_first", "uniqueness" : "none", "return_filter" : { "language" : "builtin", "name" : "all" }}

Page 72: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Atravessando caminhos[ { "start" : "http://localhost:7474/db/data/node/9", "nodes" : [ "http://localhost:7474/db/data/node/9" ], "length" : 0, "relationships" : [ ], "end" : "http://localhost:7474/db/data/node/9"}, { "start" : "http://localhost:7474/db/data/node/9", "nodes" : [ "http://localhost:7474/db/data/node/9", "http://localhost:7474/db/data/node/8" ], "length" : 1, "relationships" : [ "http://localhost:7474/db/data/relationship/3" ], "end" : "http://localhost:7474/db/data/node/8"}, { "start" : "http://localhost:7474/db/data/node/9", "nodes" : [ "http://localhost:7474/db/data/node/9", "http://localhost:7474/db/data/node/7" ], "length" : 1, "relationships" : [ "http://localhost:7474/db/data/relationship/4" ], "end" : "http://localhost:7474/db/data/node/7"} ]

Page 73: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Todos os comandos também funcionam para

as relaçõesSó trocar node por relationship

Page 74: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Todos os tipos de relacionamentosGET http://localhost:7474/db/data/relationship/types200 OK["Evangeliza","CONHECE","Ama"]

*Uma vez criado um relacionamento ele não pode mais ser deletado

Page 75: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

E o PHP mano?

Page 76: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 77: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

cURL

Page 78: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos
Page 79: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Alternativas● https://github.com/onewheelgood/Neo4J-REST-PHP-

API-client● https://github.com/lphuberdeau/Neo4j-PHP-OGM● https://github.com/jadell/neo4jphp

Page 80: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Neo4J.phpuse Everyman\Neo4j\Client,

Everyman\Neo4j\Transport,Everyman\Neo4j\Node,Everyman\Neo4j\Relationship;

$client = new Client(new Transport('localhost', 7474));

Page 81: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Neo4J.php$keanu = new Node($client);$keanu->setProperty('name', 'Keanu Reeves')->save();

$laurence = new Node($client);$laurence->setProperty('name', 'Laurence Fishburne')->save();

$matrix = new Node($client);$matrix->setProperty('title', 'The Matrix')->save();

$constantine = new Node($client);$constantine>setProperty('title', 'Constantine')->save();

Page 82: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Neo4J.php$keanu->relateTo($matrix, 'IN')->save();$keanu->relateTo($constantine, 'IN')->save();$laurence->relateTo($matrix, 'IN')->save();

echo $keanu->getProperty('name') . " filmou:\n";$relationships = $laurence->getRelationships('IN');foreach ($relationships as $relationship) { $movie = $relationship->getEndNode(); echo "\t" . $movie->getProperty('title') . "\n";}

Page 83: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Object Graph Modelfunction findRecommendations(User $user){

return $em->createCypherQuery()->startWithNode('user', $user)->match('user -[:follow]-> followedBy <-[:follow]- similarInterest')->match('similarInterest -[:follow]-> potentialMatch')->end('potentialMatch', 'count(*)')->order('count(*) DESC')->limit(10)->getList();

}

Page 84: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos

Perguntas?

Page 85: Ph pn rio 2012 - conheça seu primeiro banco de dados orientado a grafos