code: def test_chain_named(self):
      g = hops_graph()
  
      # e->l->b, e->g->a
      g2 = g.chain(
          [
              n({g._node: "e"}, name="n1"),
              e_forward({}, hops=1),
              e_forward({}, hops=1, name="e2"),
              n(name="n2"),
          ]
      )
  
      assert g2._nodes[g2._nodes.n1][g2._node].to_list() == ["e"]
      assert sorted(g2._edges[g2._edges.e2][g2._source].to_list()) == [
          "g",
          "l",
      ]
      assert sorted(
          g2._edges[g2._edges.e2][g2._destination].to_list()
      ) == ["a", "b"]
      assert sorted(g2._nodes[g2._nodes.n2][g2._node].to_list()) == [
          "a",
          "b",
      ]
  
imports: from functools import lru_cache
  from typing import Dict, List
  import logging
  import pandas
  from common import NoAuthTestCase
  from graphistry.compute.ast import n, e_forward, e_reverse, e_undirected, is_in
  from graphistry.tests.test_compute import CGFull
  from graphistry.tests.test_compute_hops import hops_graph
  from graphistry.util import setup_logger
label_desc: Use image node_id 10 for calling the TestComputeChainMixin obj's underlying member method code with example usage: obj.test_chain_named() without return types