Bancos de Dados de Grafos: Uma Visão Geral sobre Estrutura e Uso
Tipos de Bancos de Dados NoSQL e o Neo4j
Tipos de Bancos de Dados NoSQL
Os bancos de dados NoSQL são uma alternativa flexível aos bancos relacionais, e existem diferentes tipos, cada um adequado para tipos específicos de dados e usos. Aqui estão os principais:
- Document Store: Nesse tipo, os dados são armazenados em formato de documentos (como JSON, por exemplo). Cada documento pode conter diferentes dados, mas ainda é facilmente pesquisável.
- Key-Value Store: É o tipo mais simples de banco NoSQL. Funciona como um grande dicionário, onde cada valor é associado a uma chave única.
- Wide-Column Store: Esse tipo armazena os dados em colunas, mas com uma estrutura muito flexível. Cada linha pode ter um conjunto diferente de colunas.
- Graph Store: Esse tipo de banco de dados armazena dados em forma de grafos, onde nós representam os dados e as arestas (ou vértices) representam os relacionamentos entre esses dados. É ideal para situações em que os relacionamentos são tão importantes quanto os dados em si, como redes sociais, sistemas de recomendação e detecção de fraudes. Um exemplo popular é o Neo4j.
Bancos de Dados do Tipo Grafos
Um grafo é composto por nós (ou vértices), que guardam os dados, e arestas (ou relacionamentos), que conectam os nós e mostram as interações entre eles.
- Nós: São os objetos que armazenam as informações. Por exemplo, em uma rede social, cada pessoa pode ser representada como um nó.
- Arestas: Representam as conexões entre os nós. Por exemplo, se uma pessoa é amiga de outra em uma rede social, isso seria uma aresta conectando esses dois nós.
Os bancos de dados orientados a grafos são amplamente utilizados em detecção de fraudes, redes sociais, sistemas de recomendação, games, entre outros. Um dos bancos mais populares desse tipo é o Neo4j.
Introdução ao Neo4j e Criando Sua Primeira Estrutura
Agora, vamos explorar o Neo4j, um banco de dados orientado a grafos. Para começar a usar o Neo4j, você pode acessar a plataforma em sandbox.neo4j.com, criar uma conta e selecionar o Blank Sandbox. Quando ele estiver pronto, clique em Open para começar a trabalhar.
Criando Nós no Neo4j
Um nó pode representar uma pessoa, um objeto, ou qualquer entidade com propriedades. No Neo4j, usamos o comando CREATE para criar nós. Vamos criar um exemplo simples de um nó que representa um personagem:
CREATE (:Client {name: "Bob Esponja", age: 28, hobbies: ["Caçar água-viva", "Comer Hambúrguer"]});
Aqui, estamos criando um nó chamado Client (uma label, ou etiqueta, que descreve o tipo de entidade) com as propriedades name, age, e hobbies.
- Client é uma label.
- name, age e hobbies são as propriedades do nó.
Após criar o nó, podemos consultar os dados com o comando MATCH:
MATCH (bob_esponja) RETURN bob_esponja;
Esse comando retorna o nó bob_esponja que acabamos de criar.
Criando Relacionamentos Entre Nós
Vamos criar mais dois nós e um relacionamento entre eles. Aqui, o Lula Molusco vai bloquear o Patrick em nossa rede social:
Esse comando retorna o nó bob_esponja que acabamos de criar.
Criando Relacionamentos Entre Nós
Vamos criar mais dois nós e um relacionamento entre eles. Aqui, o Lula Molusco vai bloquear o Patrick em nossa rede social:
CREATE (:Client {name: "Lula Molusco", age: 30, hobbies: ["Tocar Clarinete"]}) -[:Bloqueado]-> (:Client {name: "Patrick", hobbies: ["Caçar Água-Viva"]});
Nesse exemplo:
- Criamos dois nós: Lula Molusco e Patrick.
- Adicionamos um relacionamento [ ] entre eles, que indica que Lula Molusco bloqueou Patrick.
Para verificar todos os nós e relacionamentos criados, usamos o seguinte comando:
MATCH (todos) RETURN todos;
Agora podemos ver os nós e as conexões na interface visual do Neo4j.
Criando Relacionamentos Entre Nós Já Existentes
Se os nós já existem no banco de dados, podemos conectá-los criando relacionamentos entre eles. Vamos conectar o Lula Molusco e o Patrick que já foram criados:
MATCH (lula:Client {name: "Lula Molusco"}), (patrick:Client {name: "Patrick"}) CREATE (lula)-[:Bloqueado]->(patrick);
Agora, ao executar o comando de consulta novamente, podemos ver que o relacionamento foi estabelecido.
Excluindo Relacionamentos e Nós
Podemos também remover um relacionamento ou até mesmo excluir um nó. Vamos excluir o relacionamento entre Lula Molusco e Patrick:
MATCH (lula:Client {name: "Lula Molusco"})-[relaciona:Bloqueado]->() DELETE relaciona;
Isso remove o relacionamento Bloqueado. Se quisermos deletar o próprio Lula Molusco, usamos:
MATCH (lula:Client {name: "Lula Molusco"}) DELETE lula;
Agora, ao consultar novamente, veremos que o nó Lula Molusco foi excluído.
MATCH (todos) RETURN todos;
Atualizando Dados e Labels
Podemos atualizar as propriedades de um nó ou modificar suas labels. Por exemplo, se quisermos adicionar o hobby ao Patrick, fazemos o seguinte:
MATCH (patrick:Client {name: "Patrick"}) SET patrick.hobbies = ["Comer hamburguer"];
Também podemos modificar a label de Client para Client_Premium:
MATCH (patrick:Client {name: "Patrick"}) SET patrick:Client_Premium;
Agora, Patrick faz parte de uma nova categoria chamada Client_Premium.