Show HN: LatticeDB – グラフデータベース向けの SQLite のようなもの

2026/08/26 1:52

Show HN: LatticeDB – グラフデータベース向けの SQLite のようなもの

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

LatticeDB は、単一のポータブルファイルに保存される高性能な埋め込み属性グラフデータベースであり、一台のマシン上でのローカルファーストアプリケーションのためにユニークに設計されています。ネイティブ HNSW ベクター検索と BM25 全文インデックスを構成要素なしで一つのエンジンに統合しています。Zig で記述され、外部依存関係を持たず、Python、TypeScript/Go、CLI、C の複数言語へのバインドを提供するとともに、永続的なイベントロギングと組み込みのグラフチェンジフィードを活用して ACID トランザクションを確保します。

単一ライター環境向けに設計されており、ナノ秒級のノードルックアップ(0.13 μs)とベクター検索での完全なリコール(100 万ベクターで 0.83 ms)を実現し、SQLite のような従来のディスクベースシステムを最大 23 倍も上回る性能を発揮し、Weaviate などのサーバーサイド代替品とも競合しています。また、MERGE/UNWIND、ハッシュ埋め込み、Levenshtein 距離による模糊検索、効率的な隣接キャッシュを使用したグラフ走査といった高度な操作もサポートします。

軽量でありリッチなデータ特徴をローカルに組み込むのに最適ですが、LatticeDB は複数ライターのシナリオ、単一マシンを超えた分散スケーリング、OPTIONAL MATCH などの完全な Cypher 機能が必要なアプリケーションには適していません。標準的な SQL テーブル限定ワークフローや厳格な複数ユーザの同時性を必要とするチームは、他のツールを検討すべきです。

本文

LatticeDB:ネイティブベクトルと全文検索を備えた埋め込み型プロパティグラフデータベース

LatticeDB は、関係性データ、セマンティックデータ、テキストデータを扱うための単一ファイル型のローカルデータベースです。一つのエンジンとクエリレイヤーだけで、関係性の探索、ベクトル類似度検索、BM25 による全文検索を同一のデータセットで実行可能です。

特徴とコンセプト

LatticeDB はゼロ構成で動作する埋め込み型の単一ライターモデルを採用しており、一台のマシン上で関係性が重視されるワークロード向けに設計されています。Graph RAG、エージェントメモリ、ローカルな知識ツールなどは、このデータベースを基盤としたワークロードの例です。

  • 一つのファイル: データベース全体がポート可能な単一ファイルで、サーバーや設定は不要です。
  • 一つのクエリレイヤー: グラフ探索、HNSW ベクトル類似度検索、BM25 全文検索を同じクエリ言語の中で実行可能です。
  • 一つのイベントログ: デュアブルな命名されたストリームと組み込みのグラフチェンジフィードは、書き込みと同じトランザクション/WAL パスを共有します。
  • ローカルフースト: 一台のマシン上で一つのオーナープロセス向けに設計され、WAL を介した耐久性を備えています。
  • 高速:
    • ノード検索: 0.13 μs
    • 100 万ベクトルでの 100% Recall ベクトル検索: 0.83 ms

インストール方法

CLI

curl -fsSL https://raw.githubusercontent.com/jeffhajewski/latticedb/main/dist/install.sh | bash

Python

公開された wheels は

liblattice
をバンドルしています。ソースからのインストールでは、以下の環境変数を指定してネイティブライブラリをバンドルできます:

LATTICE_BUNDLE_LIB_DIR=/path/to/lib pip install ...

TypeScript / Node.js

npm install @hajewski/latticedb

パッケージには

liblattice
がバンドルされており、ソースからのビルドでは以下でネイティブライブラリをステージできます:

LATTICE_BUNDLE_LIB_DIR=/path/to/lib npm run bundle:native

Go

最新の cgo ワークフローについては bindings/go/README.md を参照してください。開発では

-tags repolocal
フラグを
zig-out/lib
に使用可能です。

入門ガイド

  • Getting Started: CLI, Python, TypeScript, Go の最短学習パス
  • CLI Quickstart: コピー&ペースト可能な最小限の例
  • Examples Overview: グラフ/ベクトル/テキスト検索のデモ

ワークフローのコード例

Cypher による例

類似したチャンクを検出し、ドキュメント経由で著者へ探索するクエリ:

MATCH (chunk:Chunk)-[:PART_OF]->(doc:Document)-[:AUTHORED_BY]->(author:Person)
WHERE chunk.embedding <=> $query_vector < 0.3
  AND doc.content @@ "neural networks"
RETURN doc.title, chunk.text, author.name
ORDER BY chunk.embedding <=> $query_vector
LIMIT 10

Python による完全な例

from latticedb import Database
from latticedb.embedding import hash_embed

with Database("knowledge.db", create=True, enable_vectors=True, vector_dimensions=128) as db:
    # --- グラフの構築 ---
    with db.write() as txn:
        alice = txn.create_node(labels=["Person"], properties={"name": "Alice", "field": "ML"})
        bob = txn.create_node(labels=["Person"], properties={"name": "Bob", "field": "Systems"})
        txn.create_edge(alice.id, bob.id, "COLLABORATES_WITH")

        for title, text, author in [
            ("Attention Is All You Need", "The transformer architecture...", alice),
            ("Scaling Laws for LLMs", "We find that model performance scales...", alice),
            ("Log-Structured Merge Trees", "LSM trees optimize write-heavy workloads...", bob),
        ]:
            doc = txn.create_node(labels=["Document"], properties={"title": title})
            chunk = txn.create_node(labels=["Chunk"], properties={"text": text})

            # 埋め込みの保存とテキストのインデックス化
            txn.set_vector(chunk.id, "embedding", hash_embed(text, dimensions=128))
            txn.fts_index(chunk.id, text)

            txn.create_edge(chunk.id, doc.id, "PART_OF")
            txn.create_edge(doc.id, author.id, "AUTHORED_BY")

    # --- クエリ: ベクトル検索 + テキスト一致 + グラフ探索 ---
    results = db.query("""
        MATCH (chunk:Chunk)-[:PART_OF]->(doc:Document)-[:AUTHORED_BY]->(author:Person)
        WHERE chunk.embedding <=> $query < 0.5
        RETURN doc.title, chunk.text, author.name
        ORDER BY chunk.embedding <=> $query
        LIMIT 5
    """, parameters={"query": hash_embed("transformer attention mechanism", dimensions=128)})

    for row in results:
        print(f"{row['doc.title']} by {row['author.name']}")

TypeScript による例

import { Database } from "@hajewski/latticedb";
import { hashEmbed } from "@hajewski/latticedb/embedding";

const db = new Database("knowledge.db", {
  create: true,
  enableVectors: true,
  vectorDimensions: 128,
});
await db.open();

await db.write(async (txn) => {
  const alice = await txn.createNode({ labels: ["Person"], properties: { name: "Alice" } });
  const doc = await txn.createNode({ labels: ["Document"] });
  const chunk = await txn.createNode({ labels: ["Chunk"] });

  await txn.setVector(chunk.id, "embedding", hashEmbed("transformer self-attention", 128));
  await txn.ftsIndex(chunk.id, "The transformer architecture uses self-attention...");

  await txn.createEdge(chunk.id, doc.id, "PART_OF");
  await txn.createEdge(doc.id, alice.id, "AUTHORED_BY");
});

const results = await db.query(
  `MATCH (chunk:Chunk)-[:PART_OF]->(doc:Document)-[:AUTHORED_BY]->(author:Person)
   WHERE chunk.embedding <=> $query < 0.5
   RETURN doc.title, chunk.text, author.name
   ORDER BY chunk.embedding <=> $query`,
  { query: hashEmbed("attention mechanism", 128) }
);

for (const row of results.rows) {
  console.log(`${row["doc.title"]} by ${row["author.name"]}`);
}

Go による例

db, err := latticedb.Open("knowledge.db", latticedb.OpenOptions{
    Create: true,
    EnableVectors: true,
    VectorDimensions: 128,
})
if err != nil { log.Fatal(err) }
defer db.Close()

err = db.Update(func(tx *latticedb.Tx) error {
    node, _ := tx.CreateNode(latticedb.CreateNodeOptions{
        Labels: []string{"Chunk"},
        Properties: map[string]latticedb.Value{"text": "The transformer..."},
    })
    if err := tx.SetVector(node.ID, "embedding", []float32{1, 0, 0, 0}); err != nil { return err }
    return tx.FTSIndex(node.ID, "The transformer...")
})
if err != nil { log.Fatal(err) }

パフォーマンス評価

Apple M1(シングルスレッド、自動調整されたバッファプール)でのベンチマーク結果です。再現するには

zig build benchmark
を実行してください。

コア操作のレイテンシ

操作レイテンシスループットターゲットステータス
ノード検索0.13 μs790 万 ops/sec< 1 μsPASS
ノード作成0.65 μs150 万 ops/sec
エッジ探索9 μs11.1 万 ops/sec
全文検索 (100 ドキュメント)19 μs5.3 万 ops/sec
10-NN ベクトル検索 (100 万ベクトル)0.83 ms1.2 千 ops/sec< 10 ms @ 1MPASS

スケールにおけるベクトル検索 (HNSW)

設定:128 次元、M=16, ef_construction=200, ef_search=64, k=10。

zig build vector-benchmark
で再現可能。

スケールメアンレイテンシP99 レイテンシRecall@10メモリ
1,00065 μs70 μs100%1 MB
10,000174 μs695 μs99%10 MB
100,000438 μs1.2 ms99%101 MB
1,000,000832 μs1.8 ms100%1,040 MB

検索レイテンシは 99–100% の Recall@10 を達成しながら線形未満(O(log N))のスケールを行います。多様なグラフ接続性を確保し、メモリ使用量を削減するための最適化も含まれています。

ef_search の感度 (100 万ベクトル)

ef_searchメアンレイテンシRecall@10
16506 μs57%
321.9 ms79%
64990 μs100%
1283.2 ms100%
25611.6 ms100%

競争分析:ポインタルックアップ

LatticeDB の B+Tree はサブマイクロ秒でのキャッシュされたルックアップを実現し、RocksDB インメモリーと同等の性能を持ち、ディスク上の SQLite よりも 23 倍高速です。

システムレイテンシタイプ
LatticeDB0.13 μs埋め込み
RocksDB (インメモリー)0.14 μs埋め込み
SQLite (インメモリー)~0.2 μs埋め込み
SQLite (WAL, ディスク)3 μs (p90)埋め込み
Neo4j28 ms (p99)サーバー

競争分析:ベクトル検索 (10-NN, 100 万ベクトル)

LatticeDB は 100 万ベクトルで Recall@10 100%、平均 0.83 ms を達成しており、シングルスレッド FAISS HNSW よりも高速です。サーバー系システム(Weaviate, Qdrant)とも競争力があります。

システムレイテンシタイプ
LatticeDBメアン 0.83 ms, Recall 100%埋め込み
FAISS HNSW (シングルスレッド)0.5–3 msライブラリ
Weaviateメアン 1.4 ms, P99 3.1 msサーバー
Qdrant~1–2 msサーバー
pgvector HNSW~5 ms @ 99% recall拡張機能

競争分析:グラフ探索 (2 ホップ、10 万ノード)

LatticeDB は 39 μs で完了し、Neo4j (10ms)、Kuzu (19ms) よりも高速です。

システムレイテンシタイプ
LatticeDB39 μs埋め込み
SQLite (再帰的 CTE)548 μs埋め込み
Kuzu19 ms埋め込み
Neo4j10 msサーバー

ディープスリミテッド探索の速度差 (LatticeDB vs SQLite)

深い深さにおいて、SQLite の CTE オーバーヘッドが顕著に増加します。

深さLatticeDBSQLiteスピードアップ
10311 μs121 ms390 倍
15380 μs271 ms713 倍
25318 μs587 ms1,848 倍
50500 μs1.4 s2,819 倍

競争分析:全文検索 (BM25)

LatticeDB の逆数インデックスは、SQLite FTS5 よりも約 300 倍高速です。

システム検索レイテンシタイプ
LatticeDB19 μs埋め込み
SQLite FTS5< 6 ms埋め込み
Elasticsearch1–10 msサーバー

機能一覧

  • グラフ: ラベルと任意のプロパティ、永続的な明示的等値インデックス、マルチホップ探索、ACID トランザクション。
  • ベクトル検索: HNSW 近似近傍検索(設定可能な M, ef)、バッチベクトルノード挿入。
  • 全文検索: BM25 ランク付け逆数インデックス、Levenshtein 距離によるファジー検索。
  • Cypher クエリ言語: MATCH, WHERE, RETURN, CREATE, DELETE 等の全機能をサポート。
    <=>
    (ベクトル距離),
    @@
    (全文検索) 演算子対応。

操作特性

  • 単一ファイルストレージ: クラッシュ回復用のログ付き書き込み前ログを備え、ゼロ構成で動作。
  • 永続的なイベントログ: 明示的なコンシューマーオフセットとグラフチェンジフィードに対応。
  • メンテナンス:
    lattice compact
    を使用してオンラインフリーリストを再利用し、物理的テール廃棄を行う。
  • 互換性: Clean C API および Python, TypeScript, Go バインディングを提供。

主な使用例

  • 相互接続されたローカルデータ: ノート、ドキュメント、引用グラフの構築。
  • グラフプラスリトリバル: 関係性探索、セマンティック検索、辞書的検索を同一データセットで実行。
  • ローカル知識ツール: サーバーなしの埋め込み型アプリやエージェントメモリ/RAG パイプラインの基盤。
  • 軽量な代替手段: ローカル開発用として Neo4j や Weaviate の代わりに使用可能。

別のツールを選ぶべきケース

LatticeDB は高速ですが、速度だけが重要でない場合や以下の要件がある場合は他を検討してください:

  1. マルチライター環境: LatticeDB は単一ライターモデルです。多数のクライアントを接続する場合は Neo4j や PostgreSQL などのクライアントサーバー型を選択してください。
  2. 主に表形式データ: レコード間の関係性が主目的でない場合(売上記録など)、SQLite や PostgreSQL のリレーショナルデータベースの方がシンプルで高速です。
  3. 大規模スケーリング: シャarding や分散クエリが必要な場合は、Neo4j クラスタやマネージドサービスを検討してください。
  4. 完全な Cypher 機能:
    OPTIONAL MATCH
    やコールプロシージャなどの一部の機能が未実装の場合、Neo4j が適しています。
  5. エコシステム: 管理ダッシュボードや豊富なライブラリを必要とする場合、既存の成熟したツールの方が有利です。

ソースからビルド

Zig で書かれており依存関係はありません。

git clone https://github.com/jeffhajewski/latticedb.git
cd latticedb
zig build                  # すべてのものをビルド
zig build test             # テストを実行
zig build -Doptimize=ReleaseFast   # 最適化ビルド

ドキュメント

  • Getting Started
  • Durable Streams and Graph Changefeeds
  • Architecture Overview
  • Client API Migration Notes
  • API Reference (Python, TypeScript, Go)

ライセンス: MIT

同じ日のほかのニュース

一覧に戻る →

2026/08/26 6:39

Python の事前宣言定数は少し奇妙です

## Japanese Translation: Python は 6 つのプリデークレードされた項目を持っています:`True`, `False`, `None`, `__debug__`, `Ellipsis`(`...`), および `NotImplemented`。これらはしばしば「定数」と呼ばれますが、その挙動は大きく異なります。 このうち 4 つ(`True`, `False`, `None`, `__debug__`)は通常の識別子ではなく特別な構文的トークンです。そのため: • `x.True` などの式は `SyntaxError` を発生させます。 • 他の文脈では構文上問題がないにもかかわらず、これらに直接代入または削除を行うことは `SyntaxError` を引き起こします(例:`__debug__ = 67` または `del __debug__`)。 • オブジェクト上の属性経由でのアクセス(例:`obj.__debug__`)は無効ではありませんが、`builtins` 内のエントリを変更する(`getattr`/`setattr` を通じて)ことは、構文的トークンの挙動には影響しません。 対照的に、`Ellipsis` と `NotImplemented` は通常のビルトイン関数に近い動作を示します: • 代入によってグローバルにシャドウ化されることが可能です(例:`NotImplemented = 67`)。 • `builtins` 内の値を変更してもモジュールレベルでの名前には影響しますが、構文的トークン(`...` または `NotImplemented` という識別子)そのものには変更はありません。 さらに、`__debug__` は通常 `True` ですが、Python を `-O` フラグで実行すると `False` になります。これら 6 つの項目を区別する exact な設計理由、特になぜ 4 つだけが構文的トークンとして特別扱いされ、残りの 2 つは通常のビルトインとして扱われるのかは、現在も不明です。

2026/08/25 22:01

Apple、M6 と M5 Ultra を発表する

## Japanese Translation: 8 月 25 日(2026 年)、カリフォルニア州クアパティーノでアップルは、地域のアートフィシャルインテリジェンスを変革することを目的とした革命的なシリコンチップを発表しました。頭部のイノベーションは、Mac mini 向けの新しい **M6 チップ**であり、画期的な **2 ナノメートル製造プロセス**を特徴としています。このチップは、12 コア CPU(2 つのスーパークコア、4 つのパフォーマンスコア、および 6 つのエフィシェンシーコアから構成)、ニューラルアクセラレータを備えた 12 コア GPU、そして最大 32GB の統一メモリを高速で最大 170GB/s の速度でサポートします。 新しい Mac Studio とペア付けられているのは、アップルの最初のクワッドダイアーキテクチャであり、高度なウルトラフュージョン技術を利用した **M5 Ultra**です。これは、最大 36 コアの CPU コアと最大 80 コアの GPU コアで構成され、1.2TB/s の帯域幅で驚くべき 512GB の統一メモリをサポートする大規模なスケーラビリティを提供します。M5 Ultra は、AI における M3 Ultra に比べて最大 4.5 倍のパーク GPU コンピューティングを提供するため、大きなパフォーマンスの向上が期待されます。両方のチップは、高解像度のビデオ編集や複雑なエージェントワークフローを可能にする先進的なグラフィック機能を備えており、第 3 世代レイトレーシングとハードウェア加速メッシュシェーディングが含まれています。 これらのアップグレードにより、「Apple Intelligence」(2026 年秋の macOS 27 で、Apple Beta Software プログラムを通じて利用可能)がユーザーデバイスの上で完全に動作し、数百億パラメータを持つ最先端 AI モデルをクラウドサーバーに依存せずにホストできるようになります。新しい開発者フレームワークにより、Xcode や Core ML のようなツールを使用して大規模言語モデルのローカルでの微調整が可能となり、英語、中国語、日本語、韓国語を含む複数の言語で利用できる強力なプライバシー重視のオンデバイス AI 計算への決定的なシフトを示しています。

2026/08/25 23:06

OpenAI Jalapeño:Nvidia Blackwell より優れている

## Japanese Translation: OpenAI は、Broadcom との協力による約 16 ヶ月の開発(2024 年中盤から開始)を経て、「Jalapeño」という推論専用の ASIC を発表しました。LLM の推論のためにゼロから設計された Jalapeño は、過剰な特殊化ではなく極限までのハードウェア・ソフトウェアのコデザインと一般化に依存しており、推定的デコードや特定のワークロード調整を必要とせず、あらゆるモデル推論シナリオで高い性能を実現しています。 InferenceX スイートを用いた独立したベンチマーク(Hot Chips で実施)により、Jalapeño はトークン毎ワットあたりで Nvidia、AMD、Google のチップを上回ることが確認されました。TSMC の N3P プロセスで作製され、HBM4 メモリを備えるこのチップは、GPU に見られる固定されたレイテンシを排除するために順序変換コアと L1 キャッシュを採用し、MXFP 数値形式およびウェイト定数型シンタリック配列を用いて性能の急激な低下を防いでいます。OpenAI の独自プログラミング言語「Gluon」は、高効率を実現するために直接永続スレッドにマッピングされたハンドチューニング済みカーネルを可能にしています。 システムアーキテクチャは、CPU ホストラック(「Katsu」、AMD EPYC プロセッサ搭載)と ASIC ラック(「Vindaloo」、トレイあたり 16 チップ)から構成されます。この設計により、ハイブリッド銅線/光ネットワークを活用して最大 2,048 ユニットまで柔軟にグローバルなスケールアップが可能です。2025 年 11 月にタプトアウト(A0 ステッピング)され、初版はすぐにデプロイが可能で、タプトアウト直後にスループットの大幅な向上が実現されています。現在ファブ内にある将来の B0 ステッピングでは、効率性が約 25% 向上しており、Nvidia の Rubin チップに比べて優れた消費電力性能を提供します。生産は 2027 年に段階的に増産され、多くの出力は翌年の後半に期待されており、OpenAI パートナーが信頼性データを収集する期間としては 1 月までとされています。