Minigraf: Rust로 작성된 임베디드 이중 시간(Bi-temporal) 그래프 데이터베이스
개요
Minigraf는 AI 에이전트, 모바일 애플리케이션 및 브라우저 기반 환경을 위해 설계된 독립형 임베디드 그래프 데이터베이스입니다. 이 데이터베이스는 "연결된 데이터를 위한 SQLite" 역할을 하며, Datalog 쿼리와 이중 시간(bi-temporal) 타임 트래블 모델을 지원하는 단일 파일 저장 시스템을 제공합니다. 이를 통해 사용자는 트랜잭션 시간이나 유효 시간 내의 특정 시점에 데이터가 존재했던 상태 그대로 쿼리할 수 있습니다.
핵심 기술 역량
이중 시간(Bi-temporal) 타임 트래블
Minigraf는 모든 사실(fact)을 두 가지 고유한 시간 차원으로 추적하는 이중 시간 모델을 구현합니다:
- 트랜잭션 시간(Transaction Time): 데이터베이스에 사실이 기록된 시점.
- 유효 시간(Valid Time): 현실 세계에서 그 사실이 참이었던 시점.
이 아키텍처는 기록을 잃지 않으면서 소급 수정을 가능하게 합니다. 예를 들어, 사용자는 원래 기록을 보존하면서 잘못 입력된 값을 수정할 수 있으며, 시스템이 특정 순간에 무엇을 알고 있었는지에 대한 감사 추적(audit trail)을 제공합니다.
Datalog 쿼리 언어
Minigraf는 그래프 탐색을 위해 SQL이나 Cypher 대신 Datalog를 사용합니다. 이 프로젝트는 Datalog가 설계상 재귀적이기 때문에 다중 홉(multi-hop) 탐색을 자연스럽게 처리할 수 있어 그래프 데이터에 더 적합하다고 주장합니다. 또한, [?e :attr ?v]와 같은 간단한 패턴으로 구성된 균일한 문법은 LLM이 생성한 쿼리와의 호환성을 극대화합니다.
임베디드 아키텍처
Minigraf는 별도의 서버로 실행되는 대신 애플리케이션에 직접 임베디드되도록 설계되었습니다. 주요 아키텍처 제약 사항은 다음과 같습니다:
- 단일 파일 저장: 데이터는 단일
.graph파일에 저장됩니다. - 규모 목표: 100만 노드 미만의 데이터셋에 최적화되어 있습니다.
- 제로 구성:
Minigraf::open("data.graph")호출 한 번으로 데이터베이스가 초기화됩니다. - 비분산형: 설계상 Minigraf는 클러스터링, 샤딩 또는 복제를 지원하지 않으며, 각 인스턴스는 자체 로컬 파일을 소유합니다.
성능 및 내구성
현재 벤치마크에 따르면, 100만 개의 사실이 있는 상태에서 포인트 쿼리는 4.3초에서 4.5초 사이가 소요됩니다. 시스템은 제한된 패턴에 대해 선택적 B+트리 조회를 사용하며, 전체 속성 스캔에는 O(N)을 사용합니다.
데이터 무결성을 보장하기 위해 Minigraf는 두 가지 내구성 모드를 제공합니다:
- SyncMode::Full: 모든 쓰기 작업이 즉시
fsync됩니다(기본값). - SyncMode::Normal: 처리량을 높이기 위해 대량 로더나 마이그레이션에 사용되지만,
checkpoint()는 여전히 무조건적인fsync를 트리거합니다.
파일 기반 데이터베이스는 사실당 최대 4,080바이트의 직렬화 크기를 강제하지만, 인메모리 데이터베이스에는 이러한 제한이 없습니다.
플랫폼 지원 및 바인딩
Minigraf는 Rust(버전 1.89 이상 필요)로 작성되었으며 다양한 수준의 언어 바인딩을 제공합니다:
| 플랫폼 | 티어 | 패키지/메서드 |
|---|---|---|
| Rust (Native) | 1 | minigraf on crates.io |
| Python | 1 | minigraf on PyPI |
| Browser WASM | 2 | @minigraf/browser on npm (IndexedDB-backed) |
| WASI | 2 | @minigraf/wasi on npm |
| Node.js | 2 | minigraf on npm |
| Java/Android | 2 | Maven Central (.aar for Android) |
| iOS/macOS | 2 | Swift Package Manager (.xcframework) |
| C / FFI | 2 | C header and shared library |
티어 1 바인딩은 완전히 테스트되었으며 핵심 릴리스와 동시에 배포됩니다. 티어 2 바인딩은 실험적이며 스모크 테스트만 거칩니다.
활용 사례
AI 에이전트
Minigraf는 AI 에이전트를 위한 시간적 메모리 계층 역할을 합니다. 에이전트가 신념을 저장하고, 기록을 지우지 않고도 이를 철회하거나 수정하며, 과거 상태를 재생하여 특정 결정의 근거를 감사할 수 있게 합니다. 이는 벡터 저장소가 유사성 검색을 처리하고 Minigraf가 관계형 및 시간적 쿼리를 처리하는 "GraphRAG" 패턴에서 벡터 저장소를 보완합니다.
모바일 애플리케이션
이중 시간 모델은 소급 수정이 필요한 오프라인 우선(offline-first) 애플리케이션을 지원합니다. 네이티브 Kotlin 및 Swift 바인딩을 통해 개발자가 Rust 코드를 작성하지 않고도 Android 및 iOS 앱에 통합할 수 있습니다.
커뮤니티 토론 및 반론
이 프로젝트는 고유한 기능 조합을 강조하지만, Hacker News의 일부 커뮤니티 회원들은 이러한 사용 사례에 새로운 쿼리 언어와 데이터베이스가 필요한지에 대해 의문을 제기했습니다:
"관계 테이블에 (타임스탬프를 포함한) 타입이 지정된 속성을 지원하는 기존의 Cypher 기반 데이터베이스로도 이 사용 사례를 충분히 처리할 수 있습니다."
다른 이들은 개인 생산성 도구를 위한 "엔티티의 시간적 다중 우주"라는 개념의 실용성에 의문을 제기하며, 코드 분석과 같은 특정 애플리케이션의 경우 표준 SQLite 구현으로도 대규모(예: 1,000만 개의 엣지) 그래프 데이터를 처리할 수 있다고 제안했습니다.
Sources
관련
- 프로젝트
- 프로젝트
- Dispatch
- 프로젝트
- 프로젝트