An edge is an object that is contained by a graph and connects
nodes. An edge has a "head" and a "tail" as if it was directed,
but also has a method isDirected() that says whether or not the
edge should be treated as directed (e.g. should there be an arrow
drawn on the head). An edge has a semantic object that is its
semantic equivalent in the application and may have a visual object
which is its syntactic representation in the user interface.