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
- 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
CREATE TABLE cidade;
CREATE TABLE regiao_hidrografica;
CREATE TABLE cencessionaria;
Pergunta 1:
Como representar uma vizinhança de usinas?

- Auto-
relacionamento ; - Denormalizar (usinas_vizinhas_ids)
#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
id | Capacidade ( Mwh) | linha de transmissão (PK) | coordenada |
---|---|---|---|
1 | 95 | 22 | |
2 | 11 | 1 |
usina
- 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 |
id | Capacidade ( Mwh) | linha de transmissão (PK) | coordenada |
---|---|---|---|
1 | 95 | 22 | |
2 | 11 | 1 |
usina
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 |
id | Capacidade ( Mwh) | linha de transmissão (PK) | coordenada |
---|---|---|---|
1 | 95 | 22 | |
2 | 11 | 1 |
usina
3. Verificar as características
#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 |
id | Capacidade ( Mwh) | linha de transmissão (PK) | coordenada |
---|---|---|---|
1 | 95 | 22 | |
2 | 11 | 1 |
usina
4. Verificar se há indústrias nas proximidades das cidades
#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 |
id | Capacidade ( Mwh) | linha de transmissão (PK) | coordenada |
---|---|---|---|
1 | 95 | 22 | |
2 | 11 | 1 |
usina
5. Verificar IDH da cidade.
#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 |
id | Capacidade ( Mwh) | linha de transmissão (PK) | coordenada |
---|---|---|---|
1 | 95 | 22 | |
2 | 11 | 1 |
usina
6. Verificar interesse da concessionária
#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 |
id | Capacidade ( Mwh) | linha de transmissão (PK) | coordenada |
---|---|---|---|
1 | 95 | 22 | |
2 | 11 | 1 |
usina
7. Verificar se região pode ser abastecida por energia de outras fontes
#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 |
id | Capacidade ( Mwh) | linha de transmissão (PK) | coordenada |
---|---|---|---|
1 | 95 | 22 | |
2 | 11 | 1 |
usina
7. Verificar se região pode ser abastecida por energia de outras fontes
#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
#qconsp @hannelita

Passo 3 - Linhas de transmissão se tornam relacionamentos!
#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
#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
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;
CREATE TABLE trilha;
CREATE TABLE sensor;
CREATE TABLE layer;
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)
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 !
- 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
- Importação de dados (Bancos Relacionais, MongoDB, Cassandra, JSON, CSV)
- Ferramentas de visualização
- REST API no Neo4j
#qconsp @hannelita

Referências
- Neo4j Meetup em São Paulo
- Neo4j Slack Users
- Neo4j Training (Gratuito)
- Arrows (Ferramenta para Sketch)
#qconsp @hannelita

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

#qconsp @hannelita

- Prof. Maurílio e Justino, por sempre me incentivarem.
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,588