code: def _subsequent_step_to_match(match_step):
      
      if not isinstance(match_step.root_block, (Traverse, Recurse)):
          raise AssertionError(u'Expected Traverse root block, received: '
                               u'{} {}'.format(match_step.root_block, match_step))
  
      is_recursing = isinstance(match_step.root_block, Recurse)
  
      match_step.root_block.validate()
  
      traversal_command = u'.%s(\'%s\')' % (match_step.root_block.direction,
                                            match_step.root_block.edge_name)
  
      parts = []
      if match_step.coerce_type_block:
          coerce_type_set = match_step.coerce_type_block.target_class
          if len(coerce_type_set) != 1:
              raise AssertionError(u'Found MATCH type coercion block with more than one target class:'
                                   u' {} {}'.format(coerce_type_set, match_step))
          coerce_type_target = list(coerce_type_set)[0]
          parts.append(u'class: %s' % (coerce_type_target,))
  
      if is_recursing:
          # In MATCH, "$depth < 1" means "include the source vertex and its immediate neighbors."
          # Yes, the "<" is intentional -- it's not supposed to be a "<=".
          parts.append(u'while: ($depth < %d)' % (match_step.root_block.depth,))
  
      if match_step.where_block:
          match_step.where_block.validate()
          parts.append(u'where: (%s)' % (match_step.where_block.predicate.to_match(),))
  
      if not is_recursing and match_step.root_block.optional:
          parts.append(u'optional: true')
  
      if match_step.as_block:
          match_step.as_block.validate()
          parts.append(u'as: %s' % (_get_vertex_location_name(match_step.as_block.location),))
  
      return u'%s {{ %s }}' % (traversal_command, u', '.join(parts))
docs: Transform any subsequent (non-first) MATCH step into a MATCH query string.