
Графовая БД с низким потреблением памяти, поддержкой Bolt+TLS, шифрованием в состоянии покоя и векторами, предназначенная для сценариев использования локальных реплик графов.
Текущая версия: v0.25.2 — все релизы.
В одной строке: Slater обслуживает графы, которые не помещаются в память — сотни миллионов узлов и миллиарды рёбер в пределах нескольких сотен МБ оперативной памяти — через стандартный Bolt, поэтому любой драйвер neo4j работает без изменений, с дисковым векторным поиском рядом с графом, и он принимает живые, долговечные записи, не отказываясь от этого. Резидентная память определяется заданным вами бюджетом кэша, а не размером графа.
Быстрые ссылки
Графовая база данных хранит данные как сущности (узлы) и связи между ними (рёбра), где связи являются полноценными элементами. Это то, что нужно, когда ваши вопросы касаются связей, а не строк — «кто находится в пределах трёх переходов от этого счёта?», «какова полная цепочка зависимостей за этой сборкой?», «какие счета используют одно устройство, один адрес и одну карту?» — запросы, которые в SQL превращаются в болото рекурсивных JOIN, но в графе решаются естественно.
Самая распространённая жалоба на графовые базы данных — они не масштабируются за пределы того, что можно удержать в оперативной памяти. Многие из них (например, neo4j, Memgraph, FalkorDB и др.) держат весь граф в памяти: граф на 40 ГБ требует 40 ГБ памяти — на каждый экземпляр. Нужна реплика на каждый регион, на каждого арендатора или на каждый pod? Умножайте счёт. А сверх определённого размера они просто не загружаются: например, граф Wikidata с 90 миллионами узлов и 1,5 млрд рёбер требует ~64–128 ГиБ резидентной памяти, поэтому движки в памяти вообще не могут его открыть.
Slater — это ответ на эту проблему. Вместо загрузки графа в память он компилирует его один раз, офлайн: slater-build превращает ваши данные в контентно-адресуемый, неизменяемый образ на диске, и любое количество серверов Slater затем обслуживает этот образ через Bolt (поэтому ваши существующие драйверы neo4j работают без изменений), подгружая блоки по требованию и удерживая в памяти только фиксированный бюджет кэша. Именно так тот же граф на 90 млн узлов обслуживается из нескольких сотен МБ оперативной памяти — размер графа и затраты памяти развязаны. Граф на 4 ГБ и граф на 400 ГБ стоят одинаково по памяти для обслуживания, поэтому вы можете легко масштабировать дешёвые реплики чтения без состояния, а хранить граф будет хранилище, а не куча.
Это делает его естественным выбором для графов знаний за RAG-системами, графов рекомендаций и идентичности, графов зависимостей — всего большого и связного, что вы хотите запрашивать дёшево и часто. Дисковый векторный поиск находится прямо рядом с графом, поэтому тот же движок служит и уровнем извлечения для эмбеддингов.
Однако «скомпилирован один раз» не означает «заморожен». Этот образ — основа, а не конечное состояние: поверх него находится опциональный слой записи, поэтому живой граф можно исправлять и расширять без пересборки.
Ядро неизменяемо; граф — нет. Включите слой записи (delta.enabled) — и вы пишете через Bolt: исправьте одно свойство, добавьте узел, отзовите ребро — и изменение сохраняется надёжно, без пересборки образа. Что делает это дешёвым на стороне чтения — где живут записи.
Записи накапливаются в слое log-structured-merge (LSM) поверх неизменяемого ядра: журнал упреждающей записи и таблица в памяти, с вытеснением в неизменяемые дельта-сегменты, которые периодически сворачиваются обратно в свежее ядро при консолидации. Что это даёт:
count(*), маргинальные распределения по меткам и типам связей — остаются чтением метаданных даже при незакрытых записях: дельта ведёт собственные счётчики, поэтому count(*) по ядру на 91,6 млн узлов с полумиллионом ожидающих записей всё равно отвечает за десятки миллисекунд, не касаясь ни одного блока.SUCCESS только после fsync, покрывающего запись. Группируйте записи — и они дёшевы: write-UNWIND фиксирует один fsync на пакет, а не на строку.MERGE / MATCH … SET / DELETE (а также CREATE / REMOVE, detach delete, записи связей), ключуемые по свойству идентичности узла — или эквивалентные операторы модификации данных ISO GQL (INSERT / SET / REMOVE / DELETE), которые опускаются на тот же путь. Исправление, вставка, upsert и отзыв — по узлам и рёбрам, адресуемые так, как уже устроены ваши данные.При выключенном слое — по умолчанию — Slater обслуживает чистое неизменяемое ядро и отказывает в записи. Полную модель см. в разделе Слой записи.
О названии. Slater назван в честь агента ЦРУ из Archer (отличный сериал), который настаивает на одном имени — «Просто… Слейтер» — и одного из моих любимых персонажей в нём. См. страницу персонажа в вики.