sparql

    Sparql —— SPARQL 查询解析与求值引擎(词法状态机 + 8 簇分簇解析 + Pratt 表达式 + 代数转换与执行;W3C rdf-tests 桶门+桥装审计线)

    sparql
    rdf
    query
    parser
    Download zip
    Author
    Version
    0.1.3
    License
    Apache-2.0
    Last updated
    10 hours ago
    Downloads
    3

    #sparql

    thy1016/sparql 是 SPARQL 查询引擎(MoonBit):文本 → 词法 → 事件流 → AST → 代数 → 求值,千里问图,一查询达。解析与求值双段齐备:SELECT / ASK / CONSTRUCT 三查询形 + 聚合 / 子查询 / 属性路径 / SPARQL 1.2 三元组项,判定即门 = W3C SPARQL 测试套件。

    #血统明示

    语法参照 Apache Jena ARQ 的 sparql_12.jj(jena-arq/Grammar),分层思想参照 Oxigraph 的 spargebra / sparopt 拆分——思想与形态致敬,线全自研:词法状态机、 分簇解析、AST、代数转换与求值全部按本仓生成链纪律自建。

    #特性

    • 表驱动词法:domain/token_fsm.toml 声明词法状态机(26 态),生成器 产扫描器——词法零语法味,新方言 = 新数据不是新代码;补偿点台账单点 登记(spec §8),词法口径修正永不散落。
    • 八簇分簇解析:Prologue / QueryForm / DatasetClause / WhereClause / GroupGraphPattern / TriplesBlock / Expression / SolutionModifier 各司其职——线性面状态机、嵌套图模式递归下降、表达式 Pratt,簇边界 即错误恢复点。
    • 代数与求值:AST → Op 代数(BGP / Join / LeftJoin / Minus / Union / Filter / Extend / Graph / Values / Path / Project / Distinct / Slice / GroupBy / Order / Ann),eval_query 一行入口直出解集。
    • 查询形全谱:SELECT / ASK / CONSTRUCT(全形模板);聚合 (COUNT/SUM/AVG/MIN/MAX 族)、GROUP BY / HAVING / ORDER BY / LIMIT / OFFSET / VALUES / 子查询(SubSelect)/ 属性路径(? * ^ ! 取反族)。
    • SPARQL 1.2 面:<< s p o >> 三元组项与 TRIPLE()/isTriple() 内建、 方向字面量(--ltr)、VERSION 1.2 词——按 since 字表键控,方言开关 裁剪不动词法表。
    • Update 解析门:eval_update 对 SPARQL 1.1 Update 语法 (syntax-update-1/2,55 案全判);求值面后置(见设计边界)。
    • 桥装审计线:bridge 包 = moonttl 真解析器装载 TriG → 本仓 Store, 与官方查询 × 官方结果件逐门对拍(475 案 475 过)——第二来源异构 oracle,门装↔官方↔桥装三角互证。

    #安装

    确保环境中已安装 MoonBit 工具链,然后在模块根目录:

    moon add thy1016/sparql

    (模块源码正式地址:gitlink https://gitlink.org.cn/thy7/mbt.sparql; 工作区多模块场景可直接以本地树路径引用。)

    在用到它的包的 moon.pkg import 块中添加 "thy1016/sparql/core", 代码内以 @core 前缀使用;TriG 装载桥另加 "thy1016/sparql/bridge"。

    #快速上手

    装店(内存三元组账)→ 一行查询 → 解集:

    let store = @core.Store::new()
    store.add("http://example.org/alice", "http://xmlns.com/foaf/0.1/name", "Alice")
    store.add_typed(
    "http://example.org/alice", "http://xmlns.com/foaf/0.1/age", "31", "",
    "http://www.w3.org/2001/XMLSchema#integer", "",
    )

    let query =
    #|PREFIX foaf: <http://xmlns.com/foaf/0.1/>
    #|SELECT ?name WHERE {
    #| ?a foaf:age ?age .
    #| FILTER(?age > 30)
    #| ?a foaf:name ?name .
    #|}
    match @core.eval_query(query_bytes[:], store) {
    @core.EvalOk(solutions) =>
    for sol in solutions {
    println(sol.get("name")) // => Some("Alice")
    }
    @core.EvalBool(b) => println(b) // ASK 形
    @core.EvalGraph(triples) => /* CONSTRUCT 形:逐三元组 */
    @core.EvalFail(span, reason) => println("fail @\{span.start}: \{reason}")
    }

    数据纪律:Store::add 缺省宾语 = 字面量;IRI 宾语用 add_typed(s, p, o, lang, datatype, kind) 传 kind = "iri" (blank node 同理传 "bnode");带型/带语言标签字面量传 lang / datatype。

    TriG 文档装载走桥(真解析器,Turtle 系全语法面):

    let (store, warnings) = @bridge.store_from_trig(trig_bytes)

    完整可运行示例见 cmd/demo(装店六账 → 四查询全链,终行 DEMO:PASS):

    moon run cmd/demo --target native

    #包结构

    包内容
    thy1016/sparql/core手写层:token 型 / 事件适配 / 分簇解析 / Pratt / 代数 / 求值引擎
    thy1016/sparql/gen生成物包(kindgen 输出落点,禁手编;三产物逐字节黄金门住生成器侧)
    thy1016/sparql/bridgemoonttl 真解析器 × sparql Store 连通件(store_from_trig)
    domain/契约字表(TOML,人类维护面;词表 = 数据)
    cmd/demo全链自证可运行示例(DEMO:PASS)

    生成链:domain/*.toml → kindgen(主仓生成器包)→ gen/*.mbt。 生成器零业务词硬编码,新方言/新词表 = 新数据,不是新生成器代码; 生成物与字表改动同笔提交,黄金门(再生逐字节对照)守门。

    #API 总览

    入口作用
    @core.eval_query(query_bytes, store)查询一行入口:EvalOut 三臂——解集(EvalOk)/ ASK 布尔(EvalBool)/ CONSTRUCT 图(EvalGraph)
    @core.eval_update(bytes, store)Update 解析门(UpdateOk / UpdateFail)
    @core.dump_op(op, indent)代数树 dump(调试与 golden 钉)
    @core.Store内存三元组账:add / add_typed / add_graph(_typed) / remove_* / clear_default / drop_graph
    @core.StoreTriple账面行:s / p / o / lang / datatype / kind 六槽
    @bridge.store_from_trig(bytes, base?)TriG 字节 → (Store, warnings)(moonttl 真解析器装载)

    #错误面

    解析与求值皆裁决值风格(不 raise):EvalOut::EvalFail(span, reason) 与 UpdateOut::UpdateFail(span, reason) 携精确字节偏移;分簇解析中间面 ClauseVerdict::Reject(span, reason) / QueryBuild::QBFail / ExprVerdict::ExprFail 同形。词法层 SparqlEvent::Fail(span, reason) 供适配层与诊断消费。全部 pub(all),可按变体 match 处理。

    #设计边界

    • 账面词求值:v0 口径 = plain-string 三元组账(账面词精确文本匹配, IRI 去尖括号、字面量去引号反转义);表达式求值宽容双轨(两侧皆可数 则数值比,否则文本比)。全强型值空间(数值型阶梯/XSD 逐型比较) 候升不排期。
    • Update 求值面后置:解析门已立(55 案全判),数据集算子执行 (INSERT/DELETE 语义)候裁另案。
    • 优化器后置:代数直出直算,代数重写(连接序/过滤下推)候裁。
    • 方言键控:1.2 新词缺省关(since 字表裁剪);scalar_only 类 方言开关走词表数据,不动生成器。
    • wasm 档:全套件并发撞 moonrun 堆帽(既有账,亲缘判定 target = native);库本体不含并发面,消费方 wasm 面自证。

    定位、管线与锚点的完整说明见 spec.md;纪律红线见 const.md; 路线见 todo.md,版本沿革见 CHANGELOG.md。

    #测试与验证

    moon test --target native

    运行时输出各测试面的计数行(下表实测于 2026-11-03,native 合计 106 / 106):

    面读数
    W3C 套件门(sparql10 / sparql11 / sparql12 三代,bucket+pin,deferred 146 逐条举证)0 failed,桶闭包钉死
    桥装审计线(bridge 真解析器 × 官方查询 × 官方结果件,十门)475 / 475
    语法门(syntax-query 95 .rq,26 负例)25 / 25 桶清零
    单元与端到端电池(解析 / 代数 / 求值 / Update 解析门)106 / 106

    测试语料(W3C rdf-tests):本地卷 .rdf-tests/(gitignore 不入仓), 双源 = Jena 镜像 rdf-tests-cg(sparql10 / sparql11 / sparql11-update)
    • w3c/rdf-tests 上游(sparql12 三元组项族)。CI 按 commit SHA 钉死取件 (sparse clone,见 .github/workflows/test.yaml);本地重建同法。语料 文件按 W3C Test Suite License / 3-clause BSD 双许可分发,原始文件 未修改,仅本地与 CI 取件消费、不再分发。

    #许可证

    本项目采用 Apache License 2.0(见 LICENSE)。

    Powered by MoonBit

    Site sourceReport issueModulesSkillsBuild queueStatistics

    © 2026 mooncakes.io