Snakemake相同值的library_id与run_id下未检出歧义规则是BUG吗
问题结论
这不是Snakemake的BUG,属于官方设计的规则匹配、依赖校验逻辑的正常表现,核心原因可以从两个层面拆解:
核心逻辑说明
Snakemake判定规则匹配优先级、是否触发歧义时,会按以下流程执行:
- 先检查目标文件能否匹配规则的输出模式
- 代入匹配得到的通配符取值,校验该规则的所有输入是否可以被生成/已存在,排除存在循环依赖、输入无法生成的规则
- 对剩余符合条件的规则,比较通配符约束的特异性:通配符有显式正则约束、匹配值属于通配符显式声明的取值范围的规则优先级更高
- 只有当多个规则的优先级完全相同时,才会抛出
AmbiguousRuleException
对应测试用例解释
- 第一个测试用例:run_id取值为
['R1']、library_id取值为['S1']时,S1.bam可以同时匹配bwa和merge_bam的输出模式,且两个规则代入通配符后的输入都可以正常生成,规则优先级完全一致,因此正常抛出歧义异常。 - 第二个测试用例:run_id取值改为
['S1']后,大概率触发了依赖循环校验逻辑:如果你的merge_bam规则的输入是通过expand("{run_id}.bam", run_id=run_id)声明的,此时代入library_id=S1后,merge_bam的输入和输出都是S1.bam,形成循环依赖,会被Snakemake直接排除出匹配规则列表,仅剩bwa规则符合生成条件,因此不会触发歧义,直接执行bwa规则。
兼容建议
如果要避免不同版本Snakemake的规则匹配行为差异,可以在Snakefile中显式声明规则优先级:
ruleorder bwa > merge_bam # 或者 ruleorder merge_bam > bwa,根据你的实际需求选择
该声明可以明确指定当两个规则存在匹配歧义时的优先执行顺序,完全规避歧义报错。
内容的提问来源于stack exchange,提问作者dariober
相关产品推荐
相关产品推荐

