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

1,701 views
1,600 views

Published on

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.

Published in: Technology
2 Comments
6 Likes
Statistics
Notes
  • Até hj nem vi isso pois eu soh armazeno a ligação das entidades, raramente coloco dados nos nós, deixo isso no MongoDb :D

    ps: VALEU!
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Ficou bastante engraçado, porém ajudou bastante na compreensão.
    Uma dúvida é sobre o tamanho do banco de dados, até o momento não realizei o teste para verificar se acumula bastante espaço.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
1,701
On SlideShare
0
From Embeds
0
Number of Embeds
47
Actions
Shares
0
Downloads
15
Comments
2
Likes
6
Embeds 0
No embeds

No notes for slide

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

  1. 1. Conheça seu primeirobanco de dados orientado a GRAFOS Jean Carlo Nascimento aka Suissa
  2. 2. El Suissa nosqlbr.com.br jquerybrasil.org frontendbrasil.com.br javascriptbrasil.com.br comoprogramarphp.com.br github.com/suissa about.me/suissa @osuissa
  3. 3. GRAFO WTF?
  4. 4. parent_id é um grafo
  5. 5. Quem inventou isso?
  6. 6. 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é!
  7. 7. Leonhard Euler● Número de Euler● Fórmula de Euler● Constante de Euler-Mascheroni● Conjectura de Euler● Igualdade de Euler● Teorema de Euler● Teoria dos grafos
  8. 8. Paguei pau.
  9. 9. De onde surgiu esse manolo?
  10. 10. Por que ele fez isso?
  11. 11. Por quê?!Ah é nessa época não tinha internet.
  12. 12. Sete pontes de Königsberg
  13. 13. Neo4J● Transações ACID● 32 bilhões de nós● 32 bilhões de relacionamentos● 64 bilhoões de propriedades● REST API ou JVM Embedded
  14. 14. Mas isso não é muito novo?
  15. 15. Modelo Relacional
  16. 16. 1970
  17. 17. Grafos
  18. 18. 1736
  19. 19. Tudo muito bonito mas qual a diferença?
  20. 20. O custo da busca local de um grafo continua omesmo independente do seu tamanho.
  21. 21. Cypher
  22. 22. REST API AMEN!
  23. 23. Criar um novo nó vazioPOST http://localhost:7474/db/data/node201 CreatedPOST http://localhost:7474/db/data/node {"nome":"Suissa"}201 Created
  24. 24. Ler um nóGET http://localhost:7474/db/data/node/27200 OkGET http://localhost:7474/db/data/node/666404 Not Found
  25. 25. Deleta um nóDELETE http://localhost:7474/db/data/node/26204 No Content*Um nó com relacionamento não pode ser deletadoPOST 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
  26. 26. Primeiro o relacionamentoDELETE http://localhost:7474/db/data/relationship/1204 No ContentDELETE http://localhost:7474/db/data/node/27204 No ContentE para deletar todos os nós?
  27. 27. Adicionando propriedadesPOST http://localhost:7474/db/data/node201 CreatedPUT http://localhost:7474/db/data/node/29/properties/idade 28204 No ContentPUT 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 objetoJSON.
  28. 28. Adicionando propriedadesEstes 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"}" }
  29. 29. Modificando uma propriedadePUT http://localhost:7474/db/data/node/29/properties/nome"Cumpadi Uóxinton"204 No ContentPUT http://localhost:7474/db/data/node/29/properties{"nome": "Cumpadi Uóxinton"}204 No Content
  30. 30. Deletando uma propriedadeDELETE http://localhost:7474/db/data/node/29/properties/cursosDeletando todas as propriedadesDELETE http://localhost:7474/db/data/node/29/properties
  31. 31. 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}
  32. 32. 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" }}
  33. 33. 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"}]
  34. 34. 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" }}
  35. 35. 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"}]
  36. 36. Todos os comandostambém funcionam para as relações Só trocar node por relationship
  37. 37. 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 serdeletado
  38. 38. E o PHP mano?
  39. 39. cURL
  40. 40. Alternativas● https://github.com/onewheelgood/Neo4J-REST-PHP- API-client● https://github.com/lphuberdeau/Neo4j-PHP-OGM● https://github.com/jadell/neo4jphp
  41. 41. Neo4J.phpuse EverymanNeo4jClient, EverymanNeo4jTransport, EverymanNeo4jNode, EverymanNeo4jRelationship; $client = new Client(new Transport(localhost, 7474));
  42. 42. 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();
  43. 43. 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";}
  44. 44. 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();}
  45. 45. Perguntas?

×