诊断代码参考
以 RdfDiagnostic 值报告的失败,除 severity、message、detail 和 location 之外,还携带稳定的、机器可读的 code。代码就是契约:测试、SARIF 生成器、CLI、Python ValueError 文本以及下游的匹配器都以它为键,而 message 是可能改变措辞的自由文本。本页按族列出这些代码,以及每个代码所指的失败和调用方可以采取的措施。这个集合是从源码树中的构造位置枚举出来的,而不是凭记忆写成的;如果看到的某个代码不在此列,以源码为准,本页已过时。
代码采用 kebab-case,以拥有它们的族作为前缀。它们永远不会被翻译,调用方应比较整个字符串,而不是前缀。
RdfDiagnostic::presentation() 可选地提供稳定的消息标识、具名且带类型的参数,以及结构化详情。通过 message_id() 选择展示模板:一个诊断代码可以涵盖多个模板。直接读取参数值,而不是从英文文本中提取。to_json() 输出带版本的机器记录,其中逻辑 64 位定位信息及带类型的整数以精确的十进制字符串表示。SARIF 在 properties.diagnosticRecord 中保留该记录;C 调用方使用借用的 purrdf_error_presentation_json 访问器。
iri-*——IRI 解析与基准解析(purrdf-iri)
IriError::diagnostic_code 是整个工作区中这些字符串的唯一所有者;每个编解码器、SPARQL、ShEx 与 SHACL 都把 IRI 失败交由它处理。与基准相关的代码区分无效的基准、缺少基准,以及语法禁止相对引用这三种情况;它们各有不同的补救办法。
| 代码 | 含义 | 补救办法 |
|---|---|---|
iri-empty | 在要求非空 IRI/URI 的地方,字符串为空。 | 提供一个非空的 IRI。 |
iri-missing-scheme | 该字符串没有 scheme(方案),因此不可能是绝对 IRI。 | 以带有 scheme 的绝对形式书写 IRI。 |
iri-bad-scheme | scheme 格式错误(它必须以字母开头,且只包含字母、数字、+、- 与 .)。 | 更正 scheme。 |
iri-bad-percent-encoding | 所报告字节偏移处的 % 后面没有跟两个十六进制数字。 | 对 % 本身进行百分号编码,或补全转义。 |
iri-disallowed-char | 所报告的字节偏移处出现了 IRI 语法不允许的字符。 | 对该字符进行百分号编码或删除它。 |
iri-bad-authority | authority 组件(//host:port)格式错误。 | 更正主机或端口。 |
iri-non-absolute-base | 为解析提供的基准 IRI 本身不是绝对的。 | 提供一个带有 scheme 的基准 IRI,例如 http://example.org/dir/。 |
iri-relative-no-base | 遇到一个相对 IRI 引用,但作用域内没有基准:没有文档内指令,没有调用方提供的基准,也没有获取 IRI。 | 为文档添加基准(Turtle 族语法中用 @base/BASE,RDF/XML 中用 xml:base,JSON-LD 中用 @context.@base),或向 API 传入一个基准 IRI。 |
iri-not-absolute-by-grammar | 该引用不是绝对的,而该语法根本不允许相对引用(N-Triples、N-Quads),因此任何基准都不可能适用。 | 以绝对形式书写 IRI;提供基准无济于事。 |
native-codec-*——文本与 XML 编解码器(purrdf-rdf)
| 代码 | 含义 | 补救办法 |
|---|---|---|
native-codec-parse | 编解码器(Turtle 族、RDF/XML、TriX、HexTuples)无法解析输入;位置信息指明行与列。项嵌套超过解析器深度上限,也以该代码报告。 | 在所报告的位置修正文档。 |
native-codec-limit | 累计的源字节/行计数器,或明确设有上限的局部列计数器,无法表示下一个位置。 | 将源拆分为分别寻址的文档,或缩短过长的行。 |
native-codec-utf8 | 输入字节不是有效的 UTF-8。 | 把文档重新编码为 UTF-8。 |
native-codec-panic | 编解码器在解析时发生 panic,被 panic 防护捕获。这是 PurRDF 的缺陷,绝不是输入的问题。 | 连同触发它的输入一起报告。 |
native-codec-read | 通过流式读取器读取 RDF 源时,因 IO 错误而失败。 | 检查源流或源文件。 |
native-codec-write | 写出序列化输出时,因 IO 错误而失败。 | 检查目标位置。 |
native-codec-serialize | 目标格式无法表示该数据集——例如单图格式中的命名图——或写出器失败。 | 选择一种能承载该构造的格式,或通过损失台账通道进行序列化。 |
native-codec-replay | 把已解析的数据集重放到事件接收器时失败,因为接收器返回了错误。 | 接收器自身的错误包含在消息中。 |
native-codec-unsupported-format | 该媒体类型或格式标识符不对应任何编解码器。 | 使用受支持的媒体类型或格式 id 之一。 |
native-codec-datatype-not-iri | 字面量的数据类型项不是 IRI。 | 为该字面量指定一个 IRI 数据类型。 |
native-codec-direction-without-language | 在一个没有语言标签的字面量上给出了基础方向(base direction)。 | 添加语言标签,或去掉方向。 |
native-codec-invalid-direction | 给出的字面量基础方向既不是 ltr 也不是 rtl。 | 使用 ltr 或 rtl。 |
native-codec-iri-missing-value | 某个 IRI 项事件携带了空值。 | 提供该 IRI。 |
native-codec-missing-reifier-binding | 某个三元组项(triple term)引用了一个没有绑定的具体化节点(reifier)。 | 在引用具体化节点之前先绑定它。 |
native-codec-predicate-not-iri | 只允许 IRI 的位置(谓词)上的项不是 IRI。 | 使用 IRI 谓词。 |
native-codec-reifier-not-triple | 具体化节点绑定的不是三元组项。 | 把具体化节点绑定到一个三元组项。 |
native-codec-term-out-of-range | 事件流中的某个项 id 超出了该流所引入的范围。 | 产生这些事件的流不一致;请重新生成该流。 |
native-codec-unbound-triple-term | 某个三元组项既未给出其组成部分,也未指明具体化节点。 | 为该三元组项给出其组成部分或具体化节点。 |
最后九个代码出现在编解码器通道消费项事件而非文本时——即某个 GTS 图正在经由编解码器接口被解析——并与下文的 gts-* 与 rdf-ir-* 代码相对应。
native-jsonld-* 与 jsonld-*——JSON-LD 与 YAML-LD
| 代码 | 含义 | 补救办法 |
|---|---|---|
native-jsonld-decode | JSON-LD 或 YAML-LD 输入在表层语法上格式错误:无效的 JSON/YAML、编码错误,或超出了物化载体的字节预算。 | 修正表层语法或缩减文档。 |
native-jsonld-parse | 输入是良构的 JSON-LD,但无法映射到 RDF。 | 更正 JSON-LD 结构。 |
jsonld-json-input | 严格的 JSON 读取器拒绝了该输入,例如出现重复的对象成员。 | 删除重复项或更正 JSON。 |
jsonld-context-invalid | 某个上下文文档,或严格的带版本选项文档,无效。 | 更正上下文文档或选项文档。 |
jsonld-context-limit | 超出了某项上下文处理上限:已加载字节数、工作计数、定义复杂度,或离线上下文注册表的大小。 | 缩减上下文,或提高选项文档所声明的上限。 |
jsonld-derived-invalid | 确定性的数据集 IRI derived 模式无法推导出前缀(无效的 IRI,或 null 映射)。 | 更正用于推导前缀的那个 IRI。 |
jsonld-derived-limit | 超出了派生上下文的工作量或字节上限。 | 缩减数据集的 IRI 词汇,或提高所声明的上限。 |
jsonld-options-unused | 为一种既非 JSON-LD 也非 YAML-LD 的格式提供了 JSON-LD 序列化选项。 | 去掉这些选项,或序列化为 JSON-LD/YAML-LD。 |
cdt-*——SEP-0009 复合字面量
cdt:List 或 cdt:Map 的词法形式表示的是外层文档作用域中的空节点,因此一个无法解析的词法形式会使该作用域处于未定义状态,于是整个文档被拒绝,而不是把该字面量作为不透明值保留。
| 代码 | 含义 | 补救办法 |
|---|---|---|
cdt-literal-malformed | 复合字面量的词法形式无法解析。 | 更正该字面量。 |
cdt-literal-scan-disagreement | 有界词法扫描器与完整解析器对该字面量的判断不一致。 | 这是 PurRDF 的缺陷;请连同该字面量一起报告。 |
rdf-ir-*——数据集结构(purrdf-core 冻结与 GTS 导入)
RdfDatasetBuilder::freeze() 会验证它即将冻结的数据集的结构;若某个容器中的项不构成良构的数据集,GTS 导入接收器也报告同一族代码。
| 代码 | 含义 | 补救办法 |
|---|---|---|
rdf-ir-term-out-of-range | 某个四元组引用了构建器从未驻留过的 TermId。 | 在推入该四元组之前先驻留该项。 |
rdf-ir-predicate-not-iri | 四元组的谓词不是 IRI。 | 使用 IRI 谓词。 |
rdf-ir-literal-subject | 字面量出现在主语位置。 | RDF 不允许字面量作主语;请重新组织该陈述。 |
rdf-ir-triple-subject | 三元组项出现在主语位置。 | RDF 1.2 只允许三元组项出现在宾语位置;请使用具体化节点。 |
rdf-ir-graph-name-invalid | 图名是字面量或三元组项。 | 图名必须是 IRI 或空节点。 |
rdf-ir-graph-already-exists | 在记住空图的模式下,创建图时发现该图已经存在。 | 选择一个新的图名,或使用 SILENT 抑制此语义错误。 |
rdf-ir-reifier-not-triple | 具体化节点绑定指向的不是三元组项。 | 把具体化节点绑定到一个三元组项。 |
rdf-ir-triple-cycle | 某个三元组项直接或通过嵌套包含了它自身。 | 消除该环。 |
rdf-ir-triple-nesting-limit | 三元组项的嵌套超出了构建器的深度上限。 | 将嵌套展平。 |
rdf-ir-dangling-term-ref | 某个 GTS 角色引用了一个没有任何项事件引入的项 id。 | 该容器不一致;请重新生成它。 |
rdf-ir-gts-fold-diagnostic | GTS 折叠报告了一条诊断,经由导入呈现出来。 | 折叠诊断自身的代码与详情包含在消息中。 |
rdf-ir-iri-missing-value | 某个导入的 IRI 项的值为空。 | 提供该 IRI。 |
rdf-ir-literal-datatype-not-iri | 某个导入的字面量的数据类型解析为非 IRI。 | 为该字面量指定一个 IRI 数据类型。 |
rdf-ir-missing-reifier-binding | 某个导入的三元组项引用了一个没有记录绑定的具体化节点。 | 在容器中绑定该具体化节点。 |
rdf-ir-term-nesting-limit | 导入的三元组项嵌套超出了深度上限。 | 将嵌套展平。 |
rdf-ir-unbound-triple-term | 某个导入的三元组项既未给出其组成部分,也未指明具体化节点。 | 为该三元组项给出其组成部分或具体化节点。 |
gts-* 与 rdf-*——GTS 图的解析、验证与写出
| 代码 | 含义 | 补救办法 |
|---|---|---|
gts-term-out-of-range | 某个 GTS 项 id 超出了该图的范围。 | 该容器不一致;请重新生成它。 |
gts-iri-missing-value | 某个 GTS IRI 项的值为空。 | 提供该 IRI。 |
gts-predicate-not-iri | 某个 GTS 谓词项不是 IRI。 | 使用 IRI 谓词。 |
gts-literal-datatype-not-iri | 某个 GTS 字面量的数据类型未解析为 IRI。 | 为该字面量指定一个 IRI 数据类型。 |
gts-direction-without-language | 某个 GTS 字面量带有基础方向,却没有语言标签。 | 添加语言标签,或去掉方向。 |
gts-invalid-direction | 某个 GTS 字面量的基础方向既不是 ltr 也不是 rtl。 | 使用 ltr 或 rtl。 |
gts-missing-reifier-binding | 某个 GTS 三元组项引用了一个该图未绑定的具体化节点。 | 在容器中绑定该具体化节点。 |
gts-unbound-triple-term | 某个 GTS 三元组项既未给出其自身的组成部分,也未指明具体化节点。 | 为该三元组项给出其组成部分或具体化节点。 |
gts-self-reaching-term | 某个 GTS 项经由其自身解析,因此对其组成部分的任何游走都无法终止。 | 消除该环。 |
gts-term-nesting-limit | GTS 项嵌套超出了深度上限。 | 将嵌套展平。 |
gts-fold-diagnostic | GTS 折叠报告了一条或多条诊断。 | 检查详情中列出的折叠诊断。 |
gts-verify-digest-inclusion | 内容寻址的 RDF 项未被包含在已验证的链中。 | 该容器的链没有覆盖其内容;不要信任它。 |
gts-verify-signature | COSE 签名验证失败。 | 检查签名密钥与容器的完整性。 |
gts-writer-codec | GTS 写出器的编解码器在写出时报告了错误。 | 编解码器自身的错误包含在消息中。 |
rdf-graph-name-not-node | 在构建 GTS 图时,某个命名图的名称不是 IRI 或空节点。 | 使用 IRI 或空节点作为图名。 |
rdf-reifier-not-node | 在构建 GTS 图时,某个 RDF 1.2 具体化节点不是 IRI 或空节点。 | 使用 IRI 或空节点作为具体化节点。 |
rdf-term-nesting-limit | 在构建 GTS 图时,RDF 项嵌套超出了深度上限。 | 将嵌套展平。 |
native-sparql-*——SPARQL 引擎边界(purrdf-sparql-eval)
| 代码 | 含义 | 补救办法 |
|---|---|---|
native-sparql-query-parse | 查询文本无法按 SPARQL 1.1/1.2 语法解析(包括格式错误的 VERSION 声明;格式正确但无法识别的版本属于 native-sparql-unsupported)。 | 在所报告的位置修正查询。 |
native-sparql-update-parse | 更新请求无法解析。 | 在所报告的位置修正更新。 |
native-sparql-query-explain | 在 --explain 下求值失败;求值器的错误包含在消息中。 | 处理底层的求值错误。 |
native-sparql-query-eval | 查询求值失败,且没有更具体的代码对该错误分类;求值器的错误包含在消息中。 | 处理底层的求值错误。 |
native-sparql-internal | 求值器的不变量遭到破坏。执行无法产生有效答案。 | 报告此失败时请附上查询和输入;该问题需要修复引擎。 |
native-sparql-composite-bound | 构造复合数据类型值时超出了元素数量或词法字节的资源上限。 | 减小所构造的值。 |
native-sparql-float-environment | 调用线程的浮点环境无法保持距离运算规定的 IEEE-754 结果。 | 在浮点环境受支持的线程上求值。 |
native-sparql-function-operational | 宿主函数或关系在执行期间失败:返回不透明错误、捕获到 panic、达到资源上限,或收到无效的协议响应。 | 修复被调用方或调整资源上限;此类失败无法得出验证结论。 |
native-sparql-source-read | 存储操作拒绝了正向/反向查找或完整的行迭代消费。这是致命错误,即使在 SERVICE SILENT 内也如此;不会发布部分答案。 | 修复源或调整其明确的资源限制,然后再重试。 |
native-sparql-workspace-unpriced | 某项执行操作没有经过准入的工作内存所有者,或调用原始求值器入口时未持有所需的预留。 | 使用携带视图所提供的自有工作内存准入的引擎入口,并补全宿主或提供方所需的工作内存证明。 |
native-sparql-workspace-bound-overflow | 经过认证的工作内存上界计算超出了 u64。 | 降低查询的中间结果基数或模式数量。 |
native-sparql-update-eval | 更新求值失败,且没有更具体的代码对该错误分类;求值器的错误包含在消息中。 | 处理底层的求值错误。 |
native-sparql-algebra | 查询的代数在求值之前被拒绝:Query::validate 拒绝了它,或者某个预备好的计划需要针对本次求值提供的注册表重新规划。 | 按消息所说修正查询,或在执行之前预备改动后的代数。 |
native-sparql-construct | 类型化的图构建收到的查询不是 CONSTRUCT。 | 用 CONSTRUCT 查询构建图。 |
native-sparql-execution-parameter | 预备好的执行收到了它未声明的参数名或槽位。 | 只绑定该执行所声明的参数;消息中列出了它们。 |
native-sparql-relation-incomplete | 某个属性函数关系只用其部分数据作答,而所在的入口没有用于标注这一不完整应答的证据槽(不受管控的查询通道,以及 UPDATE)。消息会指名该关系及其自身给出的原因。 | 在受 governor 管控的入口上运行查询——其回执携带该关系的见证——或等待该关系完整。 |
native-sparql-property-function | 属性函数(property function)扩展点拒绝了该查询:某个已声明命名空间下的谓词没有注册,某个调用点的元数与该关系不匹配,没有任何全序能用于某条链,或者一个预备好的计划正在一个与其预备时不同的注册表下求值。 | 注册该关系、更正元数,或在同一个注册表下预备并求值。 |
native-sparql-aggregate-function | 自定义聚合扩展点拒绝了该查询:某个 AGG(<iri>, …) 没有指向任何已注册的聚合,或者一个预备好的计划正在另一个聚合注册表下求值。 | 注册该聚合,或在同一个注册表下预备并求值。 |
native-sparql-custom-function | 某个函数或聚合 IRI 没有解析到任何已注册的自定义函数、原生函数或 XSD 构造函数。 | 在该 IRI 下注册函数,或使用原生函数。 |
native-sparql-quoted-triple-term-variable | 在基本图模式或属性路径中,某个变量占据了引用三元组项的一个组成部分;结构化的三元组项匹配不在支持范围之内。 | 把三元组项作为整体绑定,或通过具体化节点接口匹配其组成部分。 |
native-sparql-heldin-unconfigured | 调用 heldIn 时没有调用方提供的 standpoint(立场)谓词配置。 | 在使用 heldIn 之前先配置 standpoint 谓词。 |
native-sparql-evaluation-stack-exhausted | 请求的嵌套深度超出了求值它的线程栈所能容纳的范围:在递归遍历开始之前,求值器会用剩余的栈空间衡量计划的整体高度(关联替换在其所做副本的每一层也会检查),并在耗尽之前拒绝,而不是让进程中止或让 wasm 实例陷入 trap。解析器已接受该请求,在更大的栈上同一请求可以得到应答。 | 在以更大的栈创建的原生线程上求值,或减少请求的嵌套深度。在 wasm 中,两条通道运行在大小相同的栈上——异步作业的栈区域与模块自身的影子栈完全一样大——因此在那里的补救办法是减少嵌套深度,消息也不会给出其他办法。 |
native-sparql-unsupported | 请求本身是良构的,但使用了本引擎拒绝按原样求值的内容——例如没有任何解为其指明端点的 SERVICE ?e、(不写 SILENT 时)绑定到字面量的 ?e,或无法识别的 VERSION。消息会指出具体是什么,并在可行时给出改写方式。Cloudflare 适配器以 400 应答。 | 按消息所述改写请求。 |
native-sparql-host-stack-exhausted | 仅限 wasm:请求的嵌套深度超出了 JavaScript 引擎自身调用栈所能容纳的范围。PurRDF 为求值每个请求保留该栈中固定的 640 KiB 预算——图模式最多嵌套 284 层,整棵树最多 2 048 层外加每个嵌套组八层,表达式与路径最多 2 304 层——而 V8 为同步通道和异步作业分配的栈相同,因此超出预算的计划会在运行之前被拒绝,两条通道一致。解析器在堆上分配的栈中处理嵌套;这些上限用于求值器准入。Cloudflare 适配器以 400 应答。 | 减少请求的嵌套深度。 |
native-sparql-bnode-mint-prefix | 选项中提供的空节点生成前缀无效。 | 提供一个有效的前缀。 |
native-sparql-service-denied | 已安装的 ServiceCatalog 未向请求指名的某个 SERVICE 端点授予所需的能力——该端点没有 profile,或其 profile 未授予所需的 query、network 或 credentials 能力——因此没有联系任何端点。在 SERVICE SILENT 下该子句则是连接的单位元,并记录为一次被静默的 denied 调用。Cloudflare 适配器以 403 应答。 | 在目录中为该端点授予该能力,或去掉 SERVICE。 |
native-sparql-service-host-denied | 宿主自己的服务解析器依据其自身策略拒绝了某个 SERVICE 请求,且没有指名任何目录能力——例如某个 JavaScript resolveService 应答了 { kind: "denied" }——因此没有联系任何端点。在 SERVICE SILENT 下该子句则是连接的单位元,并记录为一次被静默的 host-denied 调用。Cloudflare 适配器以 403 应答。 | 在宿主策略中允许该请求,或去掉 SERVICE。 |
native-sparql-service-failed | 已联系某个 SERVICE 端点,但它没有给出可用的应答:传输失败、HTTP 错误状态、重定向、解析器自身的超时,或无法解码的响应体。在 SERVICE SILENT 下该子句则是连接的单位元,并记录为一次被静默的调用。Cloudflare 适配器以 502 应答。 | 让该端点可达,或写作 SERVICE SILENT。 |
native-sparql-service-unconfigured | 没有任何远程查询来源能到达请求指名的某个 SERVICE 端点:要么没有配置来源,要么已配置的来源应答说它所持有的内容都到达不了该端点。在 SERVICE SILENT 下该子句则是连接的单位元,并记录为一次被静默的 unconfigured 调用。Cloudflare 适配器以 500 应答。 | 配置一个能到达该端点的来源,或去掉 SERVICE。 |
native-sparql-load-no-resolver | 请求了 LOAD <iri>,但没有提供 GraphResolver 宿主扩展点。LOAD SILENT 则会成功返回、不加载任何内容,并记录为一次被静默的 unconfigured 调用。 | 注入一个解析器,或去掉该 LOAD。 |
native-sparql-load-denied | 已安装的 ServiceCatalog 未向 LOAD 来源授予所需的能力(LoadError::Denied)——该来源或某次重定向指明的位置没有 profile,或其 profile 未授予所需的 network 或 credentials 能力——因此没有抓取任何内容。LOAD SILENT 则会成功返回、不加载任何内容,并记录为一次被静默的 denied 调用。Cloudflare 适配器以 403 应答。 | 在目录中为该来源授予缺少的能力,或去掉 LOAD。 |
native-sparql-load-host-denied | 宿主自己的 LOAD 解析器依据其自身策略拒绝了该来源,且没有指名任何目录能力(LoadError::HostDenied)——例如某个 JavaScript resolveLoad 应答了 { kind: "denied" }。LOAD SILENT 则会成功返回、不加载任何内容,并记录为一次被静默的 host-denied 调用。Cloudflare 适配器以 403 应答。 | 在宿主策略中允许该来源,或去掉 LOAD。 |
native-sparql-load-failed | GraphResolver 无法抓取该文档(LoadError::Transport)——例如 wasm 包的异步 resolveLoad 应答了 { kind: "transport" }、抓取超出了其目录 profile 的超时,或跟随了五次以上的重定向。LOAD SILENT 则会成功返回、不加载任何内容,并记录为一次被静默的调用。Cloudflare 适配器以 502 应答。 | 让该来源可达,或写作 LOAD SILENT。 |
native-sparql-load-decode | GraphResolver 抓取到了文档,但无法解析它(LoadError::Decode)——例如 wasm 包的异步 resolveLoad 交付的文档所用的媒体类型没有解析器可读,或者字节并不是所指名的语法。LOAD SILENT 则会成功返回、不加载任何内容,并记录为一次被静默的调用。Cloudflare 适配器以 502 应答。 | 以解析器能够解析的语法提供文档,或写作 LOAD SILENT。 |
native-sparql-load-stopped | 在等待 LOAD 期间,请求自身的停止信号(取消或截止时间)被触发(LoadError::Governed)。受 governor 管控的请求报告的是 governor 触发,而不是这个代码,无论是否写了 SILENT。 | 放宽截止时间,或不要取消该作业。 |
native-sparql-load-fault | GraphResolver 的处理函数发生故障(LoadError::Fault)——例如 wasm 包的异步 resolveLoad 抛出异常、返回被拒绝的 Promise、什么也没有应答,或指明了协议未定义的失败种类。消息携带处理函数自己的原话。LOAD SILENT 则会成功返回、不加载任何内容,并记录为一次被静默的 fault 调用。Cloudflare 适配器以经过清理的 500 应答,真正的原话以关联 id 写入其日志。 | 返回一份带媒体类型的文档、一个 Response、一个 Dataset、一次重定向或一个带类型的失败——绝不要抛出异常。 |
native-sparql-cancelled | wasm 异步通道:一个不受 governor 管控的操作被取消(其 AbortSignal 已触发)。受管控的操作则在其结果中报告这次触发。Cloudflare 适配器以 503 应答。 | 不要取消该操作。 |
native-sparql-deadline | wasm 异步通道:一个不受 governor 管控的操作超过了截止时间。Cloudflare 适配器以 503 应答。 | 放宽截止时间。 |
native-sparql-not-acceptable | wasm 异步通道:一个协商查询的结果——一个带有命名图的图——没有任何 Accept 请求头允许的格式能够承载。Cloudflare 适配器以 406 应答,并列出能够承载它的格式。 | 接受 TriG、N-Quads 或 JSON-LD。 |
native-sparql-update-in-flight | wasm 异步通道:同一数据集的另一个异步更新已在途,或者数据集在该更新运行期间被修改,因此该更新被拒绝,而不是针对一个它从未见过的状态求值(或提交在其之上)。Cloudflare 适配器以 409 应答。 | 等待第一个更新完成,再发送下一个。 |
native-sparql-host-fault | 失败的是宿主,而不是请求,也不是某个端点:某个 SERVICE 来源的处理函数在不带 SILENT 的子句中发生故障(EvalError::ServiceHostFault)——例如某个 wasm resolveService 抛出异常、返回被拒绝的 Promise、以不是应答的内容作答,或指明了协议未定义的失败种类(在 SERVICE SILENT 下该故障是连接的单位元,并在证据中记录为一次被静默的 fault);或者,在 wasm 异步通道上,某个作业的交付协议被破坏,或其栈帧覆写了其栈区域的金丝雀字。Cloudflare 适配器以经过清理的 500 应答,真正的原话以关联 id 写入其日志。 | 修正宿主的处理函数。 |
native-sparql-governor-ceiling | 协议边界:某个确定性的 governor 上限叫停了该操作——上限已达到,或规划器的估算已经超出。操作的结果携带这次触发;这是宿主据以应答它的 problem 的 code(Cloudflare 适配器的 422)。 | 提高上限,或收窄请求。 |
native-sparql-evaluation | 协议边界:操作的求值失败,且没有更具体的代码;这是宿主据以应答它的 problem 的 code。 | 处理底层的求值错误。 |
native-sparql-update-bad-destination | ADD/MOVE/COPY/LOAD 的目标是 NAMED 或 ALL;它必须是 DEFAULT 或单个命名的 GRAPH。 | 指定单个目标图。 |
native-sparql-update-graph-missing | UPDATE 使用默认的 RememberEmpty 图生命周期,但其命名的输入图不存在。CLEAR、DROP、ADD、COPY 和 MOVE 会在更改目标图之前拒绝该输入;SILENT 保持本次操作的状态不变。以自身为目标的 COPY 和 MOVE 无条件地不做任何操作。 | 创建或加载输入图,或使用 SILENT。 |
native-sparql-subst-iri | 某个替换值不是有效的 IRI。 | 提供一个有效的 IRI。 |
native-sparql-subst-triple-predicate | 某个被替换的引用三元组的谓词不是 IRI。 | 使用 IRI 谓词。 |
native-sparql-subst-literal-datatype | 被替换的字面量的数据类型不是 IRI。 | 使用 IRI 数据类型。 |
native-sparql-subst-langtag | 预绑定字面量的语言标签不是该词法 profile 所接受的。 | 提供一个良构的语言标签。 |
native-sparql-xpath-operational | 所选的带日期 XPath 法则发生了运行层面的失败,且未指明单一的 xpath-* 资源。查询被中止,不发布任何答案。 | 报告此失败时请附上查询和输入。 |
xpath-*——带日期的原生 XPath 正则表达式(purrdf-core)
这些代码仅在调用方为 SPARQL REGEX 与 REPLACE、SHACL sh:pattern 或 ShEx 模式分面选择了带日期的 XPath 法则(xpath-2.0-2010-12-14 或 xpath-3.1-2017-03-21)时出现。未作选择时,运行的是兼容正则表达式,这些代码都不会出现。purrdf_core::xsd_regex::xpath::Resource::code 是它们唯一的所有者。每个代码都指明一个 Resource:要么是 Limits 的某个上限扣留了它(Error::Resource,附带确切的需求量与上限),要么是宿主拒绝为它分配存储(Error::Allocation)。每一行都给出了 Limits::new() 设定的生产上限;上限为零即完全扣留该资源。
每个 xpath-* 代码都是运行层面的。它绝不是语法裁决,也绝不是不匹配:无效的标志(FORX0001)、无效的模式(FORX0002)、匹配空字符串的替换模式(FORX0003)或无效的替换文本(FORX0004)则是宿主普通的无效模式结果,即 SPARQL 表达式错误、SHACL 结果或失败的 ShEx 分面。拒绝会使整个操作失败。查询不发布任何答案,更新不改变任何内容,验证不写出任何报告;拒绝绝不会变成未绑定的值、false 的过滤结果或符合约束的图。C ABI 以 PURRDF_STATUS_REGEX_RESOURCE_ERROR(13)报告它。
这些上限适用于每个模式。匹配会计入实际执行的工作:字符比较、分支选择、状态复制、搜索位置推进和替换输出。匹配器的一步没有通用的纳秒耗时;每字节一步或一到三步的范围都不能描述所有搜索。
在按日期指定的法则下,输入不可能达到的有限最大次数不再产生不同的计数状态。兼容性法则中能匹配空串的主体仍保留有限次数边界和原有捕获优先级。贪婪的单字符连续段,包括选择分支和捕获链,只扫描一次,并按优先级保留可停位置。主体不能匹配空串的大计数重复在边界比较保持不变时可以复用相对状态,并在接近边界时恢复精确计数。
采用生产默认值的测试覆盖四 mebibyte 输入上的 ^[\s\S]{0,10000000}$、^[^\n]{0,10000000}$、^[^<>]{1,5000000}$、^[\p{L} ]{1,5000000}$ 和 ^(\w+\s?){1,5000000}$,以及四 mebibyte 输入上的精确次数选择 ^(a|b){4194304}$ 和 (a|b){4000000}。是非判断和捕获搜索的整数工作量上限为:这些字符类与分组单词每字节四步,这些选择分支每字节六步。将不约束输入的最大次数扩大十倍,工作量保持不变;这些测试夹具的上限并不是通用的准入或耗时保证。对两 mebibyte 分组单词执行 REPLACE 会保留最后一次迭代的捕获,并计入模板和输出工作。native_xpath_large 基准组测量这些形式及其计数和输入大小阶梯,同时保留原有的字面量、分组和对抗性邻例。
主体能重复空串的嵌套计数重复仍会区分计数组合。在 aaab 上,((a?){3000}){3000}b 能给出答案,而 ((a?){5000}){5000}b 会达到操作上限。没有通用的最小计数阈值:哪些状态同时存在取决于模式和输入。含反向引用的模式保留回溯匹配器,其指数级探索(在四十个 a 上的 ^(a|aa)*c\1$)可能达到步数上限。这种拒绝是使操作失败的硬错误,不是 false、缺失的捕获或部分替换结果。
| 代码 | 含义 | 补救办法 |
|---|---|---|
xpath-pattern-bytes | Resource::PatternBytes:模式源文本的 UTF-8 字节数超过上限(64 KiB)。无论其语法是否有效,源文本都会在解析之前被拒绝。 | 缩短该模式。 |
xpath-compile-steps | Resource::CompileSteps:编译该模式所需的编译器操作(包括扫描的字符与集合运算)超过上限(4,000,000)。 | 简化该模式,例如其字符类运算。 |
xpath-program-nodes | Resource::ProgramNodes:编译后的程序所需的节点数超过上限(262,144)。 | 简化该模式,或减少其计数重复。 |
xpath-compile-slots | Resource::CompileSlots:构建程序所需的构造单元数超过上限(2,097,152)。 | 简化该模式,或减少其计数重复。 |
xpath-match-steps | Resource::MatchSteps:实际匹配、捕获搜索或替换工作超过 250,000,000 次操作。较大的非约束最大次数和符合条件的单字符计数不会使每字节工作量成倍增加;嵌套计数组合、状态闭包、反向引用和替换输出仍可能耗尽这一上限。不发布答案或部分替换。 | 简化代价高的模式结构,在不需要其语义时移除反向引用,或处理更短的输入。 |
xpath-match-states | Resource::MatchStates:匹配所需的同时待定的备选状态数超过上限(65,536)。 | 减少该模式的选择分支与重复。 |
xpath-match-slots | Resource::MatchSlots:活动状态、捕获与续延所需的单元超过上限(1,048,576)。主体能匹配空串的嵌套重复是否达到该上限取决于其计数的组合。 | 减少该模式的捕获与重复,或匹配更短的输入。 |
xpath-output-bytes | Resource::OutputBytes:REPLACE 的输出超过上限(64 MiB)。 | 在更短的输入上替换,或使用更短的替换文本。 |
reasoning-*——在蕴涵机制(entailment regime)下执行的 SPARQL(purrdf)
| 代码 | 含义 | 补救办法 |
|---|---|---|
reasoning-closure-relation-witness | 从推理闭包派生的属性函数关系,不能与其受限 chase 生成了存在性见证的 OWL Direct-Semantics 运行组合使用:遍历闭包的关系可能返回一个生成的空节点,而该机制的作用域图并不包含它。 | 在不生成见证的机制(rdf、rdfs、owl-rl、d、rif、simple)下查询,或从该调用中去掉由数据集派生的关系。 |
reasoning-closure-relation-rebuild | 在推理闭包上重建属性函数关系失败。 | 关系构建器自身的错误包含在消息中。 |
statements-*——陈述元数据的摄入(purrdf-rdf)
当把文档的 rdf:reifies 与 owl:Axiom 陈述读入陈述层时,会出现这些代码。
| 代码 | 含义 | 补救办法 |
|---|---|---|
statements-turtle-parse | 陈述元数据 Turtle 解析失败。 | 修正该 Turtle。 |
statements-non-iri | 在此上下文中必须是 IRI 的某个项不是 IRI。 | 使用 IRI。 |
statements-reifies-non-triple | rdf:reifies 的宾语不是三元组项。 | 对一个三元组项进行具体化。 |
statements-malformed-axiom | 某个 owl:Axiom 缺少其源、属性或目标。 | 补全该公理。 |
statements-conflicting-structural | 同一个主语在某个结构字段上带有两个不同的值。 | 只保留一个值。 |
其他单代码族
| 代码 | 含义 | 补救办法 |
|---|---|---|
sssom-tsv-parse | 某个 SSSOM TSV 文档格式错误:缺少表头行或表头行不可读、curie_map 条目或集合注释格式错误、某行格式错误,或置信度不是数值;位置信息指明所在行。 | 在所报告的行修正该 TSV。 |
content-id-scheme | 某个内容 id 的 scheme 前缀无效:为空、含非 ASCII 字符,或以十六进制数字结尾(这会使它与 64 个十六进制字符的尾部产生歧义)。 | 选择一个非空、纯 ASCII 且不以 0-9、a-f 或 A-F 结尾的前缀。 |
代码在何处呈现给调用方
- Rust——返回错误上的
RdfDiagnostic::code;其Display形式为<severity> <code>: <message>。 - Python——
ValueError消息即该Display形式(例如error native-codec-parse: …);IRI 失败则输出为<code>: <message>(例如iri-relative-no-base: …)。 - JavaScript——抛出的
Error的消息携带同样的文本,其code属性则携带代码本身。wasm 包自身的拒绝携带purrdf-wasm-*代码:purrdf-wasm-options(某个操作拒绝了一个选项或参数)、purrdf-wasm-usage(某个作业在不该请求的时候请求了某样东西)、purrdf-wasm-serialize(结果无法以所要求的格式写出)、purrdf-wasm-entailment(某个蕴涵机制或其推理闭包失败)、purrdf-wasm-extension-environment(无法构建聚合注册表)、purrdf-wasm-shacl与purrdf-wasm-shacl-product-refusal(某个 SHACL 接口失败,或拒绝了一个预备好的产物)。 - C——经由 C ABI 返回的错误字符串携带相同的文本。
- SARIF——每条结果的
ruleId即该代码,并在本次运行的规则表中带有一个reportingDescriptor(purrdf-validate)。