グラフデータベースを使いたいけど「Neo4jは重い」「外部サービスに依存したくない」「アプリに直接埋め込みたい」——そんな悩みを持つエンジニアにとって、Grafeo はかなり刺さるプロジェクトだ。
Grafeoとは何か?なぜ注目すべきか
Grafeo は Rust で書かれたグラフデータベースで、「速い・軽い・埋め込める」の三拍子が特徴。LDBC Social Network Benchmark(グラフDBの業界標準ベンチマーク)において、組み込みモード・サーバーモード双方で最速クラスのパフォーマンスを記録しており、メモリ使用量も他のインメモリDBより少ないと主張している。
Rustのゼロコスト抽象化を活かしたベクトル化実行エンジン、アダプティブチャンキング、SIMD最適化など、パフォーマンス面の作り込みは本物だ。外部C依存なし(オプションのjemalloc/mimloc, TLSを除く)でビルドでき、Rustの「怖くない並行性」でメモリ安全性も担保されている。
技術的な特徴を整理する
- クエリ言語が6種類: GQL(デフォルト)、Cypher、Gremlin、GraphQL、SPARQL、SQL/PGQに対応。Neo4j経験者はCypherでそのまま使えるし、SPARQLを使いたいセマンティックWebエンジニアにも対応する
- デュアルデータモデル: LPG(Labeled Property Graph)とRDFトリプルの両方をサポート。ユースケースに合わせて選択できる
- ベクトル検索内蔵: HNSW + Scalar/Binary/Product量子化対応。グラフトラバーサルと意味的類似検索を組み合わせたRAGやナレッジグラフ構築が1つのDBで完結する
- ACID対応: MVCCベースのスナップショット分離でフルACID準拠
- 多言語バインディング: Python(PyO3)、Node.js/TypeScript(napi-rs)、Go(CGO)、C(FFI)、C#(.NET 8)、Dart、WebAssembly と幅広い
Pythonで試す:5分で動かせるクイックスタート
uv add grafeo
import grafeo
# インメモリDBを作成
db = grafeo.GrafeoDB()
# ノードを挿入
db.execute("""
INSERT (:Person {name: 'Alix', age: 30})
INSERT (:Person {name: 'Gus', age: 25})
""")
# エッジを張る
db.execute("""
MATCH (a:Person {name: 'Alix'}), (b:Person {name: 'Gus'})
INSERT (a)-[:KNOWS {since: 2024}]->(b)
""")
# クエリ
result = db.execute("""
MATCH (p:Person)-[:KNOWS]->(friend)
RETURN p.name, friend.name
""")
for row in result:
print(f"{row['p.name']} knows {row['friend.name']}")
Rust組み込みの場合は cargo add grafeo で追加するだけ。エッジデバイスからプロダクションクラスターまで同一コードベースで動かせる設計は、IoTや組み込みシステムへの応用でも面白い。
所感:「全部入り」グラフDBの新星
正直、ここまでの機能セットを持つ完全自前実装のOSSグラフDBが登場したのは驚きだ。LangChain・LlamaIndexとのAIインテグレーション、WebAssembly対応でブラウザ内グラフ処理まで視野に入れている。ナレッジグラフ×RAGの構成や、Rustアプリへの直接埋め込みを検討しているエンジニアはぜひ公式ドキュメント(grafeo.dev)とGitHubのベンチマーク結果を確認してほしい。まだコミュニティは小さいが、ポテンシャルは相当高い。