cypher/cypher.c — 查詢引擎

openCypher 唯讀子集的 lexer → parser → planner → executor
檔案:src/cypher/cypher.c(4,972 行)· cypher.h

大方向

cypher.c 是一個迷你的資料庫查詢引擎:它把 query_graph 收到的 Cypher 字串編譯成可執行的計畫,再對 store 執行。雖然只支援 openCypher 的唯讀子集,但完整的四階段(lexer → parser → planner → executor)都有——讀這個檔案等於讀「怎麼在 C 裡寫一個小型圖查詢引擎」。


1. 前端:lexer + parser

lexer(tokenize) cypher.c把查詢字串切成 token:識別字、label、邊方向、數字、字串。

MATCH (f:Function)-[:CALLS]->(g) RETURN g.name 切成 token 序列。處理 : label、[*1..3] 可變長度、引號字串、=~ regex 等。

parser(AST 建立) cypher.c把 token 組合成語法樹:MATCH/WHERE/RETURN 子句。

遞迴下降解析:pattern(節點、邊、方向)、WHERE 條件樹、aggregates、UNION。遇到不支援的子集語法(MERGECALL、comprehensions)在此回報 unsupported … 錯誤。

2. Planner + Executor

planner cypher.c把 AST 轉成執行計畫(哪些邊先走、filter 順序)。

決定查詢順序:先抓 label 少的候選,再做 join/filter。EXISTS 子查詢(死碼偵測)被編譯成「檢查單跳存在性」的特別步驟。

executor(cbm_cypher_execute) cypher.c執行計畫,回傳 cbm_cypher_result_t。

對 store 的 SQL 下查詢、組列、套 aggregates(count/sum/avg/min/max/collect)、處理 ORDER BY / SKIP / LIMIT、UNION 合併。<1ms 的 Cypher 查詢就在這裡達成。

看完這頁你應該能說出:Cypher 子集是「四階段編譯」的小型查詢引擎、lexer/parser/planner/executor 各做什麼、unsupported … 在哪一層被拒絕、以及 EXISTS 子查詢如何編譯成單跳存在性檢查。