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つの要素を同時に必要とします:
- グラフ構造 – エンティティとその関係をモデル化するため。
- 意味的埋め込み – 類似性検索のため。
- キーワード検索 – 精確なテキストマッチングのため。 LatticeDB はこれら3つを1つのエンジンで提供し、別々のグラフDB、ベクトルDB、検索サービスを組み合わせる必要をなくします。
主な特徴(READMEより)
- 1ファイルストレージ – データベース全体がポータブルな1ファイルに収まる;サーバー不要、設定不要。
- 統合クエリレイヤー – Cypher は
MATCH、WHERE、RETURNをサポートし、以下の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などの人気代替品と同等またはそれ以上であり、完全にエッジ付きのままです。 |
インストール
- CLI –
curl …/install.sh | bash - Python –
pip install latticedb - Node –
npm install @hajewski/latticedb - Java – Maven/Gradle で
bindings/javaモジュールから(JDK 21必須) - Go –
go 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拡張アプリの構築に便利なブロックです。
関連
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト