ShEx
purrdf-shex(重新导出为 purrdf::shex)是 PurRDF 的原生 Shape Expressions Language 2.1 引擎:包含模式层与形状映射验证器,纯 Rust 实现且 wasm-clean。
模式:ShExC 与 ShExJ
- ShExC(紧凑语法,规范 §6)——一个手写的词法分析器与递归下降解析器,覆盖完整语法:指令、
start、AND/OR/NOT形状代数、节点约束与刻面表、带词干/范围/排除项的值集、具备所有基数形式的三元组表达式、$/&标签与包含、^逆向、注解以及%…{ … %}语义动作,并经由purrdf-iri依据BASE解析相对 IRI。 - ShExJ(JSON 线格式,规范附录 A)——严格且可往返(转换)的读取器与写出器,与 shexTest 的基准事实一致。
- 结构检查(规范 §5.7)——悬空引用、标签冲突、仅由引用构成的环,以及否定分层要求。
#![allow(unused)]
fn main() {
use purrdf::shex::{check_structure, parse_shexc, parse_shexj, to_shexj};
let schema = parse_shexc(
"PREFIX ex: <http://example.org/>\n\
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n\
ex:S { ex:p xsd:integer? }",
None,
).expect("well-formed");
check_structure(&schema).expect("well-formed");
let json = to_shexj(&schema);
let restored = parse_shexj(&json, None).expect("well-formed");
check_structure(&restored).expect("well-formed");
assert_eq!(restored, schema);
}
模式解析通过带类型的 ShexError 报告语法错误;check_structure 则报告 StructureError 违规项列表。不存在接受格式错误模式的宽松模式。
使用形状映射进行验证
验证(规范 §5.2–§5.5)是在冻结的 purrdf-core 数据集 IR 上、在驻留的 TermId 空间中进行的固定形状映射验证:由调用方提供 (node, shape) 关联,验证器为每个关联判定是否符合。它覆盖节点约束(节点类型、带词法有效性检查的数据类型、字符串/数值刻面、带词干与排除项的值集)、带 EachOf/OneOf 划分与分组基数的 EXTRA/CLOSED 三元组表达式匹配、逆向约束、基于类型指派的递归,以及一个 EXTERNAL 解析器钩子。
从 Python 调用:
from purrdf import shex
results = shex.validate(my_schema_shexc, my_data_ttl,
[("https://example.org/alice", "https://example.org/PersonShape")])
print(results[0]["conformant"])
带日期的 XPath 正则法则
字符串分面(facet)中的 PATTERN 运行在兼容正则表达式之上,除非调用方按名称选择一种带日期的原生 XPath 法则:xpath-2.0-2010-12-14(XPath and XQuery Functions and Operators 2.0,第二版)或 xpath-3.1-2017-03-21(Functions and Operators 3.1)。两者都接受反向引用;只有 3.1 接受非捕获组和 q 标志。
| 宿主 | 写法 |
|---|---|
| Rust | validate_with_xpath 与 validate_shape_map_with_xpath,其中 Profile 与 Limits 来自 purrdf_core::xsd_regex::xpath;XPathValidator::new(&schema) 用于对同一固定映射的重复验证 |
| CLI | shex 上的 --xpath-regex <NAME> |
| Python | shex.validate 上的 xpath_regex= |
results = shex.validate(my_schema_shexc, my_data_ttl,
[("https://example.org/alice", "https://example.org/PersonShape")],
xpath_regex="xpath-3.1-2017-03-21")
名称须精确匹配,因此 xpath-3.1 会被拒绝,并附上可接受名称的列表。未作选择时,validate、validate_with 与 validate_shape_map 完全保持兼容行为。ShExJ 按原样传递模式与标志文本。ShExC 保留其自身的具体语法转义文法,其中没有 \1,因此反向引用要用 ShExJ 书写。
所选法则未定义的模式或标志会使其分面失败,与任何无效模式一样。所选法则还在有限的资源上限下运行,其中包括 64 KiB 的模式源文本。超出任一上限会以该资源的 xpath-* 代码中止整个形状映射。否定、备选分支以及先前已判定的条目都无法把该拒绝变成不符合的条目或部分结果映射。
一致性
该引擎依据随库固化的官方 shexTest 套件把关,固定在标签 v2.1.0(vectors/shexTest/):完整的 validation/ 清单、schemas/ 中的 ShExC/ShExJ 配对与往返(转换),以及负例语法与负例结构套件。撰写时,验证清单在尝试的用例中通过 1,105/1,105,预期失败为零,特性跳过列表为空(导入与语义动作均包括在内);实时记分板见 docs/CONFORMANCE.md。
按套件惯例,所报告的一致性是逻辑层面的(通过/失败对等);结果结构的一致性在上游仍属实验性。
SHACL 还是 ShEx?
PurRDF 在同一个 IR 上原生实现了两者,因此选择权在使用者,而不在工具包:SHACL 适合约束报告(带严重级别的违规、SARIF 输出)以及 SHACL-SPARQL 这一逃生口;ShEx 适合在显式形状映射上作出类似模式的符合性判定。