# RedisGraph

RedisGraph é um banco de dados em grafo desenvolvido pela Redis Labs, e disponibilizado como um módulo para o banco de dados Redis.
O RedisGraph foi implementado com foco em performance nas operações do banco de dados. Atualmente o projeto é disponibilizado através de uma licença própria e pública no formato de código aberto.
RedisGraph representa os dados e relacionamentos utilizando matrizes esparsas de adjacência. O projeto optou por representar os dados desta forma, para que seja possível explorar funcionalidades do GraphBLAS, o qual é uma biblioteca que possui alto desempenho em operações com matrizes esparsas.

## Histórico e Versões

O RedisGraph foi desenvolvido pela empresa RedisLabs utilizando a linguagem de programação C. O projeto é disponibilizado pela empresa desenvolvedora na forma de código aberto e utilizada a licença Redis Source Available License Agreement. O código fonte é disponibilizado através de um repositório público no GitHub.
A primeira versão do banco de dados foi lançada em Dezembro de 2018. Os resultados experimentais apresentados pela RedisLabs mostravam que o novo produto superou seus concorrentes em termos de desempenho nas tarefas de banco de dados.
Devido aos resultados de performance e a popularidade do banco de dados Redis, plataforma a qual o RedisGraph foi baseado, a comunidade aderiu ao novo módulo. Com isso, o RedisGraph passou a lançar versões, contendo novas funcionalidades e correções, de forma frequente. A última versão estável é a 2.0.10 e foi lançada em Março de 2020.

## Estrutura de Dados

A estrutura de dados utilizada para a modelagem de um banco de dados do tipo RedisGraph é do tipo grafo direcionado. Neste caso, os nós são as entidades envolvidas na modelagem e os relacionamentos são armazenados em matrizes esparsas de adjacência, conforme dito anteriormente. Via de regra, as linhas de uma matriz de adjacência se referem aos nós de origem, enquanto que as colunas aos nós de destino.
Exemplificando de forma simplificada o funcionamento de nós e arestas, seja $S$ um nó de origem que apresenta um relacionamento com um nó $T$ de destino. O esquema apresentado a pouco é gravado em uma matriz de adjacência $M$. Logo, na célula de convergência entre a linha correspondente ao nó de origem $S$ e a coluna correspondente ao nó de destino $T$, teremos um valor não nulo, indicando que existe um relacionamento entre os dois nós. Matematicamente podemos expressar o esquema como:
    $M[S,T]=1$
Todo grafo armazenado no RedisGraph possui pelo menos uma matriz de adjacência. Adicionalmente a esta, todo relacionamento com qualquer outro tipo de grafo requer uma matriz de adjacência dedicada. Por exemplo, imaginemos que temos um banco um banco de dados RedisGraph para armazenar dois tipos de relacionamento: Consultas e médicos. Neste tipo de relacionamento, teremos as seguintes matrizes esparsas de adjacência:
* Matriz para armazenar o relacionamento dos nós internos do grafo.
* Matriz de consulta para armazenar as ocorrências de visitas aos médicos.
* Matriz de médicos para armazenar os médicos de determinado nó.
A arquitetura definida na construção do RedisGraph foca na simplicidade e performance para executar operações de banco de dados. Para adicionar ou remover nós em determinado grafo, o RedisGraph adiciona ou remove novas linhas e colunas em sua matriz de adjacência. Ao criar novos relacionamentos, um valor representativo é atribuído em sua matriz de adjacência. Desta forma, para remover um relacionamento, é atribuído um valor não representativo em sua matriz de adjacência.

## Linguagem de Consulta

O RedisGraph adotou a linguagem Cypher para a escrita de consultas. A linguagem Cypher, atualmente, é o padrão de linguagem de consulta mais adotado entre os bancos de dados em grafo. Entretanto, o RedisGraph optou por adotar apenas a sintaxe desta linguagem, deixando de utilizar seu interpretador nativo. Com isso, o RedisGraph implementa seu próprio interpretador Cypher, utilizando novamente a linguagem C. Atualmente, apenas um subconjunto das instruções Cypher estão implementadas no interpretador do RedisGraph. As demais instruções vem sendo desenvolvidas de acordo com a necessidade da comunidade e disponibilizadas como uma nova versão do banco de dados.
Para demonstrar a sintaxe e funcionamento da linguagem de consulta adotada pelo RedisGraph, consideremos a seguinte consulta abaixo, a qual seleciona todos os atores com mais de 30 anos de idade que atuaram com Aldis Hodge:
A palavra reservada MATCH indica que o comando a ser executado no RedisGraph sera de leitura. Em seguida, temos o trecho (aldis::ator {name:"Aldis Hodge"}), que selecionará nós que possuem o atributo nome igual a Aldis Hodge, no grafo de atores. Após selecionado o nó alvo no grafo de atores, o trecho [act]->(m:filme) da consulta solicita que o banco de dados carregue os nós relacionados a este ator, no grafo de filmes. Recuperados os nós do grafo movie que estão relacionados com o ator Aldis Hodge, a consulta solicita que o RedisGraph carregue todos os atores que possuem relacionamento com os nós de filmes, por meio do trecho (m:filme)<-[ator]-(a:ator). Carregado todo este conjunto de dados, o RedisGraph aplica o filtro declarado por meio da palavra reservada WHERE, que indica que serão selecionados apenas os registros que possuem o atributo age, do grafo de atores, maior que o valor 30. Aplicado o filtro no conjunto de dados selecionado, a palavra reservada RETURN indicará quais atributos serão retornados para o cliente da consulta. No caso da consulta de exemplo, serão retornados os campos título e nome, os quais pertencem aos grafos de filmes e atores, respectivamente.