code: def test_chaining_nodes(self):
      g = graphistry.nodes(ndf_reddit)
      g2 = g.umap(dbscan=False)
  
      logger.debug("======= g.umap() done ======")
      g3a = g2.featurize()
      logger.debug("======= g3a.featurize() done ======")
      g3 = g3a.umap(dbscan=False)
      logger.debug("======= g3.umap() done ======")
      assert g2._node_features.shape == g3._node_features.shape
      # since g3 has feature params with x and y.
      g3._feature_params["nodes"]["X"].pop("x")
      g3._feature_params["nodes"]["X"].pop("y")
      assert all(
          g2._feature_params["nodes"]["X"]
          == g3._feature_params["nodes"]["X"]
      )
      assert (
          g2._feature_params["nodes"]["y"].shape
          == g3._feature_params["nodes"]["y"].shape
      )  # None
      assert g2._node_embedding.shape == g3._node_embedding.shape
  
imports: from xml.sax.handler import feature_external_ges
  import pytest
  import unittest
  import warnings
  import graphistry
  import os
  import logging
  import numpy
  import pandas
  from graphistry import Plottable
  from graphistry.feature_utils import remove_internal_namespace_if_present
  from graphistry.tests.test_feature_utils import ndf_reddit, text_cols_reddit, meta_cols_reddit, good_cols_reddit, single_target_reddit, double_target_reddit, edge_df, edge_df2, edge2_target_df, model_avg_name, lazy_import_has_min_dependancy, check_allclose_fit_transform_on_same_data
  from graphistry.umap_utils import lazy_umap_import_has_dependancy, lazy_cuml_import_has_dependancy, lazy_cudf_import_has_dependancy
label_desc: Use image node_id 4 for calling the TestUMAPAIMethods obj's underlying member method code with example usage: obj.test_chaining_nodes() without return types