code: def testGroupByDisjointLineage(self):
      (
          a1,
          a2,
          a3,
          b1,
          b2,
          b3,
          b4,
          c1,
          c2,
          c3,
          c4,
      ) = self._prepare_tfx_artifacts(11)
      self._put_lineage(a1, b1, c1)
      self._put_lineage(a2, b2, c2)
      self._put_lineage(a2, b3, c3)
      self._put_lineage(a3, b4, c4)
  
      result = self._group_by_disjoint_lineage(
          {
              "a": [a1, a2, a3],
              "b": [b1, b2, b3, b4],
              "c": [c1, c2, c3, c4],
          }
      )
  
      self.assertEqual(
          result,
          [
              {"a": [a1], "b": [b1], "c": [c1]},
              {"a": [a2], "b": [b2, b3], "c": [c2, c3]},
              {"a": [a3], "b": [b4], "c": [c4]},
          ],
      )
  
imports: import random
  from absl.testing import parameterized
  import tensorflow
  from tfx.dsl.input_resolution.ops import group_by_lineage_op
  from tfx.dsl.input_resolution.ops import test_utils
  from tfx.orchestration.portable.input_resolution import exceptions
  from tfx.types import artifact_utils
  from tfx.utils import test_case_utils
label_desc: Use image node_id 4 for calling the GroupByDisjointLineageTest obj's underlying member method code with example usage: obj.testGroupByDisjointLineage() without return types