class_docstr: Universal Gremlin<>pandas/graphistry functionality across Gremlin connectors
  
  Currently serializes queries as strings instead of bytecode in order to support cosmosdb
docstr: Enrich edges by matching g._edges to gremlin edges
docstr_tok: ["Enrich","edges","by","matching","g._edges","to","gremlin","edges"]
code: def fetch_edges(
      self,
      batch_size=1000,
      dry_run=False,
      verbose=False,
      ignore_errors=False,
  ) -> Union[Plottable, List[str]]:
      """
      Enrich edges by matching g._edges to gremlin edges
      """
      g = self
      edges_df = g._edges
      edge_id = "id"
      if edges_df is None:
          raise Exception(
              "Edge enrichment requires g._edges to be available"
          )
  
      if edge_id not in edges_df:
          raise Exception("Edge id not in edges table", edge_id)
  
      # Work in batches of 1000
      enriched_edges_dfs = []
      dry_runs = []
      for start in range(0, len(edges_df), batch_size):
          edges_batch_df = edges_df[start : (start + batch_size)]
          edge_ids = ", ".join(
              [f'"{x}"' for x in edges_batch_df[edge_id].to_list()]
          )
          query = (
              f"g.E({edge_ids}).elementMap()"  # TODO: alt for cosmos?
          )
          if dry_run:
              dry_runs.append(query)
              continue
          resultset = self.gremlin_run([query], throw=True)
          g2 = self.resultset_to_g(
              resultset, "edges", verbose, ignore_errors
          )
          assert g2._edges is not None
          enriched_edges_dfs.append(g2._edges)
      if dry_run:
          return dry_runs
      edges2_df = pd.concat(
          enriched_edges_dfs, sort=False, ignore_index=True
      )
      g2 = g.edges(edges2_df)
      return g2
  
imports: from typing import Any, Callable, Iterable, List, Optional, Set, Union, TYPE_CHECKING
  import os, pandas
  from .Plottable import Plottable
  from .util import setup_logger
label_desc: Use image node_id 9 for calling the GremlinMixin obj's underlying member method code with example usage: obj.fetch_edges(batch_size, dry_run, verbose, ignore_errors) and returns: g2, dry_runs