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.

Labcodes Software Studio

September 03, 2016
Tweet

More Decks by Labcodes Software Studio

Other Decks in Technology

Transcript

  1. 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
  2. Roteiro Relacionamentos Banco de Dados em Grafo Neo4J Comparando BDs

    em Grafo Neo4J vs Banco Relacional Aplicações
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. Melhoria de performance utilizando mecanismos de armazenamento baseado em sistemas

    NoSQL. Escalabilidade Horizontal Processamento Distribuído Banco de Dados em Grafo VANTAGENS
  10. 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
  11. { "results": [ {... "graph": { "nodes": [ { "id":

    "1", "labels": [ "User" ], "properties": { "gender": "M", "name": "João", "age": "28" } } ], "relationships": [] } }], ... }
  12. { "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": {}} ] }}], ... }
  13. { "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" } ], ...}], ...}
  14. 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
  15. 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()
  16. 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"})
  17. Comparando BDs em Grafo Neo4J OrientDB TitanDB Grafo Nativo Multi-Model

    Grafo + Backend DB Java Java Java Cypher SQL Estendido Gremlin
  18. 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
  19. 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
  20. 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
  21. 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/
  22. É 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
  23. 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()
  24. 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]