code: private void removeUnnecesaryEdges(final DirectedGraph<Object, JobGraphLink> graph,
              final SourceColumnFinder sourceColumnFinder) {
          // This loop is not very pretty but it ensures that we don't prematurely
          // stop looking for stuff to remove from the graph. The issue is that
          // with the current design, the removeUnnecesaryEdges method may remove
          // something which then should call for a re-evaluation of other edges
          // to be removed.
          boolean removedSomething = true;
          while (removedSomething) {
              removedSomething = removeUnnecesaryEdgesIfAny(graph, sourceColumnFinder);
          }
      }
docs: Removes links/edges that are "unnecesary". The rationale here is that we
  do not want to show every possible link since it clutters readability.
  
  We remove links that represent a direct edge between nodes that are also
  indirectly linked. Not in "diamond" shaped scenarios, but only in
  scenarios where a path from A->Z is already represented via A->B->Z or
  A->B->C->Z etc.
  
  @param graph
  @param sourceColumnFinder