class_docstr: Duck-typed version of the DGLHeteroGraph class made for cuGraph
  for storing graph structure and node/edge feature data.
  
  This object is wrapper around cugraph's Multi GPU MultiGraph and returns samples
  that conform with `DGLHeteroGraph`
  See: https://docs.rapids.ai/api/cugraph/nightly/api_docs/cugraph_dgl.html
class_docstr_tok: ["Duck-typed","version","of","the","DGLHeteroGraph","class","made","for","cuGraph","for","storing","graph","structure","and","node\/edge","feature","data",".","This","object","is","wrapper","around","cugraph","'s","Multi","GPU","MultiGraph","and","returns","samples","that","conform","with","`","DGLHeteroGraph","`","See",":","https",":","\/\/docs.rapids.ai\/api\/cugraph\/nightly\/api_docs\/cugraph_dgl.html"]
docstr: Add edge features
  
  Parameters
  ----------
  feat_obj : array_like object
      The edge feature to save in feature store
  canonical_etype : Tuple[(str, str, str)]
      The edge type to be added
  feat_name : string
  Returns
  -------
  None
code: def add_edge_data(
      self,
      feat_obj: Sequence,
      canonical_etype: Tuple[str, str, str],
      feat_name: str,
  ):
      """
      Add edge features
  
      Parameters
      ----------
      feat_obj : array_like object
          The edge feature to save in feature store
      canonical_etype : Tuple[(str, str, str)]
          The edge type to be added
      feat_name : string
      Returns
      -------
      None
      """
      _assert_valid_canonical_etype(canonical_etype)
      self.edata_storage.add_data(
          feat_obj=feat_obj,
          type_name=canonical_etype,
          feat_name=feat_name,
      )
  
imports: from __future__ import annotations
  from typing import Optional, Sequence, Tuple, Dict, Union
  from functools import cached_property
  from cugraph.utilities.utils import import_optional, MissingModule
  from cugraph.gnn import FeatureStore
  from cugraph.gnn.dgl_extensions.dgl_uniform_sampler import DGLUniformSampler
  import cudf
  import dask_cudf
  import cupy
  from cugraph_dgl.utils.cugraph_storage_utils import _assert_valid_canonical_etype, backend_dtype_to_np_dtype_dict, add_edge_ids_to_edges_dict, add_node_offset_to_edges_dict
  from cugraph_dgl.utils.feature_storage import dgl_FeatureStorage
label_desc: Use image node_id 3 for calling the CuGraphStorage obj's underlying member method code with example usage: obj.add_edge_data(feat_obj, canonical_etype, feat_name) without return types