Grafos com Neo4j: de hidrelétricas a eletrônicos

#qconsp @hannelita

 

Olá!

 
  • Engenharia
  • Programação
  • Eletrônica
  • Matemática
  • Física
  • Lego
  • Meetups
  • Café
  • GIFs
 

#qconsp @hannelita

 

Disclaimer

 

Este conteúdo representa a opinião e vivência pessoais da palestrante.

 

Feedback (para concordar ou não) aceito em hannelita@gmail.com

 

Nem todos os dados numéricos ou nomes são verdadeiros, a fim de não comprometer sigilo empresarial

 

Todos os dados de modelagem são reais. Desculpem o possível linguajar muito técnico.

 

Estrutura - Cases

 
  • Contextualização do caso de uso
  • Tentativa de modelagem relacional (e falhas)
  • Modelagem com grafos
  • Evolução do modelo
  • Epic fails
 

Conclusão

 
  • Benefícios
  • Ferramentas de Apoio
 

#qconsp @hannelita

 

Title Text

 

Já ficou no escuro?

 

Faltou energia elétrica?

 

À luz de velas <3

 

O Brasil é um grande produtor de energia elétrica.

 

#qconsp @hannelita

 

Especialmente a partir de usinas hidrelétricas

 

#qconsp @hannelita

 

Caso 1 - Contextualização

 

#qconsp @hannelita

 

Como se dá a distribuição de energia elétrica? E a distribuição de usinas? 

 

#qconsp @hannelita

 

http://sigel.aneel.gov.br/sigel.html

 

Acessado em 28/3/2016

 

http://sigel.aneel.gov.br/sigel.html

 

Acessado em 28/3/2016

 

Algumas informações contidas nesse mapa

3
  • Localização da usina
  • Linhas de transmissão
  • Capacidade de fornecimento
  • Capacidade da usina
  • Cidades próximas
  • Distribuição
  • Fronteiras estaduais
  • Bacia hidrográfica
  • Concessões
 

Elétrica

 

Política

 

Ambiental

 

Econômico

 

#qconsp @hannelita

 

Desafio

 

Construir um sistema que armazene essas informações e como elas se relacionam

 

#qconsp @hannelita

 

Caso 1 - Tentativa de modelagem com banco de dados relacional

 

#qconsp @hannelita

 

Elétrica

 

Política

 

Ambiental

 

Econômico

 

CREATE TABLE usina;

1

CREATE TABLE cidade;

1

CREATE TABLE regiao_hidrografica;

1

CREATE TABLE cencessionaria;

1

Pergunta 1:

 

Como representar uma vizinhança de usinas?

 
  • Auto-relacionamento;
  • Denormalizar (usinas_vizinhas_ids)
1

#qconsp @hannelita

 

Pergunta 2:

 

Como identificar facilmente qual usina deve atender a uma região específica?

 
id consumo (mensal, em Mwh) populacao (em milhões) coordenada
1 40 13
2 11 2

cidade

1
id Capacidade ( Mwh) linha de transmissão (PK) coordenada
1 95 22
2 11 1

usina

1
  1. Dado um conjunto de coordenadas, somar a população do polígono resultante

#qconsp @hannelita

 

Pergunta 2:

 

Como identificar facilmente qual usina deve atender a uma região específica?

 
id consumo (mensal, em Mwh) populacao (em milhões) coordenada
1 40 13
2 11 2

cidade

1
id Capacidade ( Mwh) linha de transmissão (PK) coordenada
1 95 22
2 11 1

usina

1

2. Aproximar coordenadas das usinas mais próximas baseado-se na capacidade

#qconsp @hannelita

 

Pergunta 2:

 

Como identificar facilmente qual usina deve atender a uma região específica?

 
id consumo (mensal, em Mwh) populacao (em milhões) coordenada
1 40 13
2 11 2

cidade

1
id Capacidade ( Mwh) linha de transmissão (PK) coordenada
1 95 22
2 11 1

usina

1

3. Verificar as características na tabela de linhas_de_transmissao

2

#qconsp @hannelita

 

Não é tão complicado assim...

#qconsp @hannelita

 

Mas não acabou! 

#qconsp @hannelita

 

Pergunta 2:

 

Como identificar facilmente qual usina deve atender a uma região específica?

 
id consumo (mensal, em Mwh) populacao (em milhões) coordenada
1 40 13
2 11 2

cidade

1
id Capacidade ( Mwh) linha de transmissão (PK) coordenada
1 95 22
2 11 1

usina

1

4. Verificar se há indústrias nas proximidades das cidades

2

#qconsp @hannelita

 

Pergunta 2:

 

Como identificar facilmente qual usina deve atender a uma região específica?

 
id consumo (mensal, em Mwh) populacao (em milhões) coordenada
1 40 13
2 11 2

cidade

1
id Capacidade ( Mwh) linha de transmissão (PK) coordenada
1 95 22
2 11 1

usina

1

5. Verificar IDH da cidade.

2

#qconsp @hannelita

 

Pergunta 2:

 

Como identificar facilmente qual usina deve atender a uma região específica?

 
id consumo (mensal, em Mwh) populacao (em milhões) coordenada
1 40 13
2 11 2

cidade

1
id Capacidade ( Mwh) linha de transmissão (PK) coordenada
1 95 22
2 11 1

usina

1

6. Verificar interesse da concessionária

2

#qconsp @hannelita

 

Pergunta 2:

 

Como identificar facilmente qual usina deve atender a uma região específica?

 
id consumo (mensal, em Mwh) populacao (em milhões) coordenada
1 40 13
2 11 2

cidade

1
id Capacidade ( Mwh) linha de transmissão (PK) coordenada
1 95 22
2 11 1

usina

1

7. Verificar se região pode ser abastecida por energia de outras fontes

2

#qconsp @hannelita

 

Pergunta 2:

 

Como identificar facilmente qual usina deve atender a uma região específica?

 
id consumo (mensal, em Mwh) populacao (em milhões) coordenada
1 40 13
2 11 2

cidade

1
id Capacidade ( Mwh) linha de transmissão (PK) coordenada
1 95 22
2 11 1

usina

1

7. Verificar se região pode ser abastecida por energia de outras fontes

2

#qconsp @hannelita

 

#qconsp @hannelita

 

Pergunta 3:

 

Sabendo que as usinas operam como um "grande cabo-de-guerra de múltiplas pontas", como determinar a redistribuição de cargas se uma usina cair?

 

#qconsp @hannelita

 

Pergunta 3:

 

Sabendo que as usinas operam como um "grande cabo-de-guerra de múltiplas pontas", como determinar a redistribuição de cargas se uma usina cair?

 

#qconsp @hannelita

 

Talvez tabelas não sejam as melhores estruturas para representar informações sobre distribuição de eletricidade

#qconsp @hannelita

 

Neo4j chega para resolver! 

#qconsp @hannelita

 

Introdução relâmpago ao Neo4j

  • Banco orientado a grafos
  • ACID
  • Estruturas de Node, Relationship, Index e Label
  • Mantido pela Neo Technology
  • Open Source
  • Comunidade ativa

#qconsp @hannelita

 

Caso 1 - Modelagem com grafos

 

#qconsp @hannelita

 

Passo 1 - Unisas se tornam nós

#qconsp @hannelita

 

Powered by Arrows - http://www.apcjones.com/arrows/#

CREATE (n:Usina:Hidreletrica { name : 'Itaipu', capacidade : '14000' })
 

#qconsp @hannelita

 

Passo 2 - Cidades se tornam nós

3

#qconsp @hannelita

 

Passo 3 - Linhas de transmissão se tornam relacionamentos! 

3

#qconsp @hannelita

 

Itaipu - Ivaiporã

#qconsp @hannelita

 

MATCH (a:Hidreletrica),(b:Cidade)

WHERE a.name = 'Itaipu' AND b.name = 'Ivaipora'

CREATE (a)-[r:FORNECE { capacidade_cabo : 765, rl : 330 }]->(b) 

 

#qconsp @hannelita

 

Múltiplos relacionamentos para diversas linhas

#qconsp @hannelita

 
MATCH (a:Hidreletrica),(b:Cidade) 
WHERE a.name = 'Itaipu' AND b.name = 'Cascavel Oeste' 
CREATE (a)-[r:FORNECE { capacidade_cabo : 500 }]->(b)

MATCH (a:Cidade),(b:Cidade) 
WHERE a.name = 'Ivaipora' AND b.name = 'Cascavel Oeste' 
CREATE (a)-[r:MALHA { capacidade_cabo : 500 }]->(b)

#qconsp @hannelita

 

Passo 4 - Concessionárias se tornam nós 

3

#qconsp @hannelita

 
CREATE (n:Concessionaria { name : 'Ficticio', 
porcentagem : 85, margem : 72 })

MATCH (a:Concessionaria),(b:Cidade) 
WHERE a.name = 'Ficticio' AND b.name = 'Cascavel Oeste' 
CREATE (a)-[r:ATENDE]->(b)

MATCH (a:Concessionaria),(b:Usina) 
WHERE a.name = 'Ficticio' AND b.name = 'Ita' 
CREATE (a)-[r:POSSUI]->(b)

#qconsp @hannelita

 

Passo 5 - Queries poderosas 

3
MATCH (n:Usina {capacidade : 14000}),
      (c:Cidade {name : 'Sao Paulo'})
p = shortestPath((n)-[]-(c)) RETURN p

Queries para determinar otimização de abastecimento através de caminho mínimo

#qconsp @hannelita

 

Caso 1 - Evolução do modelo

 

#qconsp @hannelita

 

Muito importante: Index nas propriedades mais utilizadas

Capacidade, populacao, coordenadas

#qconsp @hannelita

 

Muito importante[2]: Labels

 

:Cidade, :Metropole, :Industrial, :Hidreletrica, :Eolica, :Privada

Em geral, elementos agrupáveis merecem uma Label.

 

#qconsp @hannelita

 

Evolução - Transformar outros elementos elétricos em nós

#qconsp @hannelita

 
CREATE (n:Componente:Transformador 
{ tag : 'F. Iguacu', tipo : 'Terciario', mva : 1650, total : 4 })


MATCH (a:Transformador),(b:Usina) 
WHERE a.tag = 'F. Iguacu' AND b.name = 'Itaipu' 
CREATE (a)-[r:INSTALADO]->(b)

#qconsp @hannelita

 

O Neo4j é bem flexível para evoluirmos o modelo

 

#qconsp @hannelita

 

Caso 1 - Epic Fails

 

#qconsp @hannelita

 

Muitos nós para cidades - não era necessário ter um nó para cada cidade

 

Problema

 

#qconsp @hannelita

 

Muita informação carregada no MATCH; queries lentas

 

Impacto

 

#qconsp @hannelita

 

Deixar as :Cidades mais relevantes e criar :Regiao; excluir cidades inexpressivas

 

Solução

 

#qconsp @hannelita

 

Não declarar todas as operações num arquivo para replicação.

 

Problema

 

#qconsp @hannelita

 

Problemas com backup / replicação. 

 

Impacto

 

#qconsp @hannelita

 

Não rodar CREATE na interface Web! 

Adicionar queries em um repositório Git - https://github.com/hannelita/qconsp

 

Solução

 

#qconsp @hannelita

 

Caso 1 - Extra - "O pulo do gato"

 

#qconsp @hannelita

 

Encontrar informações que passaram 

despercebidas faz toda a diferença

#qconsp @hannelita

 

Mapear os componentes em nós, por exemplo, foi significativo

#qconsp @hannelita

 

Mapear Componentes...

#qconsp @hannelita

 

Caso 2 - Contextualização

 

#qconsp @hannelita

 

A-HA! Nós podemos usar grafos para [...] (complete)

#qconsp @hannelita

 

Roteamento da placa / traçar as trilhas.

#qconsp @hannelita

 

Sim! Mas podemos ir além.

Vamos analisar e armazenar o layout das placas e dos componentes.

#qconsp @hannelita

 

Caso 2 - Tentativa de modelagem relacional

 

#qconsp @hannelita

 

Componente

 

Trilha

 

Sensor

 

Layer

 

CREATE TABLE componente;

1

CREATE TABLE trilha;

1

CREATE TABLE sensor;

1

CREATE TABLE layer;

1

Pergunta 1

Um sensor capta elevação de temperatura. Como inferir se é problema do componente ou da trilha?

 

#qconsp @hannelita

 

Pergunta 1

 

É preciso consultar outros sensores, geralmente os sensores vizinhos. Como expressar isso na tabela?

 
  • Auto-relacionamento;
  • Denormalizar (sensores_vizinhos_ids)
1

Déjà vu!

#qconsp @hannelita

 

Pergunta 2

 

Qual a trilha que afeta mais componentes?

 

#qconsp @hannelita

 

Pergunta 3

 

Será que consigo extrair alguma informação extra do circuito

representando-o num grafo?

 

#qconsp @hannelita

 

Caso 2 - Modelagem com Grafos

 

#qconsp @hannelita

 

Passo 1: Componentes em nodes

CREATE (n:Componente:Primario { name : 'R1', 
tipo : 'resistor', valor : '10K' })

CREATE (n:Componente:Primario { name : 'C1', 
tipo : 'capacitor', grupo : 'poliester', 
 valor : '100p' })

CREATE (n:Componente:CI { name : 'CI1', 
tipo : 'LM741', fabricante : 'Texas' })

#qconsp @hannelita

 

Passo 2: Mapear trilhas em relacionamentos

 
MATCH (a:Primario),(c:CI) 
WHERE a.name = 'R1' AND c.name = 'CI1' 
CREATE (a)-[r:TRILHA { espessura : 2, dilatacao : 0.5 }]->(c)

#qconsp @hannelita

 

Passo 3: Mapear Layers em Labels

 
CREATE (n:Componente:Primario:LAYER1 
{ name : 'R1', tipo : 'resistor', valor : '10K' })

CREATE (n:Componente:Primario:LAYER2 
{ name : 'C1', tipo : 'capacitor', 
grupo : 'poliester',  valor : '100p' })

CREATE (n:Componente:CI:LAYER1 { name : 'CI1', 
tipo : 'LM741', fabricante : 'Texas' })

Fácil de recuperar todos os componentes de uma Layer e suas trilhas

#qconsp @hannelita

 

Caso 2 - Evolução do modelo

 

#qconsp @hannelita

 

Passo 4: Mapear os Sensores em Nodes

 
CREATE (n:Sensor:LAYER1 
{ name : 'SS1', tipo : 'luz'})

CREATE (n:Sensor:LAYER2 
{ name : 'SS2', tipo : 'temperatura' })

MATCH (a:Primario),(s:Sensor) 
WHERE a.name = 'R1' AND c.name = 'SS1' 
CREATE (s)-[r:MONITORA { luz : 2 }]->(a)

MATCH (a:Primario),(s:Sensor) 
WHERE a.name = 'R1' AND c.name = 'SS2' 
CREATE (s)-[r:MONITORA { temperatura : 37 }]->(a)

#qconsp @hannelita

 
MATCH (n:Sensor)-[r:MONITORA]-(c:Componente)
WHERE n.temperatura > 60
RETURN c.name, r.dilatacao

Decidir se é o componente que está com problemas ou se é a trilha.

Passo 5: Rodar periodicamente a seguinte query

#qconsp @hannelita

 

Caso 2 - Epic Fails

 

#qconsp @hannelita

 

Muitos updates dos sensores. O Neo4j tem algumas limitações para write.

 

Problema

 

#qconsp @hannelita

 

Performance comprometida e alto consumo de RAM.

 

Impacto

 

#qconsp @hannelita

 

Remover os nós de alguns sensores ou ir migrar para a versão Enterprise.

 

Solução

 

#qconsp @hannelita

 

Chegando ao fim!

1
  • Modelos com flexibilidade
  • Identificar relações ocultas
  • Fácil de iniciar os trabalhos
  • Produto ativo e comunidade forte
  • Pode ser útil em muitos cenários, muito além de redes sociais ou sistemas de recomendação
 

#qconsp @hannelita

 

Ferramentas de Apoio

1
  • Importação de dados  (Bancos Relacionais, MongoDB, Cassandra, JSON, CSV)
  • Ferramentas de visualização
  • REST API no Neo4j
 

#qconsp @hannelita

 

Referências

 

#qconsp @hannelita

 

Agradecimentos

 
  • Neo Technology, @lyonwj, @ryguyrg e @mesirii 
  • B.C., pelo excelente feedback e review
  • @Codeminer42
2

#qconsp @hannelita

 
  • Prof. Maurílio e Justino, por sempre me incentivarem.
2

Obrigada :)

Perguntas?

 

 

hannelita@gmail.com

@hannelita

#qconsp @hannelita

 

Grafos com Neo4j: de hidrelétricas a eletrônicos

By Hanneli Tavante (hannelita)

Grafos com Neo4j: de hidrelétricas a eletrônicos

Grafos com Neo4j: de hidrelétricas a eletrônicos - QCON SP 2016

  • 2,539