我是加州大学旧金山分校 Loren Frank 实验室的一名研究员,使用数据联合和 nwb 格式的文件。我对定义 ElectrodeGroup 表中条目的代码进行了一些更改,并希望通过删除表中的条目并使用新代码重新生成它来测试这些。我能够删除该条目,但无法重新填充它。特别是,当我运行 ElectrodeGroup.populate() 或 ElectrodeGroup.populate({"nwb_file_name": my_file_name}) 时,不会对表进行任何更改。我确认我删除并尝试重新生成的电极组是在原始 nwb 文件中定义的。我正在寻求有关为什么 populate 命令似乎在这里不起作用的输入。提前感谢您的帮助!
问问题
43 次
1 回答
3
该用户还通过其他渠道联系了我们的团队。参考此架构,为未来的用户分享以下解决方案。简而言之,填充过程是为唯一的上游主键保留的。
由于 ElectrodeGroup 的唯一上游表依赖项是 Session,因此只有在该会话没有电极组时才会调用 make 方法。这是因为从 DataJoint 的角度来看,关于该表应该存在什么的唯一“保证”知识仅由相关上游记录的存在/不存在定义。由于 'new' 主 'electrode_group_name' 属性由 ElectrodeGroup 表本身定义,DataJoint 不知道 make 将创建多少副本,因此每个 Session 只需调用 make 1 次,期望单个 make 调用完全定义表将使用的所有可能的电极组名称值。如果该会话有一个值,则不需要进行任何工作,因此不会发生 make() 调用。
有几个可能的解决方案:
- 显式地对电极组进行建模,使用表格定义电极组的存在(例如,ElectrodeGroupConfiguration)。然后,此 ElectrodeGroup 将从 Session 和 ElectrodeGroupConfiguration 继承主键。将调整 ElectrodeGroup 的 make 函数以跨上游表加载该唯一键。
- 调整 make 函数以处理部分插入/更新情况,并在需要发生这些“异常”更新时直接使用所需的主键调用 make 函数。
方法 #1 对 DataJoint 数据模型是“最干净的”(使用 make/populate 显式建模数据依赖关系),而方法 #2 以受控方式稍微“转义”DataJoint 数据模型以实现所需的模式/数据结果。
于 2022-01-07T14:48:21.200 回答