Grafos com Neo4j:Grafos com Neo4j:de hidrelétricas ade hidrelétricas a
eletrônicoseletrônicos
#qconsp @hannelita
Olá!Olá!EngenhariaProgramaçãoEletrônicaMatemáticaFísicaLegoMeetupsCaféGIFs
#qconsp @hannelita
DisclaimerDisclaimerEste conteúdo representa a opinião eEste conteúdo representa a opinião e
vivência pessoais da palestrante.vivência pessoais da palestrante.
Feedback (para concordar ou não)Feedback (para concordar ou não)aceito em [email protected] em [email protected]
Nem todos os dados numéricos ouNem todos os dados numéricos ounomes são verdadeiros, a fim de nãonomes são verdadeiros, a fim de não
comprometer sigilo empresarialcomprometer sigilo empresarial
Todos os dados de modelagem sãoTodos os dados de modelagem sãoreais. Desculpem o possível linguajarreais. Desculpem o possível linguajar
muito técnico.muito técnico.
Estrutura - CasesEstrutura - Cases
Contextualização do caso de usoTentativa de modelagem relacional (e falhas)Modelagem com grafosEvolução do modeloEpic fails
ConclusãoConclusãoBenefíciosFerramentas de Apoio
#qconsp @hannelita
Title TextTitle Text
Já ficou no escuro?Já ficou no escuro?
Faltou energiaFaltou energiaelétrica?elétrica?
À luz de velas <3À luz de velas <3
O Brasil é um grandeO Brasil é um grandeprodutor de energiaprodutor de energia
elétrica.elétrica.
#qconsp @hannelita
Especialmente aEspecialmente apartir de usinaspartir de usinas
hidrelétricashidrelétricas
#qconsp @hannelita
Caso 1 -Caso 1 -ContextualizaçãoContextualização
#qconsp @hannelita
Como se dá a distribuição de energiaelé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
3
Algumas informações Algumas informações contidascontidas nessenessemapamapa
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
AmbientalEconômico
#qconsp @hannelita
DesafioDesafioConstruir um sistema queConstruir um sistema que
armazene essasarmazene essasinformações e como elas seinformações e como elas se
relacionamrelacionam
#qconsp @hannelita
Caso 1 - Tentativa deCaso 1 - Tentativa demodelagem commodelagem combanco de dadosbanco de dados
relacionalrelacional#qconsp @hannelita
1 1
1 1
Elétrica Política
Ambiental Econômico
CREATE TABLE usina; CREATE TABLE cidade;
CREATE TABLEregiao_hidrografica;
CREATE TABLEcencessionaria;
1
Pergunta 1:Pergunta 1:Como representar umaComo representar umavizinhança de usinas?vizinhança de usinas?
Auto-relacionamento;Denormalizar (usinas_vizinhas_ids)
#qconsp @hannelita
1
1
Pergunta 2:Pergunta 2:Como identificar facilmente qual usinaComo identificar facilmente qual usinadeve atender a uma região específica?deve atender a uma região específica?
id consumo(mensal, emMwh)
populacao(em milhões)
coordenada
1 40 13
2 11 2
cidade
id Capacidade (Mwh)
linha detransmissão(PK)
coordenada
1 95 22
2 11 1
usina
1. Dado umconjunto decoordenadas,somar apopulação dopolígonoresultante
#qconsp @hannelita
1
1
Pergunta 2:Pergunta 2:Como identificar facilmente qual usinaComo identificar facilmente qual usinadeve atender a uma região específica?deve atender a uma região específica?
id consumo(mensal, emMwh)
populacao(em milhões)
coordenada
1 40 13
2 11 2
cidade
id Capacidade (Mwh)
linha detransmissão(PK)
coordenada
1 95 22
2 11 1
usina
2. Aproximarcoordenadas das
usinas maispróximas baseado-se na capacidade
#qconsp @hannelita
1
1
2
Pergunta 2:Pergunta 2:Como identificar facilmente qual usinaComo identificar facilmente qual usinadeve atender a uma região específica?deve atender a uma região específica?
id consumo(mensal, emMwh)
populacao(em milhões)
coordenada
1 40 13
2 11 2
cidade
id Capacidade (Mwh)
linha detransmissão(PK)
coordenada
1 95 22
2 11 1
usina
3. Verificar ascaracterísticas na
tabela delinhas_de_transmissao
#qconsp @hannelita
Não é tãoNão é tãocomplicado assim...complicado assim...
#qconsp @hannelita
Mas não acabou! Mas não acabou!
#qconsp @hannelita
1
1
2
Pergunta 2:Pergunta 2:Como identificar facilmente qual usinaComo identificar facilmente qual usinadeve atender a uma região específica?deve atender a uma região específica?
id consumo(mensal, emMwh)
populacao(em milhões)
coordenada
1 40 13
2 11 2
cidade
id Capacidade (Mwh)
linha detransmissão(PK)
coordenada
1 95 22
2 11 1
usina
4. Verificar se háindústrias nas
proximidades dascidades
#qconsp @hannelita
1
1
2
Pergunta 2:Pergunta 2:Como identificar facilmente qual usinaComo identificar facilmente qual usinadeve atender a uma região específica?deve atender a uma região específica?
id consumo(mensal, emMwh)
populacao(em milhões)
coordenada
1 40 13
2 11 2
cidade
id Capacidade (Mwh)
linha detransmissão(PK)
coordenada
1 95 22
2 11 1
usina
5. Verificar IDH dacidade.
#qconsp @hannelita
1
1
2
Pergunta 2:Pergunta 2:Como identificar facilmente qual usinaComo identificar facilmente qual usinadeve atender a uma região específica?deve atender a uma região específica?
id consumo(mensal, emMwh)
populacao(em milhões)
coordenada
1 40 13
2 11 2
cidade
id Capacidade (Mwh)
linha detransmissão(PK)
coordenada
1 95 22
2 11 1
usina
6. Verificar interesse daconcessionária
#qconsp @hannelita
1
1
2
Pergunta 2:Pergunta 2:Como identificar facilmente qual usinaComo identificar facilmente qual usinadeve atender a uma região específica?deve atender a uma região específica?
id consumo(mensal, emMwh)
populacao(em milhões)
coordenada
1 40 13
2 11 2
cidade
id Capacidade (Mwh)
linha detransmissão(PK)
coordenada
1 95 22
2 11 1
usina
7. Verificar se regiãopode ser abastecida
por energia de outrasfontes
#qconsp @hannelita
1
1
2
Pergunta 2:Pergunta 2:Como identificar facilmente qual usinaComo identificar facilmente qual usinadeve atender a uma região específica?deve atender a uma região específica?
id consumo(mensal, emMwh)
populacao(em milhões)
coordenada
1 40 13
2 11 2
cidade
id Capacidade (Mwh)
linha detransmissão(PK)
coordenada
1 95 22
2 11 1
usina
7. Verificar se regiãopode ser abastecida
por energia de outrasfontes
#qconsp @hannelita
#qconsp @hannelita
Pergunta 3:Pergunta 3:Sabendo que as usinas operam comoSabendo que as usinas operam como
um "grande cabo-de-guerra deum "grande cabo-de-guerra demúltiplas pontas", como determinar amúltiplas pontas", como determinar aredistribuição de cargas se uma usinaredistribuição de cargas se uma usina
cair?cair?
#qconsp @hannelita
Pergunta 3:Pergunta 3:Sabendo que as usinas operam comoSabendo que as usinas operam como
um "grande cabo-de-guerra deum "grande cabo-de-guerra demúltiplas pontas", como determinar amúltiplas pontas", como determinar aredistribuição de cargas se uma usinaredistribuição de cargas se uma usina
cair?cair?
#qconsp @hannelita
Talvez tabelas não sejam as melhoresestruturas para representar informações
sobre distribuição de eletricidade
#qconsp @hannelita
Neo4j chega paraNeo4j chega pararesolver! resolver!
#qconsp @hannelita
Introdução relâmpago aoIntrodução relâmpago aoNeo4jNeo4j
Banco orientado a grafosACIDEstruturas de Node, Relationship, Index e LabelMantido pela Neo TechnologyOpen SourceComunidade ativa
#qconsp @hannelita
Caso 1 - ModelagemCaso 1 - Modelagemcom grafoscom grafos
#qconsp @hannelita
Passo 1 - Unisas sePasso 1 - Unisas setornam nóstornam nós
#qconsp @hannelita
Powered by Arrows - http://www.apcjones.com/arrows/#
CREATE (n:Usina:Hidreletrica { name : 'Itaipu', capacidade :'14000' })
#qconsp @hannelita
3
Passo 2 - Cidades sePasso 2 - Cidades setornam nóstornam nós
#qconsp @hannelita
3
Passo 3 - Linhas dePasso 3 - Linhas detransmissão setransmissão se
tornamtornamrelacionamentos! relacionamentos!
#qconsp @hannelita
Itaipu - Ivaiporã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últiplosMúltiplosrelacionamentosrelacionamentos
para diversas linhaspara 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
3
Passo 4 -Passo 4 -Concessionárias seConcessionárias se
tornam nós 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
3
Passo 5 - QueriesPasso 5 - Queriespoderosas poderosas MATCH (n:Usina {capacidade : 14000}),
(c:Cidade {name : 'Sao Paulo'})p = shortestPath((n)-[]-(c)) RETURN p
Queries para determinar otimização deabastecimento através de caminho
mínimo
#qconsp @hannelita
Caso 1 - Evolução doCaso 1 - Evolução domodelomodelo
#qconsp @hannelita
Muito importante:Muito importante:Index nasIndex nas
propriedades maispropriedades maisutilizadasutilizadas
Capacidade, populacao, coordenadas
#qconsp @hannelita
Muito importante[2]:Muito importante[2]:LabelsLabels
:Cidade, :Metropole, :Industrial,:Hidreletrica, :Eolica, :Privada
Em geral, elementos agrupáveis merecemuma Label.
#qconsp @hannelita
Evolução -Evolução -Transformar outrosTransformar outroselementos elétricoselementos elétricos
em nósem 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 é bemO Neo4j é bemflexível paraflexível paraevoluirmos oevoluirmos o
modelomodelo
#qconsp @hannelita
Caso 1 - Epic FailsCaso 1 - Epic Fails
#qconsp @hannelita
Muitos nós paraMuitos nós paracidades - não eracidades - não era
necessário ter um nónecessário ter um nópara cada cidadepara cada cidade
ProblemaProblema
#qconsp @hannelita
Muita informaçãoMuita informaçãocarregada nocarregada no
MATCH; queriesMATCH; querieslentaslentas
ImpactoImpacto
#qconsp @hannelita
Deixar as :CidadesDeixar as :Cidadesmais relevantes emais relevantes e
criar :Regiao; excluircriar :Regiao; excluircidadescidades
inexpressivasinexpressivas
SoluçãoSolução
#qconsp @hannelita
Não declarar todasNão declarar todasas operações numas operações num
arquivo paraarquivo parareplicação.replicação.
ProblemaProblema
#qconsp @hannelita
Problemas comProblemas combackup / replicação. backup / replicação.
ImpactoImpacto
#qconsp @hannelita
Não rodar CREATENão rodar CREATEna interface Web! na interface Web!
Adicionar queries em um repositório Git- https://github.com/hannelita/qconsp
SoluçãoSolução
#qconsp @hannelita
Caso 1 - Extra - "OCaso 1 - Extra - "Opulo do gato"pulo do gato"
#qconsp @hannelita
EncontrarEncontrarinformaçõesinformações
que passaram que passaram despercebidas fazdespercebidas faztoda a diferençatoda a diferença
#qconsp @hannelita
Mapear osMapear oscomponentes emcomponentes em
nós, por exemplo, foinós, por exemplo, foisignificativosignificativo
#qconsp @hannelita
MapearMapearComponentes...Componentes...
#qconsp @hannelita
Caso 2 -Caso 2 -ContextualizaçãoContextualização
#qconsp @hannelita
A-HA! Nós podemosA-HA! Nós podemosusar grafos para [...]usar grafos para [...]
(complete)(complete)
#qconsp @hannelita
Roteamento daRoteamento daplaca / traçar asplaca / traçar as
trilhas.trilhas.
#qconsp @hannelita
Sim! Mas podemos irSim! Mas podemos iralém.além.
Vamos analisar eVamos analisar earmazenar o layoutarmazenar o layout
das placas e dosdas placas e doscomponentes.componentes.
#qconsp @hannelita
Caso 2 - Tentativa deCaso 2 - Tentativa demodelagemmodelagem
relacionalrelacional
#qconsp @hannelita
11
1 1
Componente Trilha
Sensor Layer
CREATE TABLEcomponente;
CREATE TABLE trilha;
CREATE TABLE sensor; CREATE TABLE layer;
Pergunta 1Pergunta 1Um sensor capta elevaçãoUm sensor capta elevação
de temperatura. Comode temperatura. Comoinferir se é problema doinferir se é problema do
componente ou da trilha?componente ou da trilha?
#qconsp @hannelita
1
Pergunta 1Pergunta 1É preciso consultar outrosÉ preciso consultar outrossensores, geralmente ossensores, geralmente ossensores vizinhos. Comosensores vizinhos. Comoexpressar isso na tabela?expressar isso na tabela?
Auto-relacionamento;Denormalizar (sensores_vizinhos_ids)
Déjà vu!
#qconsp @hannelita
Pergunta 2Pergunta 2Qual a trilha que afeta maisQual a trilha que afeta mais
componentes?componentes?
#qconsp @hannelita
Pergunta 3Pergunta 3Será que consigo extrairSerá que consigo extrairalguma informação extraalguma informação extra
do circuitodo circuito
representando-o numrepresentando-o numgrafo?grafo?
#qconsp @hannelita
Caso 2 - ModelagemCaso 2 - Modelagemcom Grafoscom Grafos
#qconsp @hannelita
Passo 1:Passo 1:Componentes emComponentes em
nodesnodesCREATE (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: MapearPasso 2: Mapeartrilhas emtrilhas em
relacionamentosrelacionamentos
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: MapearPasso 3: MapearLayers em LabelsLayers 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 componentesde uma Layer e suas trilhas
#qconsp @hannelita
Caso 2 - Evolução doCaso 2 - Evolução domodelomodelo
#qconsp @hannelita
Passo 4: Mapear osPasso 4: Mapear osSensores em NodesSensores 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 > 60RETURN c.name, r.dilatacao
Decidir se é o componente que está comproblemas ou se é a trilha.
Passo 5: Rodar periodicamente a seguintequery
#qconsp @hannelita
Caso 2 - Epic FailsCaso 2 - Epic Fails
#qconsp @hannelita
Muitos updates dosMuitos updates dossensores. O Neo4jsensores. O Neo4j
tem algumastem algumaslimitações paralimitações para
write.write.
ProblemaProblema
#qconsp @hannelita
PerformancePerformancecomprometida e altocomprometida e alto
consumo de RAM.consumo de RAM.
ImpactoImpacto
#qconsp @hannelita
Remover os nós deRemover os nós dealguns sensores ou iralguns sensores ou irmigrar para a versãomigrar para a versão
Enterprise.Enterprise.
SoluçãoSolução
#qconsp @hannelita
1
Chegando ao Chegando ao fimfim!!
Modelos com flexibilidadeIdentificar relações ocultasFácil de iniciar os trabalhosProduto ativo e comunidade fortePode ser útil em muitos cenários, muito além deredes sociais ou sistemas de recomendação
#qconsp @hannelita
1
Ferramentas de ApoioFerramentas de Apoio
(Bancos Relacionais, MongoDB,Cassandra, JSON, CSV)Ferramentas de visualizaçãoREST API no Neo4j
Importação de dados
#qconsp @hannelita
ReferênciasReferências
SigelBIGONS
(Ferramenta para Sketch)
Neo4j Meetup em São PauloNeo4j Slack UsersNeo4j Training (Gratuito)Arrows
#qconsp @hannelita
2
2
AgradecimentosAgradecimentosNeo 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 :)Obrigada :)Perguntas? [email protected]@hannelita
#qconsp @hannelita
Top Related