public Collection<DAGNode> getTagged(String tag) {
   String alterTag = TAG_PREFIX + tag;
   Collection<DAGNode> allTagged = new ArrayList<>();
   if (taggedNodes_.containsKey(alterTag)) allTagged.addAll(taggedNodes_.get(alterTag));
   String nonCoreTag = NON_CORE_PREFIX + tag;
   if (taggedNodes_.containsKey(nonCoreTag)) allTagged.addAll(taggedNodes_.get(nonCoreTag));
   return allTagged;
 }
  private boolean getSubNodesAndEdges(
      String tag, int distance, Collection<DAGEdge> edges, Collection<DAGNode> nodes) {
    RelatedEdgeModule relatedEdgeModule =
        (RelatedEdgeModule) dag_.getModule(RelatedEdgeModule.class);

    if (!taggedNodes_.containsKey(tag)) return false;

    // 1. Identify tagged nodes
    Collection<DAGNode> newlyAddedNodes = new HashSet<>(taggedNodes_.get(tag));
    logger.debug("Identify tagged nodes: {}", newlyAddedNodes);

    boolean loop = false;
    do {
      // 2. Find links/ancestry of tagged nodes
      logger.debug("Find links/ancestry of tagged nodes {}", distance);
      findLinks(newlyAddedNodes, nodes, distance, relatedEdgeModule);
      logger.debug("Number of nodes: {}", newlyAddedNodes.size());

      // 3. Find other links between new nodes
      logger.debug("Linking nodes");
      edges.addAll(incorporateNewAndLinkEdges(nodes, newlyAddedNodes, relatedEdgeModule));
      logger.debug("Found {} linking edges.", edges.size());

      loop = !newlyAddedNodes.isEmpty();
      distance = 0;
    } while (loop);
    return true;
  }