Neo4j 1.3

Grupo:

  • Paulo Henrique de Souza Soares (11884713)

  • Álvaro José Lopes (10873365)

  • Pedro Henrique Conrado (11819091)

  • Gabriel Ribeiro Fonseca de Freitas(12542651)

  • Gabriela Rodrigues do Prado (11892917)

  • Pedro Calciolari Jardim (11233668)

  • João Pedro Matos de Deus (12677492)

  • Vitor Laperriere de Faria(12689085)

  • Marcus Vinícius Teixeira Huziwara (11834432)

  • Thales Darini Souza (10747562)


Neo4J é um sistema de gerenciamento de banco de dados que segue o paradigma de grafos. De acordo com seus criadores, esse tipo de paradigma se destaca em performance (pois consegue lidar com big data com facilidade), flexibilidade (não exige grande preocupação com modelagem prévia) e compatibilidade com a metodologia Ágil e Test Driven Development.

Principais funcionalidades [editar]

  • Esquema Flexível: Neo4j segue o modelo graph model, no qual nós representam entidades do domínio de aplicação e as arestas representam relações. Cada nó e cada a relação armazena dados no formato key-value - denominados de propriedades - o qual fornece uma maior flexibilidade para o esquema do banco.

  • ACID: Neo4j suporta todas as propriedades ACID (Atomicity, Consistency, Isolation and Durability)

  • Escalabilidade: Neo4j fornece uma arquitetura de buffering para escrita e leitura que permite escalar o volume dos dados sem afetar a sua integridade e a velocidade de processamento das consultas do banco de dados.

  • Portabilidade: Possui suporte para exportação de dados no formato JSON e XLS, além de prover uma REST API para ser acessada por qualquer linguagem com suporte.

  • Cypher: É uma linguagem declarativa para consulta em banco de dados no formato de Grafos com Propriedades e é a principal forma de interface com Neo4j. É considerada intuitiva e fácil de aprender por fornecer expressões compactas e de fácil visualização (sintaxe do tipo ASCII-art). Além disso, é confiável, segura e eficiente, já que é capaz de reduzir a quantidade de chamadas sucessivas e economizar recursos, pois os novos dados serão requisitados somente quando a aplicação cliente for capaz de consumir mais dados (client-side back-pressure).

  • Neo4j Browser:  É uma aplicação web interativa que permite interagir com o grafo que representa a base de dados, visualizar as informações contidas nele e realizar consultas usando Cypher. Disponível em todas as edições e versões do Neo4j.

  • Neo4j Desktop: Ambiente de Gerenciamento que permite gerenciar vários projetos e servidores de bases de dados localmente e também permite conectar a servidores Neo4j remotos. É possível instalar extensões para a linguagem Cypher - contendo procedures  e funções adicionais - e bibliotecas, como Neo4j Graph Data Science, contendo um conjunto de ferramentas de análise em grafos (graph algorithms, graph embeddings e outras).


Implementação (CA, CP ou AP) [editar]

Neo4j é um banco de dados gráfico nativo que é utilizado para armazenar e processar grafos para gerenciar dados interconectados. Os bancos de dados em grafos ajudam a encontrar relacionamentos entre os dados e extrair seu verdadeiro valor. Cada parte dos dados tem uma conexão explícita, resultando em velocidade e escala incomparáveis. O processamento gráfico nativo do Neo4j também é conhecido como “adjacência sem índice”.

Os bancos de dados em grafos mantém os relacionamentos entre os dados como prioridade. A consulta de relacionamentos é rápida porque eles são armazenados perpetuamente no banco de dados. Os relacionamentos podem ser visualizados intuitivamente usando bancos de dados de gráficos, tornando-os úteis para dados altamente interconectados.

Uma perspectiva contrastante, mas igualmente convincente, é considerar o grafo como o principal domínio de aplicação. Essencialmente, os grafos são estruturas de dados simples para as quais uma vasta gama de algoritmos bem compreendidos e amplamente aplicáveis ​​está prontamente disponível. Esta concepção está alinhada com uma mentalidade de programação funcional. É igualmente muito mais próximo da natureza dos grafos baseada em dados; ele encoraja a simplicidade e a reutilização de algoritmos gráficos de propósito geral existentes.

 O Neo4j em uma arquitetura de nó único é fortemente consistente. No Neo4j Enterprise Edition, o cluster garante consistência causal. A consistência causal garante que a leitura de dados previamente escritos do mesmo cliente seja consistente. No entanto, temos consistência eventual ao ler dados que foram alterados por outros clientes, pois há uma janela de tempo de milissegundos em que os dados mais recentes ainda não foram propagados. Dessa forma, o Neo4j está localizado no quadrante CA fornecendo consistência e disponibilidade.



Vantagens [editar]

  • Representação: Neo4j permite a representação de dados conectados (grafos) e semi-estruturados de forma fácil e intuitiva. O modelo também fornece uma forma bem natural de expressar problemas relacionados a grafos como problemas de pathfinding.
  • Facilidade com os comandos: Cypher é a linguagem de consulta utilizada no Neo4j. É uma linguagem declarativa projetada para ser eficiente e simples de ser entendida. Não necessita de Joins complexos para buscar dados relacionados uma vez que é simples obter detalhes dos nós e dos relacionamentos adjacentes sem o uso de Joins ou Indexes.
  • Disponibilidade: O Neo4j oferece alta disponibilidade, com garantias transacionais, para aplicações em tempo real de grandes empresas.
  • Análise de dados em tempo real: O Neo4j fornece resultados baseados em dados em tempo real.
  • Performance: Bases de dados de grafos como o Neo4j são muito mais eficientes em consultas de dados altamente conectados que possuem muitas relações expressas por joins complexos. Em bases de dados relacionais, consultas com muitos joins têm performance deteriorada à medida que o conjunto de dados cresce. Mas ao utilizar bases de dados de grafos, a performance se mantém relativamente constante mesmo com grandes conjuntos de dados. Isto ocorre porque no modelo de dados em grafo, a consulta é feita apenas na parte do grafo que será acessada pela busca e não no grafo inteiro.
  • Flexibilidade: O Neo4j é whiteboard-friendly, ou seja, é possível descrever o domínio da aplicação em diagramas numa whiteboard ao invés de utilizar modelos complexos como UML. O modelo em grafo pode ser diretamente mapeado desses diagramas e implementado na base de dados. Também é possível expandir um modelo inicial incluindo novos nós e novas relações com um baixo custo de migração e manutenção.

Desvantagens [editar]

  • Gravação: o Neo4j suporta clusters mestre-escravo de alta disponibilidade que podem escalar linearmente as leituras onde os escravos podem compartilhar a carga de leitura. Quanto à carga de gravação, apenas a instância mestre no cluster pode tratá-la. Outras instâncias escravas ainda podem receber as solicitações de gravação dos clientes, mas essas solicitações serão encaminhadas para o nó mestre.Portanto, gravar na instância mestre é mais rápido do que gravar em uma instância escrava.Isso significa que o Neo4j não dimensiona muito bem as gravações e, no caso de cargas de gravação excepcionalmente altas, apenas o dimensionamento vertical da instância mestre é possível.
  • Sharding: embora seja possível implementar alguma lógica de sharding no aplicativo cliente para distribuir os dados entre vários servidores, a lógica de sharding ainda não é suportada nativamente pelo Neo4j. Isso ocorre porque fragmentar o gráfico é um problema matemático quase impossível ou NP difícil. Em geral, a fragmentação dos dados no lado do cliente depende da estrutura do gráfico. Se o gráfico tiver limites claros, ele poderá ser fragmentado facilmente, caso contrário, pode ser muito difícil. Além disso, é muito difícil fragmentar um grafo densamente conectado.

  • Suporte: Possui carência em ferramentas e framework de suporte.

  • Compartilhamento: não podemos compartilhar Neo4j . Isso significa que temos todo o conjunto de dados em UM servidor e apenas a escalabilidade vertical é possível.

  • Segurança: nenhuma segurança é fornecida no nível de dados e não há criptografia de dados.

Aplicações [editar]

Como visto anteriormente, o Neo4j apresenta diversos atrativos para empresas, a seguir exemplificaremos alguns dos setores que conseguem aproveitar tais vantagens.

Possivelmente o setor mais forte desse banco de dados é o financeiro, sendo utilizado em todos os 20 maiores bancos da América do Norte, assim como em grandes seguradoras como a Allianz, a facilidade de se trabalhar com os grafos permite comparações complexas entre transações e padrões que são construídos ao longo do tempo, com isso tem-se a habilidade de reconhecer e evitar fraudes. Além disso pode-se criar perfis complexos para os clientes, com o objetivo de identificar comportamentos similares entre pessoas de mesmo grupo, seja social, econômico ou demográfico,  e assim personalizar a experiência de cada um deles a partir daquilo que é observado como o mais eficaz para cada setor de clientes.

Outro exemplo de negócio que consegue aproveitar esse tipo de heurística de buscar padrões em quantidades massivas de dados, são os sites de comércio, como o Ebay, que o aplica em seu sistema de recomendação, ferramenta essencial para uma empresa desse tamanho, uma vez que a quantidade de produtos comercializados por eles pode desencorajar alguns clientes a utilizar o site, então é muito importante filtrar os produtos de maneira específica para cada pessoa.

Grandes empresas de telecomunicação como a Verizon, AT&T e Comcast, utilizam o Neo4j para administrar suas redes, que devido ao seus tamanhos gigantes podem apresentar desafios por exemplo na hora de conectar dois clientes da maneira mais eficaz, utilizando o menor caminho entre as diversas conexões, conceito que nos é muito familiar da disciplina de grafos.