PurRDF 1.0:一个 RDF 引擎,一套行为,贯通各语言
PurRDF 1.0.0 已发布。这是一套 RDF 1.2 工具包:以从零编写的 Rust 核心实现一次,再原样移植到 Python、WebAssembly/JavaScript 与 C。
它所针对的问题,是 RDF 工具在两个维度上的割裂。跨语言方面,每个生态都有自己的解析器,各带其缺陷与各自实现的规范子集;于是一张图从 Rust 服务流向 Python 管线、再流向浏览器,其含义已在无声中被改动三次。跨时间方面,RDF 1.2——三元组项、具体化节点、基础方向字面量——是该标准的当前修订版,而既有库几乎无一支持。
因此,引擎只实现一次。每个已发布的 crate 都可编译到 wasm32-unknown-unknown;整个工作区亦刻意不设任何 Cargo feature flag:承载数据者,不应有可选行为。
在实践中我认为最有用的,是它从架构中移除了什么。通常迫使人们在三元组存储旁常驻一个 PostgreSQL 实例的三件事——带排序的全文检索、空间谓词与向量相似度——都在 PurRDF 内部作答:同一进程、同一数据集、同一条 SPARQL 查询,无需第二个数据库,也无需同步作业。全文排序采用精确定点 BM25,该 crate 内不含任何浮点运算。GeoSPARQL 1.1 将几何读作精确有理数,并在精确的 DE-9IM 上判定每一种拓扑关系,不依赖 GEOS 与 PROJ。最近邻检索是精确检索,而非近似。三者皆为确定性的:在服务器上与在浏览器标签页中,返回相同的行、相同的顺序——这是 Postgres 技术栈跨机器时并不给出的保证。
此外还包括:九种语法的原生 codec、RDFC-1.0 规范化、支持完整 Update 的 SPARQL 1.1/1.2 及受管控执行(宁可返回经认证的部分结果,也不给出错误答案)、SHACL Core 以及 SHACL-SPARQL 与 SHACL-AF、ShEx 2.1、自 RDFS、OWL 2 RL 直至 OWL 2 直接语义 tableau 的蕴涵机制——每次闭包都附带推理报告,使不完整的答案绝不会被当作完整答案交付——以及 GTS 单文件图传输。
两点实话。其一,1.0.0 并非功能版本:它就是 0.13.0 的代码树,经由 Trusted Publishing 在全部 21 个 crate 上重新发布。改变的是承诺本身。自 1.0.0 起,破坏性变更递增主版本号,次版本号只做增量添加,修订号只修缺陷。其二,C ABI 独立编号并仍处于 0.x;工作区的 1.0.0 对其不作任何承诺。GTS 覆盖 Rust、命令行工具、Python 与 C,但 WebAssembly 包并不暴露它。
每个引擎都由其官方测试套件把关,并已冻结在仓库内:shexTest 校验用例 1,105 / 1,105、W3C SHACL 129 / 129、SPARQL 求值用例 862 项通过、语法往返 264 / 264,以及冻结的跨语言 GTS 向量。
若想不装任何东西就试用 RDF 1.2,可用浏览器 playground;若想按图索骥,则有配套手册。代码仓库已开放:PurRDF。
欢迎在 X 与 r/semanticweb 参与讨论。
永久链接: https://patrickaudley.com/posts/purrdf-1-0.html · Markdown