Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Graph Databases: Discutindo o Relacionamento dos seus Dados com Python

Graph Databases: Discutindo o Relacionamento dos seus Dados com Python

Você já parou pra pensar quantos relacionamentos você tem na sua vida virtual? Cada amigo no Facebook, cada página curtida, cada conexão no Linkedin ou cada perfil seguido no Twitter. Só no Brasil, temos 160 milhões de usuários do Facebook. Como representar e manipular todas essas relações? Graph Databases são banco de dados que usam estruturas de grafos (vértices e arestas) para representar e armazenar dados de forma semântica.

A palestra será iniciada com a problematização da representação de relacionamentos em Bancos de Dados Relacionais e com a apresentação de uma solução mais amigável usando Grafos. Será abordada a definição de Graph Database, suas vantagens e desvantagens, comparação de algumas ferramentas disponíveis (Neo4J, OrientDB e ArangoDB) e a aplicação de tais ferramentas em Python.

9c551fb4d374217cabb9a1ece02202b3?s=128

Labcodes Software Studio

September 03, 2016
Tweet

Transcript

  1. Graph Databases: Discutindo o Relacionamento dos seus Dados com Python

    Nicolle Cysneiros
  2. Quem sou eu Fullstack Developer @ Labcodes Django | AngularJS

    Mestranda em Ciência da Computação na UFPE Análise BI em Banco de Dados em Grafo PUG-PE e PyLadies Recife
  3. Labcodes Software studio de Recife para o mundo Tecnologias que

    trabalhamos Labcodes e Comunidade
  4. Roteiro Relacionamentos Banco de Dados em Grafo Neo4J Comparando BDs

    em Grafo Neo4J vs Banco Relacional Aplicações
  5. Relacionamentos

  6. Relacionamentos

  7. Uma rede social onde um usuário pode ser amigo de

    outro usuário ou curtir uma página, funcionando de forma similar ao Facebook. Representando relacionamentos CENÁRIO
  8. Representando relacionamentos BANCO DE DADOS RELACIONAL Usuário ID Nome Gênero

    Idade 1 João M 28 2 Maria F 26 3 Francis F 31 Amigo ID_1 ID_2 1 2 2 3
  9. Representando relacionamentos BANCO DE DADOS RELACIONAL Página ID Nome Categoria

    1 Coca-cola Comida/Bebida 2 The Beatles Banda/Músico 3 Apple Tecnologia Curte ID_Usuario ID_Pagina 1 2 3 2 1 1 2 3
  10. G = (V,E) Grafo é uma estrutura de dados G

    formada por um conjunto de vértices V e um conjunto E de pares de vértices (arestas) Representando relacionamentos GRAFOS
  11. Representando relacionamentos GRAFOS

  12. Banco de Dados em Grafo

  13. Banco de Dados em Grafo É um sistema que armazena

    dados em estruturas de grafo, permitindo também o armazenamento explícito do relacionamento entre eles. Relacionamento Explícito Recuperação Direta da Informação
  14. Permitem a realização de análises mais elaboradas dos dados, usando

    algoritmos conhecidos da área de Teoria dos Grafos. Detecção de Comunidade Reconhecimento de Padrões Medidas de Centralidade Banco de Dados em Grafo VANTAGENS
  15. Banco de Dados em Grafo VANTAGENS

  16. Melhoria de performance utilizando mecanismos de armazenamento baseado em sistemas

    NoSQL. Escalabilidade Horizontal Processamento Distribuído Banco de Dados em Grafo VANTAGENS
  17. Neo4J

  18. Neo4J Banco de Dados em Grafo nativo mais popular, de

    acordo com o DB Engines Implementado em Java Linguagem de consulta própria: Cypher Dados podem ser acessados a partir de uma API REST e uma API Java
  19. Neo4J EXEMPLOS - CRIAR VÉRTICE (NODE)

  20. CREATE (joao:User {name:"João", gender:"M", age:"28"}) RETURN joao

  21. Neo4J EXEMPLOS - CRIAR VÉRTICE (NODE): Resultado

  22. { "results": [ {... "graph": { "nodes": [ { "id":

    "1", "labels": [ "User" ], "properties": { "gender": "M", "name": "João", "age": "28" } } ], "relationships": [] } }], ... }
  23. Neo4J EXEMPLOS - CRIAR RELACIONAMENTO

  24. MATCH (joao:User), (maria:User) WHERE joao.name="João" AND maria.name="Maria" CREATE (joao)-[f:FRIENDS_WITH]->(maria) RETURN

    joao, f, maria
  25. Neo4J EXEMPLOS - CRIAR RELACIONAMENTO: Resultado

  26. { "results": [ {... "graph": { "nodes": [ { "id":

    "1", "labels": [ "User" ], "properties": { "gender": "M", "name": "João", "age": "28" }}, { "id": "2", "labels": [ "User" ], "properties": { "gender": "F", "name": "Maria", "age": "26" }} ], "relationships": [ { "id": "0", "type": "FRIENDS_WITH", "startNode": "1", "endNode": "2", "properties": {}} ] }}], ... }
  27. Neo4J EXEMPLOS - BANCO COMPLETO

  28. Neo4J EXEMPLOS - CONSULTA

  29. MATCH (joao:User {name:"João"})-[l:LIKES]->(pages:Page) RETURN joao, l, pages

  30. Neo4J EXEMPLOS - CONSULTA: Resultado

  31. { "results": [{ ... "data": [ {"row": [ { "gender":

    "M", "name": "João", "age": "28" }, {}, { "name": "The Beatles", "category": "Músico/Banda" } ], ... }, {"row": [ { "gender": "M", "name": "João", "age": "28" }, {}, { "name": "Coca-Cola", "category": "Comida/Bebida" } ], ...}], ...}
  32. Módulo Python para trabalhar com Neo4J a partir de aplicações

    ou de linha de comando. Suporta Python 2 e 3 e garante suporte para distribuições CPython. Neo4J + Python Py2Neo
  33. Neo4J + Python CRIAR VÉRTICES (NODES) E RELACIONAMENTOS

  34. from py2neo import Graph, Node, Relationship g = Graph(password="admin") tx

    = g.begin() joao = Node("User", name="João", gender="M", age="28") tx.create(joao) maria = Node("User", name="Maria", gender="F", age="26") tx.create(maria) jm = Relationship(joao, "FRIENDS_WITH", maria) tx.create(jm) tx.commit()
  35. Neo4J + Python CONSULTAR

  36. from py2neo import Graph, Node, Relationship, NodeSelector g = Graph(password="admin")

    selector = NodeSelector(g) joao = selector.select("User", name="João").first() joao_likes = g.match(start_node=joao, rel_type="LIKES") for like in joao_likes: page = like.end_node() print(page) >>> (e0f611c:Page {category:"Músico/Banda",name:"The Beatles"}) (ac6964f:Page {category:"Comida/Bebida",name:"Coca-Cola"})
  37. Comparando BDs em Grafo

  38. Comparando BDs em Grafo Neo4J OrientDB TitanDB Grafo Nativo Multi-Model

    Grafo + Backend DB Java Java Java Cypher SQL Estendido Gremlin
  39. Cypher - Neo4J SQL Extendido - OrientDB Gremlin - TitanDB

    Comparando BDs em Grafo MATCH (User {name: "João"}) -[:LIKES]-> (pages) RETURN pages SELECT EXPAND( BOTH('LIKES') ) FROM User WHERE name="João" g.V.has('name','João').out('LIKES')*.name
  40. Comparando BDs em Grafo PERFORMANCE Font: http://bit.ly/1s2K0IN

  41. Comparando BDs em Grafo PERFORMANCE Font: http://bit.ly/2cgrvAD

  42. Neo4J vs Banco Relacional

  43. Cypher - Neo4J SQL Neo4J vs Banco Relacional SELECT u.nome,

    u.genero, u.idade FROM Usuario u, Curte c, Pagina p WHERE p.nome = "The Beatles" AND p.ID = c.ID_Pagina AND c.ID_Usuario = u.ID MATCH (User {name: "João"}) -[:LIKES]-> (pages) RETURN pages
  44. Neo4J vs Banco Relacional PERFORMANCE Font: http://www.cs.olemiss.edu/~ychen/publications/conference/vicknair_acmse10.pdf

  45. Aplicações

  46. Existem muitas áreas onde a utilização de Banco de Dados

    em Grafos se torna importante, como: Redes Sociais Bioinformática Análise Genética Telecomunicações Aplicações
  47. None
  48. Graph of Thrones Andrew Beveridge e Jie Shan analisaram uma

    rede formada pelos personagens do livro “Tormenta das Espadas”. William Lyon importou esses dados para o Neo4J. Source Target Weight Aemon Grenn 5 Lemon Samwell 31 Aerys Jaime 18 Font: http://www.lyonwj.com/2016/06/26/graph-of-thrones-neo4j-social-network-analysis/
  49. É um módulo Python que permite a manipulação de grafo

    usando algoritmos conhecidos, como centralidade e detecção de comunidades Trabalhando com Python iGraph
  50. Trabalhando com Python iGraph + Neo4J - Detecção de Comunidade

  51. from py2neo import Graph from igraph import Graph as IGraph

    graph = Graph() query = ''' MATCH (c1:Character)-[r:INTERACTS]->(c2:Character) RETURN c1.name, c2.name, r.weight AS weight ''' ig = IGraph.TupleList(graph.run(query), weights=True) clusters = IGraph.community_walktrap( ig, weights="weight" ).as_clustering()
  52. Trabalhando com Python iGraph + Neo4J - Detecção de Comunidade

    cluster members 0 [Aemon, Alliser, Craster, Eddison, Gilly, Janos, Jon, Mance, Rattleshirt, Samwell, Val, Ygritte, Grenn, Karl, Bowen, …] 1 [Aerys, Amory, Balon, Brienne, Bronn, Cersei, Gregor, Jaime, Joffrey, Jon Arryn, Kevan, Loras, Lysa, Meryn, Myrcella, Oberyn,…] 2 [Arya, Beric, Eddard, Gendry, Sandor, Anguy, Thoros] 3 [Brynden, Catelyn, Edmure, Hoster, Lothar, Rickard, Robb, Roose, Walder, Jeyne, Roslin, Ramsay] 4 [Bran, Hodor, Jojen, Luwin, Meera, Rickon, Nan, Theon] 5 [Belwas, Daario, Daenerys, Irri, Jorah, Missandei, Rhaegar, Viserys, Barristan, Illyrio, Drogo, Aegon, Kraznys, Rakharo, Worm] 6 [Davos, Melisandre, Shireen, Stannis, Cressen, Salladhor] 7 [Lancel]
  53. None
  54. Dúvidas? www.labcodes.com.br speakerdeck.com/labcodes github.com/nicysneiros twitter.com/nicysneiros

  55. None