code: func (p *Path) FollowRecursive(via interface{}, maxDepth int, depthTags []string) *Path {
  	var path *Path
  	switch v := via.(type) {
  	case string:
  		path = StartMorphism().Out(v)
  	case quad.Value:
  		path = StartMorphism().Out(v)
  	case *Path:
  		path = v
  	default:
  		panic("did not pass a string predicate or a Path to FollowRecursive")
  	}
  	np := p.clone()
  	np.stack = append(p.stack, followRecursiveMorphism(path, maxDepth, depthTags))
  	return np
  }
docs: // FollowRecursive will repeatedly follow the given string predicate or Path
  // object starting from the given node(s), through the morphism or pattern
  // provided, ignoring loops. For example, this turns "parent" into "all
  // ancestors", by repeatedly following the "parent" connection on the result of
  // the parent nodes.
  //
  // The second argument, "maxDepth" is the maximum number of recursive steps before
  // stopping and returning.
  // If -1 is passed, it will have no limit.
  // If 0 is passed, it will use the default value of 50 steps before returning.
  // If 1 is passed, it will stop after 1 step before returning, and so on.
  //
  // The third argument, "depthTags" is a set of tags that will return strings of
  // numeric values relating to how many applications of the path were applied the
  // first time the result node was seen.
  //
  // This is a very expensive operation in practice. Be sure to use it wisely.