fix:gen T4-2 讫:rdfs_bridge 桥体+三腿差分门全绿(11 对拍例+5 拒形钉)——sidecar 宾位契约勘定(slot_match 律:词面元数据随宾槽,s/p 位裸绑) Co-Authored-By: Claude Code noreply@anthropic.com
fix:gen T4-2 讫:rdfs_bridge 桥体+三腿差分门全绿(11 对拍例+5 拒形钉)——sidecar 宾位契约勘定(slot_match 律:词面元数据随宾槽,s/p 位裸绑)
Co-Authored-By: Claude Code noreply@anthropic.com
thy1016/sparql 是 SPARQL 查询引擎(MoonBit):文本 → 词法 → 事件流 → AST → 代数 → 求值,千里问图,一查询达。解析与求值双段齐备:SELECT / ASK / CONSTRUCT 三查询形 + 聚合 / 子查询 / 属性路径 / SPARQL 1.2 三元组项,判定即门 = W3C SPARQL 测试套件。
thy1016/sparql
语法参照 Apache Jena ARQ 的 sparql_12.jj(jena-arq/Grammar),分层思想参照 Oxigraph 的 spargebra / sparopt 拆分——思想与形态致敬,线全自研:词法状态机、 分簇解析、AST、代数转换与求值全部按本仓生成链纪律自建。
sparql_12.jj
domain/token_fsm.toml
eval_query
?
*
^
!
<< s p o >>
--ltr
since
eval_update
bridge
确保环境中已安装 MoonBit 工具链,然后在模块根目录:
moon add thy1016/sparql
(模块源码正式地址:gitlink https://gitlink.org.cn/thy7/mbt.sparql; 工作区多模块场景可直接以本地树路径引用。)
在用到它的包的 moon.pkg import 块中添加 "thy1016/sparql/core", 代码内以 @core 前缀使用;TriG 装载桥另加 "thy1016/sparql/bridge"。
moon.pkg
import
"thy1016/sparql/core"
@core
"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。
Store::add
add_typed(s, p, o, lang, datatype, kind)
kind = "iri"
"bnode"
TriG 文档装载走桥(真解析器,Turtle 系全语法面):
let (store, warnings) = @bridge.store_from_trig(trig_bytes)
完整可运行示例见 cmd/demo(装店六账 → 四查询全链,终行 DEMO:PASS):
cmd/demo
DEMO:PASS
moon run cmd/demo --target native
thy1016/sparql/core
thy1016/sparql/gen
thy1016/sparql/bridge
store_from_trig
domain/
生成链:domain/*.toml → kindgen(主仓生成器包)→ gen/*.mbt。 生成器零业务词硬编码,新方言/新词表 = 新数据,不是新生成器代码; 生成物与字表改动同笔提交,黄金门(再生逐字节对照)守门。
domain/*.toml
kindgen
gen/*.mbt
@core.eval_query(query_bytes, store)
EvalOut
EvalOk
EvalBool
EvalGraph
@core.eval_update(bytes, store)
UpdateOk
UpdateFail
@core.dump_op(op, indent)
@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?)
(Store, warnings)
解析与求值皆裁决值风格(不 raise):EvalOut::EvalFail(span, reason) 与 UpdateOut::UpdateFail(span, reason) 携精确字节偏移;分簇解析中间面 ClauseVerdict::Reject(span, reason) / QueryBuild::QBFail / ExprVerdict::ExprFail 同形。词法层 SparqlEvent::Fail(span, reason) 供适配层与诊断消费。全部 pub(all),可按变体 match 处理。
EvalOut::EvalFail(span, reason)
UpdateOut::UpdateFail(span, reason)
ClauseVerdict::Reject(span, reason)
QueryBuild::QBFail
ExprVerdict::ExprFail
SparqlEvent::Fail(span, reason)
pub(all)
match
scalar_only
定位、管线与锚点的完整说明见 spec.md;纪律红线见 const.md; 路线见 todo.md,版本沿革见 CHANGELOG.md。
spec.md
const.md
todo.md
CHANGELOG.md
moon test --target native
运行时输出各测试面的计数行(下表实测于 2026-11-03,native 合计 106 / 106):
测试语料(W3C rdf-tests):本地卷 .rdf-tests/(gitignore 不入仓), 双源 = Jena 镜像 rdf-tests-cg(sparql10 / sparql11 / sparql11-update)
.rdf-tests/
rdf-tests-cg
.github/workflows/test.yaml
本项目采用 Apache License 2.0(见 LICENSE)。
LICENSE
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
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),词法口径修正永不散落。eval_query一行入口直出解集。?*^!取反族)。<< s p o >>三元组项与 TRIPLE()/isTriple() 内建、 方向字面量(--ltr)、VERSION 1.2 词——按since字表键控,方言开关 裁剪不动词法表。eval_update对 SPARQL 1.1 Update 语法 (syntax-update-1/2,55 案全判);求值面后置(见设计边界)。bridge包 = moonttl 真解析器装载 TriG → 本仓 Store, 与官方查询 × 官方结果件逐门对拍(475 案 475 过)——第二来源异构 oracle,门装↔官方↔桥装三角互证。安装
确保环境中已安装 MoonBit 工具链,然后在模块根目录:
(模块源码正式地址:gitlink https://gitlink.org.cn/thy7/mbt.sparql; 工作区多模块场景可直接以本地树路径引用。)
在用到它的包的
moon.pkgimport块中添加"thy1016/sparql/core", 代码内以@core前缀使用;TriG 装载桥另加"thy1016/sparql/bridge"。快速上手
装店(内存三元组账)→ 一行查询 → 解集:
数据纪律:
Store::add缺省宾语 = 字面量;IRI 宾语用add_typed(s, p, o, lang, datatype, kind)传kind = "iri"(blank node 同理传"bnode");带型/带语言标签字面量传 lang / datatype。TriG 文档装载走桥(真解析器,Turtle 系全语法面):
完整可运行示例见
cmd/demo(装店六账 → 四查询全链,终行DEMO:PASS):包结构
thy1016/sparql/corethy1016/sparql/genthy1016/sparql/bridgestore_from_trig)domain/cmd/demoDEMO:PASS)生成链:
domain/*.toml→kindgen(主仓生成器包)→gen/*.mbt。 生成器零业务词硬编码,新方言/新词表 = 新数据,不是新生成器代码; 生成物与字表改动同笔提交,黄金门(再生逐字节对照)守门。API 总览
@core.eval_query(query_bytes, store)EvalOut三臂——解集(EvalOk)/ ASK 布尔(EvalBool)/ CONSTRUCT 图(EvalGraph)@core.eval_update(bytes, store)UpdateOk/UpdateFail)@core.dump_op(op, indent)@core.Storeadd/add_typed/add_graph(_typed)/remove_*/clear_default/drop_graph@core.StoreTriples / p / o / lang / datatype / kind六槽@bridge.store_from_trig(bytes, base?)(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处理。设计边界
since字表裁剪);scalar_only类 方言开关走词表数据,不动生成器。定位、管线与锚点的完整说明见
spec.md;纪律红线见const.md; 路线见todo.md,版本沿革见CHANGELOG.md。测试与验证
运行时输出各测试面的计数行(下表实测于 2026-11-03,native 合计 106 / 106):
测试语料(W3C rdf-tests):本地卷
.rdf-tests/(gitignore 不入仓), 双源 = Jena 镜像rdf-tests-cg(sparql10 / sparql11 / sparql11-update).github/workflows/test.yaml);本地重建同法。语料 文件按 W3C Test Suite License / 3-clause BSD 双许可分发,原始文件 未修改,仅本地与 CI 取件消费、不再分发。许可证
本项目采用 Apache License 2.0(见
LICENSE)。