4. 导入 ILCD 包失败:引用完整性检查与修复
ILCD 包导入失败的引用完整性排障
ILCD 压缩包本质是一组 XML 数据集(Process、Flow、FlowProperty、UnitGroup、Source、Contact 等)的集合,数据集之间通过 UUID 相互引用。导入时 OpenLCA 会先解析全部数据集,再按 UUID 建立引用关系;只要有一个被引用的 UUID 在包内或当前数据库中找不到,导入就会中断并抛出引用缺失错误。因此排障的核心不是"重试导入",而是从导入日志中提取缺失 UUID,判断它属于哪类数据集,再补齐该数据集后重新导入。
从日志中提取缺失 UUID
OpenLCA 导入 ILCD 包时,错误信息通常形如 Reference not found: UUID = <uuid>,并会附带触发该引用的数据集名称。排障第一步是把日志中所有 UUID = 后面的值全部摘出来,去重后形成待查清单。注意日志里可能同时出现多条错误,但往往只有少数几个是"根因 UUID"——其余是级联报错(例如 UnitGroup 缺失导致 FlowProperty 无法解析,进而导致 Process 报错)。判断根因的方法是:被引用次数最多、且自身不再引用其他缺失项的那个 UUID。
在包内与数据库中双向核对
拿到 UUID 后,需要确认它到底是"包内缺失"还是"数据库中也没有"。两种核对方式:
- 包内核对:ILCD 包解压后是若干 XML 文件,直接用文本搜索 UUID 字符串。若在
processes/、flows/、flowproperties/、unitgroups/等目录下都搜不到,说明该数据集确实没被打进包。 - 数据库核对:在 OpenLCA 中打开目标数据库,用导航树的搜索框按 UUID 或名称查找。若数据库中已存在同 UUID 的数据集,则导入时可直接复用,无需补包;若不存在,则必须补齐。
判断数据集类型的依据是引用字段名,而不是猜测:flowRef 指向 Flow,flowPropertyRef 指向 FlowProperty,unitGroupRef 指向 UnitGroup,sourceRef 指向 Source,contactRef 指向 Contact。字段名与数据集类型一一对应,这是 ILCD 规范的固定约定。
补齐引用的三种可行路径
- 从原始数据源重新导出:如果缺失的 UnitGroup 或 FlowProperty 来自某个公开节点(如 ELCD、GaBi 导出包),回到该来源单独导出该数据集,放入包内对应目录。
- 从当前数据库导出后并入:若目标数据库中已有同 UUID 数据集,用 OpenLCA 的"导出 → ILCD"功能单独导出它,再把生成的 XML 放进压缩包的相应子目录。
- 手工补建(仅限简单数据集):UnitGroup 这类结构简单的数据集,可在 OpenLCA 中新建一个同 UUID 的 UnitGroup,填好单位与换算因子后导出为 ILCD XML。注意 UUID 必须与引用方完全一致,否则仍会报缺失。
修复后的验证要点
补齐数据集后重新导入,验证不能只看"导入成功"提示,还要做三项抽查:
- 导入日志中不再出现
ERROR Reference not found行; - 在导航树中打开被修复的 Process,检查其 exchange 的 Flow 与 FlowProperty 都能正常展开(不显示红色缺失标记);
- 打开被补入的 UnitGroup,确认单位列表与换算因子完整,避免"引用能解析但数值错误"的隐性缺陷。
若重新导入后仍报同一 UUID 缺失,最常见的原因是补入的 XML 文件放错了子目录,或文件内 UUID 与引用方存在大小写/连字符差异。ILCD 的 UUID 是标准 36 位带连字符格式,逐字符比对即可排除。