code: def test_post_hop_node_match(self):
      ns = pd.DataFrame(
          {
              "n": [1, 5],
              "category": ["Port", "Other"],
          }
      )
  
      es = pd.DataFrame({"s": [1, 1], "d": [1, 5]})
  
      g = CGFull().edges(es, "s", "d").nodes(ns, "n")
  
      g2 = g.chain(
          [
              n({"category": "Port"}),
              e_undirected(),
              n({"category": "Port"}),
          ]
      )
      assert len(g2._nodes) == 1
  
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 12 for calling the TestComputeChainMixin obj's underlying member method code with example usage: obj.test_post_hop_node_match() without return types