Page 429 - 《软件学报》2025年第12期
P. 429

5810                                                      软件学报  2025  年第  36  卷第  12  期


                 询语句, 并使用数据对象索引中的对应数据库执行搜索请求, 这一过程称为搜索请求翻译. 图                            3  左侧的示例展示了
                 对于一个路径匹配搜索请求进行翻译的过程, 路径匹配搜索单元根据搜索请求中的路径模式生成了一个                                    Cypher
                 查询语句, 并在数据对象索引中的          Neo4j 数据库中执行.
                    在搜索执行完毕后, 搜索单元得到从数据对象索引返回的搜索结果. 由于底层数据库的不同或查询语句返回
                 语句的差异, 不同类型的搜索单元会从数据对象索引得到不同格式的搜索结果, 因此搜索单元还需要将这些搜索
                 结果转换为一个统一的格式. 这一过程称为搜索结果收集. 图                   3  右侧的示例展示了对路径匹配搜索请求返回的结
                 果进行结果收集的过程. 在执行示例中的             Cypher 查询语句后, Neo4j 数据库返回的结果中将每个数据对象表示为
                 包含了其全部属性的字典, 在结果收集的过程中, 路径匹配搜索单元从每个字典中提取出数据对象的标识, 并向上
                 层模块返回一个标识列表. ReproLink 可以通过增加搜索单元的方式方便地扩展, 从而支持新的搜索请求类型. 表                            3
                 展示了   ReproLink  目前支持的搜索请求的类型. 在搜索结果收集完成后, 搜索单元层将统一格式的搜索结果返回
                 至请求分发模块.

                                                表 3 ReproLink  支持的搜索类型

                                  搜索类型                     type域                  query域
                                 关键字搜索                  keywordSearch           一组关键字
                                 路径匹配搜索                   pathMatch              路径模式

                  3.3.3    数据对象索引
                    为了支持关键字搜索和路径匹配搜索等搜索方式, ReproLink                在本地维护了一个由异构数据库组成的数据对
                 象索引. 目前此模块包含一个支持关键字搜索的关键字索引和一个支持路径匹配搜索的关系索引. 关键字索引使
                 用  Apache Lucene 实现, 在科研数据对象的属性集上建立索引. 关系索引使用               Neo4j 图数据库实现, 将科研数据对
                 象建模为节点, 关系对象建模为边, 为路径匹配搜索提供支持.
                  3.4   复现执行引擎

                    ReproLink  支持用户进行对论文的在线复现, 这一功能通过复现执行引擎完成. 一次完整的在线论文复现包括
                 多次复现单元所关联代码的在线执行. 一次代码的在线执行涉及一个代码对象和若干个数据集对象. 设待执行代
                                                                                            D
                           C                      D  D   D            C            O ,O ,...,O  一次代码的执
                                                                                    D
                                                                                       D
                 码的标识为    I , 输入数据集的标识分别为        I ,I ,...,I , 代码对象为  O , 数据集对象为    1  2    n
                                                    2
                                                         n
                                                  1
                 行主要包括以下几个步骤.
                    1) 算力匹配: 根据论文复现需要的算力资源, 匹配合适的硬件环境. 后续的代码执行都在该环境中执行.
                    2) 创建任务: 在服务器上创建任务进程. 任务进程负责管理代码执行的全生命周期.
                                                                                   D
                                                                                        D
                                                                                 D
                    3) 获取复现所需数据: 任务进程根据代码对象的标识                I C   和数据集对象的标识   I ,I ,...,I , 调用数据管理模块
                                                                                        n
                                                                                 1
                                                                                   2
                        C         D  D    D
                 将代码  O  和数据集   O ,O ,...,O  下载到任务进程所在机器的本地硬盘.
                                  1  2    n
                                                       π EE (O ) 创建一个  Docker 容器作为此次复现的软件环境. 在创建
                                                           C
                    4) 创建复现环境: 使用代码对象的运行环境
                                                  C                         D       D
                 容器时分别挂载代码对象的代码文件             π EC (O ) 和数据集对象的数据实体     π E (O ),...,π E (O ).
                                                                            1       n
                    5) 执行复现: 在复现环境中执行复现所使用的代码, 由任务进程全程监控复现的输出并实时向复现执行引擎
                 返回日志.
                                                                                           D ′
                    6) 收集复现结果: 使用输出数据的内容作为数据实体, 调用数据管理模块创建数据集对象                          O .
                                                                         D ′
                    7) 返回复现结果: 代码执行结束, 任务进程将输出数据集的标识                 π I (O ) 返回服务器.
                    算法  1  描述了在代码执行服务器上的任务进程在代码执行过程中的操作逻辑, 也就是上述的第                             3–7  步. 基于
                 以上代码执行函数, ReproLink     实现了包含多个复现单元的多阶段复现流程的一键复现, 其流程见算法 2. 算法                        2
                 的  ExecuteReproductionUnits 函数首先调用  GetDependentObjects, 使用深度优先搜索获取待执行的复现所依赖的
                 全部复现单元. 维护      Ready  集合和  Done 集合, 分别表示输入数据已经就绪的复现单元和已经执行完成的复现单
                 元. 每次循环从    Ready  集合中取出一个就绪的复现单元, 调用           ExecuteOneReproductionUnit 函数执行此复现单元,
   424   425   426   427   428   429   430   431   432   433   434