jeffhajewski/latticedb

Embedded single-file knowledge graph database with vector search and full-text search for AI/RAG apps

LatticeDB – エンベッド型グラフ+ベクトルデータベース

何であるか – LatticeDB は1ファイルに収まるエッジ付きプロパティグラフデータベースであり、密なベクトルと全文インデックスも格納できます。ローカルプログラムは、1つの Cypher 風のクエリ言語を使って、関係の走査、ベクトル類似性、BM25テキスト検索のいずれかで同じデータを照会できます。

AIにとってなぜ重要か – 現代のAIアプリケーション(RAGパイプライン、エージェントメモリ、ローカル知識ベース)は、しばしば以下の3つの要素を同時に必要とします:

  1. グラフ構造 – エンティティとその関係をモデル化するため。
  2. 意味的埋め込み – 類似性検索のため。
  3. キーワード検索 – 精確なテキストマッチングのため。 LatticeDB はこれら3つを1つのエンジンで提供し、別々のグラフDB、ベクトルDB、検索サービスを組み合わせる必要をなくします。

主な特徴(READMEより)

  • 1ファイルストレージ – データベース全体がポータブルな1ファイルに収まる;サーバー不要、設定不要。
  • 統合クエリレイヤー – Cypher は MATCHWHERERETURN をサポートし、以下の2つの新しい演算子も追加:
    • <=>:ベクトルプロパティにおけるコサイン距離。
    • @@:BM25全文検索。
  • ネイティブな HNSW ANN – 設定可能なパラメータを持つ近似最近傍検索。100万ベクトルに対して10-NN検索を0.83ms(平均)で実行し、100%のリコールを達成。
  • BM25逆インデックス – 約19µs(100ドキュメント)で高速な語彙検索を実現し、曖昧マッチも可能。
  • ACIDトランザクション – ログ書き込み、クラッシュ回復、コミット/ロールバック。
  • 耐久性のあるイベントストリーム – 名前付き変更フィードは同じ WAL を共有し、リアクティブエージェントに有用。
  • バインディング – Python、TypeScript/Node、Go、Java(JDK 21+)向けのクリーンなC APIラッパー。
  • ゼロ設定、シングルライターモデル – シングルプロセスで書き込みを行うローカルファーストアプリに最適。

パフォーマンスのハイライト(ベンチマーク提供)

操作 ラテントシー スループット
ノード検索 0.13 µs 7.9 M ops/s
10-NNベクトル検索(1Mベクトル) 0.83 ms(平均) 1.2 k queries/s
2ホップグラフ走査(10万ノード) 39 µs
BM25全文検索(100ドキュメント) 19 µs 53 k ops/s
これらの数値は、同じワークロードにおいてFAISS、Weaviate、SQLite-FTS5、Neo4jなどの人気代替品と同等またはそれ以上であり、完全にエッジ付きのままです。

インストール

  • CLIcurl …/install.sh | bash
  • Pythonpip install latticedb
  • Nodenpm install @hajewski/latticedb
  • Java – Maven/Gradle で bindings/java モジュールから(JDK 21必須)
  • Gogo get してから bindings/go/README.md を参照

クイック例(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:
    db.create_node_fts_index('Chunk', 'text')
    with db.write() as txn:
        alice = txn.create_node(labels=['Person'], properties={'name':'Alice'})
        doc   = txn.create_node(labels=['Document'], properties={'title':'Attention Is All You Need'})
        chunk = txn.create_node(labels=['Chunk'], properties={'text':'The transformer architecture uses self‑attention...'})
        txn.set_vector(chunk.id, 'embedding', hash_embed('transformer self‑attention', 128))
        txn.create_edge(chunk.id, doc.id, 'PART_OF')
        txn.create_edge(doc.id, alice.id, 'AUTHORED_BY')
        txn.commit()

    results = db.query(
        """MATCH (c:Chunk)-[:PART_OF]->(d:Document)-[:AUTHORED_BY]->(a:Person)
           WHERE c.embedding <=> $q < 0.5
           RETURN d.title, c.text, a.name
           ORDER BY c.embedding <=> $q LIMIT 5""",
        parameters={'q': hash_embed('attention mechanism', 128)}
    )
    for row in results:
        print(row['d.title'], 'by', row['a.name'])

同じパターンはTypeScript、Go、Javaでも利用可能で、言語固有のバインディングを使用します。

一般的な利用例

  • ローカル知識グラフ – ノート、研究論文、引用ネットワーク。セマンティック検索も必要。
  • エージェントメモリ / RAG – ベクトル付きのテキストチャンクを保存。エージェントは1つのクエリで関連する部分を取得可能。
  • プロトタイピング – 単一マシンでの開発時に、重いクライアントサーバースタック(Neo4j + Weaviate)を置き換え可能。
  • エッジ付きアプリ – サーバーなしでグラフ構造データが必要なデスクトップまたはモバイルツール。

他を検討すべき場合

  • 同時書き込みやネットワークサービスが必要 – LatticeDB はシングルライターのみ。
  • ワークロードが主に表形式 – よりシンプルなリレーショナルDB(SQLite、PostgreSQL)が適している。
  • 多数のマシンにスケーリングが必要 – LatticeDB はシングルプロセス・シングルマシン設計。

結論 – LatticeDB は、グラフ、ベクトル、全文検索を超軽量なエッジ付きエンジンに統合した本格的なオープンソースプロジェクトであり、ローカルAI拡張アプリの構築に便利なブロックです。

関連

  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト