store/store.c — SQLite 圖儲存

節點/邊、遍歷、搜尋、Louvain 社群
檔案:src/store/store.c(8,427 行)· store.h

大方向

store.c 是所有圖資料的家。它把知識圖譜持久化到 SQLite(WAL 模式、ACID),提供節點/邊的 CRUD、BFS 遍歷(trace_path 的底層)、BM25 全文搜尋、Louvain 社群偵測、以及 Cypher 引擎讀取的資料介面。


1. 儲存模型

cbm_store_t store.hstore 結構:SQLite connection + 節點/邊的 schema。

store 封裝一條 SQLite connection。節點表、邊表、屬性表用 SQL 正規化儲存;搜尋用 SQLite FTS5 + 自訂 cbm_camel_split tokenizer(認得 camelCase / snake_case)。

2. 節點/邊操作

cbm_store_add_node / cbm_store_add_edge / cbm_store_find_nodes_by_label store.c圖的寫入與基本查詢。

pipeline 把節點/邊餵給 store。屬性用 JSON 存,查詢時可過濾。所有 search_graph 的 label/degree 過濾最後都落成 SQL 條件。

3. 遍歷與搜尋

BFS 遍歷(trace_path 底層) store.c從一個節點往外走 N 層找呼叫鏈。

trace_path 深度 1–5 的 BFS 就在這裡:從 function_name 出發,沿 CALLS 邊的方向(inbound/outbound/both)逐層擴張。<10ms 的秘密是 SQL 的 WHERE source IN (…) 批次過濾,而不是逐一節點查詢。

BM25 全文搜尋 store.cSQLite FTS5 + cbm_camel_split tokenizer。

search_code 的底層:對已索引的檔案做全文搜尋。自訂 tokenizer 讓 ProcessOrder 能被 process orderprocess_order 搜到。

4. 社群偵測

Louvain 社群偵測 store.c依 CALLS 邊密度把節點分群。

get_architecture 的 cluster 就是 Louvain 的產出。它只看圖的結構(邊密度),不需要 embedding——把「一起工作的函式」歸成同一個功能模組。

看完這頁你應該能說出:store 用 SQLite 正規化存圖、BFS 用批次 SQL 而非逐點查詢、搜尋走 FTS5 的自訂 tokenizer、以及 Louvain 只看邊密度就能做功能分群。