
Graphdb de baixo consumo de memória com suporte a Bolt+tls, criptografia em repouso e vetores, projetado para casos de uso de grafos de réplica local.
Versão atual: v0.25.2 — todas as versões.
Em uma linha: o Slater serve grafos que não cabem em memória — centenas de milhões de nós e bilhões de arestas em poucas centenas de MB de RAM — via Bolt padrão, então qualquer driver neo4j funciona, com busca vetorial nativa em disco ao lado do grafo, e aceita gravações ao vivo e duráveis sem abrir mão disso. A memória residente é definida por um orçamento de cache que você escolhe, não pelo tamanho do grafo.
Atalhos
Um banco de dados de grafos armazena dados como coisas (nós) e as relações entre elas (arestas), com as relações como cidadãos de primeira classe. É isso que você quer quando suas perguntas são sobre conexões em vez de linhas — "quem está a três saltos desta conta?", "qual é a cadeia completa de dependências por trás deste build?", "quais contas compartilham um dispositivo, um endereço e um cartão?" — as consultas que viram um pântano de joins recursivos em SQL, mas que fluem naturalmente em um grafo.
A reclamação mais comum sobre bancos de dados de grafos é que eles não escalam além do que cabe na RAM. Muitos deles (por exemplo, neo4j, Memgraph, FalkorDB, etc.) mantêm o grafo inteiro residente: um grafo de 40 GB quer 40 GB de memória — por instância. Quer uma réplica por região, por locatário ou por pod? Multiplique a conta. E além de um certo tamanho eles simplesmente não carregam: por exemplo, o grafo Wikidata de 90 milhões de nós / 1,5 bilhão de arestas precisa de ~64–128 GiB residentes, então os mecanismos em memória não conseguem abri-lo de forma alguma.
O Slater é a refutação. Em vez de carregar o grafo na memória, ele o compila uma vez, offline: slater-build transforma seus dados em uma imagem imutável em disco, endereçada por conteúdo, e qualquer número de servidores Slater serve essa imagem via Bolt (então seus drivers neo4j existentes funcionam), paginando blocos sob demanda e mantendo apenas um orçamento fixo de cache residente. É assim que o mesmo grafo de 90M nós é servido a partir de algumas centenas de MB de RAM — o tamanho do grafo e a conta de memória são desacoplados. Um grafo de 4 GB e um grafo de 400 GB custam a mesma RAM para servir, então você distribui réplicas de leitura baratas e sem estado, deixando o armazenamento, não o heap, segurar o grafo.
Isso o torna um ajuste natural para grafos de conhecimento por trás de RAG, grafos de recomendação e identidade, grafos de dependência — qualquer coisa grande e conectada que você queira consultar de forma barata e frequente. A busca vetorial nativa em disco fica ao lado do grafo, então o mesmo mecanismo também é a camada de recuperação para embeddings.
Compilado uma vez não significa congelado, no entanto. Essa imagem é uma base, não um estado final: uma camada de gravação opcional fica acima dela, então um grafo ao vivo pode ser corrigido e estendido sem reconstruir nada.
O núcleo é imutável; o grafo não é. Ative a camada gravável (delta.enabled) e você grava via Bolt — corrija uma propriedade, adicione um nó, retire uma aresta — e a mudança é registrada de forma durável, sem reconstrução da imagem. O que mantém isso barato no lado da leitura é onde as gravações vivem.
As gravações se acumulam em uma camada log-structured-merge (LSM) sobre o núcleo imutável: um write-ahead log e uma tabela em memória, que transbordam para segmentos delta imutáveis, dobrados de volta em um núcleo novo por uma consolidação periódica. O que isso compra para você:
count(*), as marginais de rótulo e tipo de relacionamento — permanecem leituras de metadados mesmo com gravações pendentes: o delta mantém seus próprios contadores, então um count(*) sobre um núcleo de 91,6M nós com meio milhão de gravações pendentes ainda responde em dezenas de milissegundos sem tocar em um único bloco.SUCCESS somente após o fsync que cobre a gravação. Agrupe suas gravações e elas são baratas — um UNWIND de gravação confirma um fsync por lote, em vez de por linha.MERGE / MATCH … SET / DELETE (e CREATE / REMOVE, delete com detach, gravações de relacionamento) com chave na propriedade de identidade de um nó — ou as declarações equivalentes de modificação de dados ISO GQL (INSERT / SET / REMOVE / DELETE), que descem para o mesmo caminho. Corrija, insira, faça upsert e retire, sobre nós e arestas, endereçados da maneira que seus dados já estão.Com a camada desativada — o padrão — o Slater serve o núcleo imutável puro e recusa gravações. Veja A camada gravável para o modelo completo.
Sobre o nome. Slater é nomeado em homenagem ao agente da CIA em Archer (um ótimo programa) que insiste em ser chamado por um único nome — "Apenas… Slater" — e um dos meus personagens favoritos nele. Veja a página da wiki do personagem.