code: def sample_multiple_sgs(
      sgs,
      sgs_src_range_obj,
      sample_f,
      start_list_d,
      start_list_dtype,
      edge_dir,
      fanout,
      with_replacement,
  ):
      start_list_types = list(start_list_d.keys())
      output_dfs = []
      for can_etype, sg in sgs.items():
          start_list_range = sgs_src_range_obj[can_etype]
          # TODO: Remove when we remove the existing cugraph stores
          if isinstance(can_etype, str):
              can_etype = _convert_can_etype_s_to_tup(can_etype)
          if _edge_types_contains_canonical_etype(
              can_etype, start_list_types, edge_dir
          ):
              if edge_dir == "in":
                  subset_type = can_etype[2]
              else:
                  subset_type = can_etype[0]
              output = sample_single_sg(
                  sg,
                  sample_f,
                  start_list_d[subset_type],
                  start_list_dtype,
                  start_list_range,
                  fanout,
                  with_replacement,
              )
              output_dfs.append(output)
      if len(output_dfs) == 0:
          empty_df = cudf.DataFrame(
              {"sources": [], "destinations": [], "indices": []}
          )
          return empty_df.astype(cp.int32)
  
      return cudf.concat(output_dfs, ignore_index=True)
  
file_path: cugraph/python/cugraph/cugraph/gnn/dgl_extensions/utils/sampling.py
imports: import cugraph
  import cudf
  import cupy
  import dask_cudf
label_desc: Use image node_id 2 for calling a global function with example usage: sample_multiple_sgs(sgs, sgs_src_range_obj, sample_f, start_list_d, start_list_dtype, edge_dir, fanout, with_replacement) and returns: cudf, empty_df