
2026/07/22 3:39
スレーター:読み込み中心のグラフ向け低メモリグラフデータベース
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
要約を改善し、Key Points List の全体範囲、特にストレージオプション、具体的なセキュリティプロトコル、メモリ管理戦略、およびライセンスについてより正確に反映させる必要があります。以下は、これらの欠落している要素を統合しながらも流れを保った改訂版です:
改訂後の要約:
Slater v0.24.1 は、Wikidata の数十億のエッジといった大規模データセットを、限られた RAM で処理するためにディスクイメージ(ローカル、S3、または GCS)から直接データをページングする読み書き可能グラフデータベースです。全体グラフをメモリに保持せずとも動作します。Neo4j の無縫なドロップイン置換機として機能し、Bolt を使用することで標準的なドライバ、Cypher クエリ、およびクライアントを変更せずに動作させます。その核心的な革新は、不変グラフアーキテクチャの上に書き込み可能な LSM レイヤーを被せることです。書き込みは fsync によって耐久性を持ち、読み取り性能に負荷をかけず、完全な CRUD オペレーションをサポートします。Slater は標準的な Cypher と同じ接続上で ISO GQL を話しながら、Vamana や Product Quantisation などの技術を使用して驻留メモリを制限しつつ、高度なディスクネイティブベクトル検索(余弦、L2、ドット KNN)を可能にします。デプロイメントは、原子ファイルスワップと
CALL slater.consolidate() による定期的なデータセグメントの統合を通じて、ゼロダウンタイム更新を保証します。セキュリティは強力であり、TLS、静止状態暗号化(XChaCha20-Poly1305)、Argon2id ハッシュ済み ACL、およびマルチテナント分離を備えています。メモリ使用量はキャッシュ予算を通じて設定可能であり(jemalloc を使用してバースト後にメモリを返す)、これにより大規模グラフも限られたハードウェア(例:数十 GB の RAM が必要なインメモリエンジンに対して数百 MB の RAM)で動作します。Apache 2.0 ライセンスの下で公開され、Docker サポート付きの Slater は、スケーリングが高価なメモリに依存するのではなく、スマートなディスクネイティブ戦略によって実現されることを証明し、グラフコンピューティングの経済を変革します。本文
Slater v0.24.1 リリース全記録
Slater は、メモリに収まらない大規模グラフを提供する革新的なデータベースです。数百億のノードと数十億のエッジを、数 100 MB の RAM で低容量 Bolt プロトコル上で動作させます。既存の Neo4j ドライバーはそのまま使用でき、ディスクネイティブなベクター検索や永続的な書き込み機能も搭載しています。
レジデントメモリ量はグラフサイズではなく、ユーザーが設定するキャッシュ予算によって決定されます。
目次
- Slater が存在する理由
- リードとライト
- あなたが得られるもの
- 機能一覧
- 仕組み
- ライト可能レイヤー (Writable Layer)
- ストレージバックエンド
- マウント構造
- ACL (アクセス制御リスト)
- ヘルスチェックとクエリコマンド
- 実装例 (Docker など)
- 開発環境構築
- パフォーマンス
- ライセンス
- 📖 完全マニュアルへのリンク
Slater が存在する理由
グラフデータベースの課題
多くのグラフデータベース(Neo4j, Memgraph, FalkorDB など)は、グラフ全体をメモリ上に保持する必要があります。
- メモリ依存性: 40 GB のグラフには 40 GB のメモリが必要。レプリケーションによりコストが倍増する。
- スケーリングの壁: Wikidata などの大規模データ(9,000 万ノード/15 億エッジ)は、約 64–128 GiB のメモリを必要とし、メモリ上では扱いきれない。
Slater のアプローチ
Slater はディスクネイティブなアーキテクチャを採用し、グラフサイズとメモリコストを解離させます。
- オンディスクイメージ:
でコンパイルされた不変な画像(コンテンツアドレス可能)を提供します。slater-build - ページ化メモリ使用: グラフ全体をメモリに載せるのではなく、必要な部分のみページングして読み込みます。
- 低コストレプリケーション: 4 GB でも 400 GB でも、提供するための RAM コストは同じです(キャッシュ予算ベース)。
適用シーン
RAG(知識グラフ)、推薦システム、依存関係グラフなど、大規模かつ接続されたデータを頻繁にクエリしたい用途に適しています。ディスクネイティブなベクター検索も同様に実装されています。
リードとライト
Slater は読み取り・書き込み両方に対応したグラフデータベースです。変更は Bolt プロトコルを通じて直接書き込まれ、永続化されます。
書き込み構造
- ログストラクチャード・マージ (LSM) レイヤー: ライトは不変のコアの上部の LSM レイヤー(事前書き込みログ)に蓄積され、定期的なコンソリデーションにより新しいコアに戻されます。
- リード経路への影響なし: 書き込まれていないグラフ上のリードコストは以前と同じです。空のデルタセグメントは単一の予測可能なブランチであり、リードパスのバイト単位で同一です。
コスト効率性
- 書き込みコスト: グラフサイズではなくデルタのサイズに比例します。
- メタデータ読み取り: 全グラフ回答(
, レベルと関係タイプのマージナル)は、書き込みが完了していない場合でもメタデータ読み取りとして機能します。91.6M ノードのコアで 50 万回の未解決書き込みがあっても、数十ミリ秒で回答します。count(*) - 永続性: 単一のライターのキューを排水し
を完了するまで返さず、バッチ化されたfsync
ではバッチごとに 1 つのwrite-UNWIND
でコミットできます。fsync
⚠️ 注意: ライト可能レイヤーはオプションです (
)。これをオフにする場合、Slater は純粋な不変のコアのみを提供し、ライト操作を拒否します。delta.enabled
あなたが得られるもの
- 設定可能な RAM 使用量: グラフサイズではなくキャッシュ予算でレジデントメモリを設定可能。好きなだけリードレプリカを展開できます。
- Neo4j ドロップイン対応: Bolt プロトコルを使用するため、標準の Neo4j ドライバー(JS, Python, Go…)をそのまま使用可能です。Cypher の知識があれば学習不要です。
- ライブ永続的なライト: オプトイン可能な LSM レイヤーにより、ビジネスロジックでの変更(MERGE / SET / DELETE)は即座に永続化され、リードコストを悪化させません。
- ファイルスワップによるデプロイメント: 新しい世代(generation)をオフラインビルドし、原子的に現在のポインタを切り替えるため、ゼロダウンタイムでのバージョンアップが可能。
- ベクター検索の組み込み: ディスクネイティブな近似最近傍検索(ANN)がグラフの隣にあり、RAG パイプラインやインプレース埋め込み書き込みに適しています。
- セキュリティ設計: リード/ライト権限の独立性、静止状態暗号化、TLS Bolt、argon2id ハッシュ ACL を標準でサポート。
機能一覧
| 機能 | メリット |
|---|---|
| 有界で予測可能なメモリ | アロケーターによりアイドル時の床値に戻るため、ピーク値にピン留めされません。 |
| マルチテナント対応 | サーバー 1 台で多数のグラフをホストし、ユーザーごとのリード権限で隔離可能です。 |
| 静止状態および転送中の暗号化 | ブロックあたりの XChaCha20-Poly1305 セーリング+オプションの TLS (bolt+s://)。GDPR 準拠。 |
| 軽量なインストール | ディストロレス glibc ベースで約 22 MB(Lite タグなら 12 MB)。純粋な Rust で構成。 |
| 周期性発行向けに構築 | データウェアハウスやスケジュールされたリフレッシュワークロードに適した不変コアモデル。 |
| 負荷下での堅牢さ | コアは不変のためロックを必要とせず、GC パーズやデータレースがありません。不良クエリでダウンしません。 |
| Neo4j ツールとの互換性 | Bolt 5.4/4.4/4.1 を話せるため、 や Neo4j ブラウザなどを変更なしで使用可能です。 |
| 豊富な Cypher クエリ表面 | MATCH/WHERE/WITH/UNION, CALL サブクエリ、70 以上の関数、時間的およびジオスペース値対応。 |
| ISO GQL 対応 | サブセットの ISO GQL (ISO/IEC 39075) もサポート。Cypher と GQL の併用が可能。 |
| ベクトル+グラフ・1 つエンジン | 埋め込み/RAG 用の ANN ベクター検索と、PageRank, BFS などグラフアルゴリズムを統合。 |
| ネットワークストレージでの安全 | 各ファイルは BLAKE3 コンテンツハッシュ化され、破損されたイメージは拒否されます。NFS/リモートボリューム対応。 |
| プラグ可能なストレージバックエンド | ローカル FS、S3、GCS をサポート。一度発行してステートレスレプリカに展開可能。 |
仕組み
Slater は「スライダー(滑る)」という名前ではなく、「スレイター(Archer の CIA エージェント)」の名前です。
構成要素
ワークスペースは以下の 2 つのバイナリで構成されます:
| バイナリ | ロール |
|---|---|
| オンライン Bolt サーバー。リードと、オプションのライト機能を提供。 |
| オフラインコンパイラ。プライミティブ Cypher ドンプを不変世代に変換。 |
ライト可能レイヤー (Writable Layer)
delta.enabled の場合、データは以下の構造で管理されます:
- WAL (事前書き込みログ): 各変更はここに追加され、
で永続化されます(承認された⇒永続的)。fsync - Memtable → L0 Delta: メモリに蓄積され、埋め尽くされると immutable L0 デルタセグメントにフラッシュ。
- コンソリデーション:
をシリアライズし、原子的に新しいコアに折り込みます ({core + delta}
で手動または自動)。CALL slater.consolidate()
リード経路:
- 実行機は
を通じて読み取ります(単なるコア、またはマージされたビュー)。ReadView - 空のデルタ: リードパスはバイト単位で同一のため、パフォーマンスに悪影響を与えません。
- メタデータ: 全グラフカウンターはデルタ独自のライブカウンターから提供されるため、未解決ライトの影響を受けない。
ストレージバックエンド
各ファイルは BLAKE3 コンテンツハッシュ化され、破損検出が可能。
- fs (デフォルト): ローカル SSD/NFS/EBS。高速な位置ベースの読み取り (
)。pread - s3: AWS S3 や MinIO 等のオブジェクトストア。
を使用。HTTP Range GET - gcs: Google Cloud Storage。JSON API を経由。
ブロックキャッシュ: オプションのローカル SSD キャッシュティアを使用することで、S3/GCS のネットワークラウンドトリップを低減し、ファイルシステムに近いパフォーマンスを発揮できます。
マウント構造
| パス | 目的 |
|---|---|
| /data | グラフ世代 () を格納。 で生成。 |
| /sandbox | 環境設定オーバーレイ、シークレット(ACL, TLS, クライアント証明書)。 |
/tmp, | Scratch ディレクトリ (tmpfs)。リードレプリカではディスクに書き込まれない。 |
| (writer) delta.walDir | 永続的な事前書き込みログ+L0 デルタセグメント(決して tmpfs を使用せず)。 |
ACL (アクセス制御リスト)
acl.json でユーザーの認証と権限を管理します。パスワードは argon2id ハッシュで保存されます。
基本構造
slater hash-password 's3cret'
結果例:
{ "users": { "reporting": { "passwordArgon2id": "$argon2id$v=19$m=19456,t=2,p=1$<salt>$<hash>", "grants": { "people": ["read"], "products": ["read", "write"] } } } }
- read: グラフをクエリ。権限がないグラフは見えません。
- write: ライト可能レイヤー(
)を通じて変更を行う権限。delta.enabled
注意: リード権限のみを持つユーザーは、ライト可能レイヤーを使用できません。書き込みには「read」と「write」の両方が必要です。
ヘルスチェックとコマンド
サーバーヘルスチェック
サーバーが Bolt プロトコルで正常に動作しているか確認します(HTTP は不可)。
slater healthcheck localhost 7687 # exit 0 = healthy # exit 1 = unhealthy (protocol negotiation failed)
ワンショットクエリ
サーバーを立ち上げずに、ローカルでグラフクエリを実行して結果を確認できます。
slater query mygraph 'MATCH (n) RETURN count(n) AS c' # -q を指定すると JSON 出力のみ(ログなし) slater query mygraph -q 'MATCH (c:Company) RETURN c.ticker AS t LIMIT 3'
グラフエクスポート (Dump)
サーバーからビジネスキー MERGE Cypher をダンプし、バックアップやマイグレーションに使用します。
SLATER_DUMP_PASSWORD=pw slater dump people -u reporting -o people.cypher slater-build --input people.cypher --graph people --data-dir ./data
実装例 (Docker)
オフラインビルドと起動
-
イメージダウンロード:
docker pull hikarisystems/slater:latest -
オフラインライターでグラフ世代をビルド:
docker run --rm -v slater-data:/data -v "$PWD/dumps:/dumps:ro" \ --entrypoint /app/slater-build hikarisystems/slater:latest \ --input /dumps/people.cypher --graph people --data-dir /data -
Bolt サーバーを起動 (7687 ポート):
docker run -d --name slater -p 7687:7687 \ -v slater-data:/data:ro -v "$PWD/acl.json:/config/acl.json:ro" \ hikarisystems/slater:latest
ローカル開発ビルド
docker compose build docker compose up slater # ビルダーステージでの世代ビルド docker compose run --rm builder \ --input /dumps/people.cypher --graph people --data-dir /data
デベロップメント
環境構築
export PATH="$HOME/.cargo/bin:$PATH" cargo build cargo test # 単元+有界 RSS ヘッダー統合テスト cargo clippy --all-targets -- -D warnings cargo fmt --all -- --check
オブジェクトストア機能のコンパイル
デフォルトはローカル FS ですが、S3/GCS バックエンドを有効化するには機能フラグが必要です。
# S3 / GCS 機能を有効にビルド cargo build -p slater -p slater-build --features s3 # 両方を含める場合 cargo build -p slater -p slater-build --features s3,gcs
統合テスト(オブジェクトストア用)
cargo test --features s3 --test s3_minio cargo test --features gcs --test gcs_emulator cargo test --features gcs --test gcs_real
パフォーマンス
Slater はメモリ使用量においてディスクベースなデータベースの中で最も低いを維持します。Wikidata (91.6M ノード) であっても、Neo4j (~2 GiB ヒープコミット) に比べて 584 MiB のレジデントメモリで動作します(実装例ではメモリアルトリオはロードすら不可能)。
メイン指標
- レジデントメモリ: グラフサイズに依存せず、設定されたキャッシュ予算のみ。
- 遅延 (Latency): メタデータ・スキャン・単純なルックアップで 0.4 ms 台(メモリアル DB より高速)。
- ベクター検索: コサイン・L2・ドット積での KNN は、正確な brute force スキャンを使用するため精度が高く、Neo4j や LadybugDB を上回る。
遅延比較表 (中央値 ms) - MeSH グラフ例
| クエリ形状 | Slater | Neo4j 5 | Memgraph |
|---|---|---|---|
| count(*) | 0.41 | 15.0 | 23.8 |
| label count | 0.42 | 4.2 | 20.7 |
| indexed point lookup | 0.43 | 3.9 | 0.48 |
| 1-hop (indexed) | 1.28 | 5.8 | 1.21 |
注: Slater は 91.6M ノードでも count(*) が 0.41 ms と超低遅延ですが、多段ホップ(var-length path)については Neo4j に劣る場合があります(実装上の弱点として認識)。ただし、メモリ使用量は桁違いに小さいです。
ライセンス
Apache License, Version 2.0 でライセンスされています。