docs: def save_graphml(G, filename='graph.graphml', folder=None, gephi=False):
      """
      Save graph as GraphML file to disk.
  
      Parameters
      ----------
      G : networkx multidigraph
      filename : string
          the name of the graphml file (including file extension)
      folder : string
          the folder to contain the file, if None, use default data folder
      gephi : bool
          if True, give each edge a unique key to work around Gephi's
          restrictive interpretation of the GraphML specification
  
      Returns
      -------
      None
      """
  
      start_time = time.time()
      if folder is None:
          folder = settings.data_folder
  
      # create a copy to convert all the node/edge attribute values to string
      G_save = G.copy()
  
      if gephi:
          
          gdf_nodes, gdf_edges = graph_to_gdfs(G_save, nodes=True, edges=True, node_geometry=True,
                                               fill_edge_geometry=True)
          
          # turn each edge's key into a unique ID for Gephi compatibility
          gdf_edges['key'] = range(len(gdf_edges))
          
          # gephi doesn't handle node attrs named x and y well, so rename
          gdf_nodes['xcoord'] = gdf_nodes['x']
          gdf_nodes['ycoord'] = gdf_nodes['y']
          G_save = gdfs_to_graph(gdf_nodes, gdf_edges)
  
          # remove graph attributes as Gephi only accepts node and edge attrs
          G_save.graph = {}
  
      else:
          # if not gephi, keep graph attrs and stringify them
          for dict_key in G_save.graph:
              # convert all the graph attribute values to strings
              G_save.graph[dict_key] = make_str(G_save.graph[dict_key])
  
      # stringify node and edge attributes
      for _, data in G_save.nodes(data=True):
          for dict_key in data:
              if gephi and dict_key in ['xcoord', 'ycoord']:
                  # don't convert x y values to string if saving for gephi
                  continue
              else:
                  # convert all the node attribute values to strings
                  data[dict_key] = make_str(data[dict_key])
      
      for _, _, data in G_save.edges(keys=False, data=True):
          for dict_key in data:
              # convert all the edge attribute values to strings
              data[dict_key] = make_str(data[dict_key])
  
      if not os.path.exists(folder):
          os.makedirs(folder)
  
      nx.write_graphml(G_save, os.path.join(folder, filename))
      log('Saved graph "{}" to disk as GraphML at "{}" in {:,.2f} seconds'.format(G_save.name, os.path.join(folder, filename), time.time()-start_time))