'Appends a new Edge to the graph.
An optional base parameter can be used to pass a subclass of Edge:
Graph.add_edge("cold", "winter", base=IsPropertyOf)'

def add_edge(self, id1, id2, *args, **kwargs):

    n1 = self.add_node(id1)
    n2 = self.add_node(id2)
    e1 = n1.links.edge(n2)
    if (e1 and (e1.node1 == n1) and (e1.node2 == n2)):
        return e1
    e2 = kwargs.pop('base', Edge)
    e2 = e2(n1, n2, *args, **kwargs)
    self.edges.append(e2)
    n1.links.append(n2, edge=e2)
    n2.links.append(n1, edge=(e1 or e2))
    self._adjacency = None
    return e2
