Neo4 o quê? Uma visão prática de banco de dados orientado a grafos

4,530 views
4,324 views

Published on

Nesta palestra pretendo apresentar uma visão prática da teoria de grafos e de banco de dados orientados a este paradigma e demonstrar porque bancos de dados relacionais cada vez mais tornam-se incapazes de atender as necessidades das aplicações de grande porte. Também pretendo demonstrar na prática porque o Neo4j "kick some asses".

Published in: Technology
1 Comment
10 Likes
Statistics
Notes
No Downloads
Views
Total views
4,530
On SlideShare
0
From Embeds
0
Number of Embeds
301
Actions
Shares
0
Downloads
0
Comments
1
Likes
10
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Neo4 o quê? Uma visão prática de banco de dados orientado a grafos

    1. 1. Trilha – NoSQL Neo4 o que? Uma visão prática de banco de dados orientado a grafos Eder Ignatowicz Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    2. 2. Eder Ignatowicz... Generalista (Arquitetura, NoSQL, Devops, QA) Doutorando na Unicamp (Polyglot Persistence em Cidades Digitais) Professor na Faccamp e Unisal Editor líder no InfoQ Brasil @ederign Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    3. 3. O que nós desejamos? Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    4. 4. Nós desejamos construir aplicações úteis e principalmente legais! Claro que discussões teóricas são divertidas, mas o que eu quero de verdade é impressionar meus usuários... Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    5. 5. Eu quero respostas rápidas do meu datastore; E quero confiar que meus dados estão seguros. Se meu datastore disser que salvou, eu quero acreditar nele. Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    6. 6. Mas eu também fui maltratado pelos bancos relacionais Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    7. 7. Toda vez que tive que exercitar/expremer meus dados Eu perdi a semântica e sempre tive que fazer trabalho extra (complexidade acidental, impedância OO) Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    8. 8. Eu tive que adaptar meu diagrama Entidade-Relacionamento para mapeá-lo para um modelo físico. (sem falar nas formas normais) Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    9. 9. Eu tenho problemas de performance em alguns (e importantes) casos Query Time Data size Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    10. 10. Ainda bem que existem alternativas (mas nenhuma delas é bala de prata) Key-Value Document Graph Column Family Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    11. 11. Utilize o datastore mais apropriado para seu problema específico Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    12. 12. Porque eu usaria grafos? Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    13. 13. Grafos estão em toda parte Política, Economia, Historia, Ciência Biologia, Química, Física, Sociologia Família, amigos, trabalho, comunidades, vizinhança, cidades, sociedade Nosso corpo, reações, interatividade etc. etc. etc. Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    14. 14. Grafos são bons para Sistemas de Recomendação Business intelligence Social computing Sistemas Geoespaciais Sistemas de gerenciamento Web of things Catálogo de Produtos Web analytics Computação científica (especialmente bioinformática) Índice de RDBMS e muito mais Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    15. 15. O mundo é baseado em relacionamentos O mundo é feito de dados ricos, “bagunçados” e complexos Interações complexas Os dados e suas estruturas sempre mudam Grafos => Relacionamentos são parte dos dados RDBMS => Relacionamentos são parte do esquema fixo Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    16. 16. Neo4j é *A* base de dados baseada em Grafos Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    17. 17. Mas a minha solução relacional tradicional é madura! NoSQL é modinha... Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    18. 18. Conheça Leonhard Euler Matemático Suiço Inventor da teoria dos grafos (1736) Existe a possibilidade de se atravessar todas as pontes da cidade sem repetir nenhuma? Caminho ou Grafo Euleriano Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    19. 19. Maturidade dos modelos de dados Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    20. 20. Extraído da Melhor maneira de aprender neo4j https://github.com/jimwebber/neo4j-tutorial/ Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    21. 21. Mas é necessário mudar o mindset 4"+*#$5-%." 0*$#"1&2*13,*&-#" !"#$%"&(%")*++%,*&-%".*" /+%)#" Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    22. 22. Performance: Rede Social “path exists” •  !"#$%&$()*+, •  -./,#$00*10, !"#$%&(&" )*$%+",-$" •  2#%*"&131$()$,45, B$81C*(18, .555, E5550, 31)1D10$, 1&6*07#$00*1, F$*;G, .555, E0, •  pathExists(a,b), F$*;G, .555555, E0, 8&&)13*,1, #%*9:(3&313$,;, •  <1=>$,?@:$()$A, Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    23. 23. Embeddable e server Interface REST (Palestra de amanhã!!!) Transações ACID Schema free Estável Alta performance Acesso transversal a 1.000.000 de relacionamentos/segundo em hardware de commodity Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    24. 24. Modelo de Grafos: representação Abstrações principais: Nós Relacionamento entre nós Propriedades Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    25. 25. Modelo de Grafos: representação Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    26. 26. Criando um nó public void createCarol() { Node carol = null; Node eder = db.getNodeById(0); Transaction tx = db.beginTx(); try { carol = db.createNode(); carol.setProperty("firstname", "Ana Carolina"); carol.setProperty("lastname", "Ignatowicz"); carol.createRelationshipTo(eder, ExampleRelationShipType.MARRIED_WITH); tx.success(); } finally { tx.finish(); } } Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    27. 27. Criando RelationShips public enum ExampleRelationShipType implements RelationshipType { FRIEND, MARRIED_WITH, UNCLE, NIECE } porcelli.createRelationshipTo(eder, DynamicRelationshipType.withName ("CORDENADOR_TDC")); Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    28. 28. Traversing a node Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    29. 29. Traversing a node public void transversing() { Node eder = db.getNodeById(0); Traverser friendsTraverser = eder.traverse( Traverser.Order.BREADTH_FIRST, StopEvaluator.END_OF_GRAPH, ReturnableEvaluator.ALL_BUT_START_NODE, ExampleRelationShipType.FRIEND, Direction.OUTGOING); System.out.println("Meus amigos:"); for (Node friend : friendsTraverser) { System.out.println(friend.getProperty("firstname")); } } Meus amigos: Otavio Edward Jose Papo Porcelli Tiago Motta Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    30. 30. Excluindo quem gosta de SqlServer Traverser friendsTraverser = eder.traverse( Traverser.Order.BREADTH_FIRST, StopEvaluator.END_OF_GRAPH, new ReturnableEvaluator() { public boolean isReturnableNode(TraversalPosition pos) { Node sqlServer = db.getNodeById(15); if (pos.currentNode().hasRelationship( ExampleRelationShipType.KNOWS, Direction.OUTGOING)) { if (pos.currentNode() .getSingleRelationship( ExampleRelationShipType.KNOWS, Direction.OUTGOING).getEndNode() .equals(sqlServer)) { return false; } } return true; } }, ExampleRelationShipType.FRIEND, Direction.OUTGOING); Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    31. 31. Traverser x Index Traversal Navega por um grafo, identifica caminhos Revela dados localizados, encontra o que é relevante a partir de um dado Index Mapeia nós ou relacionamentos. Encontra pontos de início para um traversal Queryable (Lucene) Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    32. 32. Index Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    33. 33. Index Set<String> allCharacterNames = getAllCharacterNames(); AutoIndexer<Node> charactersAutoIndex = db.index() .getNodeAutoIndexer(); charactersAutoIndex.startAutoIndexingProperty("character"); charactersAutoIndex.setEnabled(true); Index<Node> characters = universe.getDatabase().index() .forNodes("characters"); IndexHits<Node> results = characters.query("character", "*"); Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    34. 34. Existem outras formas de navegação? Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    35. 35. Navegação Gremlin - Graph Scripting algorithmic approach Cypher - declarative querying a “pattern matching” approach Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    36. 36. Gremlin DSL de grafos g - o próprio grafo g.v(0) - nó zero g.v(0).in - nós conectados ao nó 0 Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    37. 37. Gremlin Posso adicionar vértices, relacionamentos, etc. gremlin> g.V.filter{it.firstname==Porcelli}.in (FRIEND).firstname ==> Jose Papo Qual dos meus amigos possui amigo em comum comigo? gremlin> eder.out(FRIEND).in(FRIEND).filter{!it.equals (eder)}.firstname ==> Edward Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    38. 38. Cases de Performance Comparative Analysis of Relational And Graph Databases Shalini Batra, Charu Tyagi International Journal of Soft Computing and Engineering (IJSCE) - 2012 Consultas de relacionamento Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    39. 39. Cases de Performance Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    40. 40. Cases de Performance A Comparison of a Graph Database and a Relational Database: A Data Provenance Perspective Chad Vicknair et. al Baseado num DAG - directed acyclic graph Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    41. 41. Cases de Performance S0: Find all orphan nodes S4: Traverse the graph to a depth of 4 and count the number of nodes reachable. S128: Traverse the graph to a depth of 128 and count the number of nodes reachable Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    42. 42. Cases de Performance I1: Count the number of nodes whose payload data is equal to some value. I2: Count the number or of nodes whose payload data is less than some value. Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    43. 43. Cases de Performance C1: Count the number of nodes whose payload data contains some search string (length ranges from 4 to 8). Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    44. 44. Cases de Performance Segundo o autor: O Neo4j se saiu melhor em queries estruturais Full-text search é muito superior Em numeric queries não é tão eficiente (lucene é baseado em Strings) Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    45. 45. Case Cadastro Social Sistema Social de uma Grande Prefeitura de SP Os cidadãos são atendidos por diversos programas sociais e estes são oferecidos em determinados bairros do município. Um cidadão pode residir ou ter residido em um bairro e durante este período ter recebido benefício do programa social no bairro de sua residência. Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    46. 46. Case Cadastro Social O assistente social deseja realizar a seguinte consulta ao sistema de gestão social: "Quais cidadãos receberam benefícios do programa saúde da família durante o período que residiram no bairro Proença?" Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    47. 47. Case Cadastro Social Inviável no modelo Relacional: JOINs em diversas tabelas (pessoas, programas de saúde, domicilios, histórico de domicilios da pessoa e registro de benefícios) Desempenho excelente no Neo4j Resultados na EC2 semelhantes aos resultados do path exists (aguardando publicação do paper) Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    48. 48. Pontos fortes do Neo4j Perfeitos pra dados não estruturados, schemaless e typeless Não coloca constraints de como os dados são relacionados (free-for-all) Suporta 34.4 bilhões de nós e 34.4 bilhões de relacionamentos em um grafo (42 nós por usuário do facebook) Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    49. 49. Pontos fortes do Neo4j Várias ferramentas: Lucene, Gremlin e a interface REST Rápido: traversals são em tempo “constante” A versão enterprise tem HA extremamente robusta Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    50. 50. Pontos fracos do Neo4j Escolha de nomenclatura (node == vertex e relationship == edge) HA é excelente, mas só replica o grafo completo (não faz sharding de subgrafos, limitando o tamanho dos grafos) Produção de verdade só com a versão Enterprise (HA e backups) Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    51. 51. Neo4j e o CAP High availability é AP (consistência “eventual”) Neo4j HA é melhor para read-mostly Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    52. 52. Conclusão Neo4j é *A* implementação de graph databases Graph databases focam em relacionamento entre os dados Modelar um grafo é simples Querying é fácil, pois só precisamos declarar como caminhar pelo grafo Grafos são a estrutura de dados natural dos seres humanos Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    53. 53. Dúvidas? @ederign Globalcode  –  Open4educationdomingo, 8 de julho de 2012
    54. 54. Bibliografia https://github.com/jimwebber/neo4j-tutorial/ Diversas apresentações da neo4j Globalcode  –  Open4educationdomingo, 8 de julho de 2012

    ×