code: def reconnect(self, old_node, new_node):
          
  
          self._check_node(old_node)
          self._check_node(new_node)
          if old_node.id == new_node.id:
              return
          old_rel = _rel_helper(lhs='us', rhs='old', ident='r', **self.definition)
  
          # get list of properties on the existing rel
          result, meta = self.source.cypher(
              "MATCH (us), (old) WHERE id(us)={self} and id(old)={old} "
              "MATCH " + old_rel + " RETURN r", {'old': old_node.id})
          if result:
              node_properties = _get_node_properties(result[0][0])
              existing_properties = node_properties.keys()
          else:
              raise NotConnected('reconnect', self.source, old_node)
  
          # remove old relationship and create new one
          new_rel = _rel_helper(lhs='us', rhs='new', ident='r2', **self.definition)
          q = "MATCH (us), (old), (new) " \
              "WHERE id(us)={self} and id(old)={old} and id(new)={new} " \
              "MATCH " + old_rel
          q += " CREATE UNIQUE" + new_rel
  
          # copy over properties if we have
          for p in existing_properties:
              q += " SET r2.{0} = r.{1}".format(p, p)
          q += " WITH r DELETE r"
  
          self.source.cypher(q, {'old': old_node.id, 'new': new_node.id})
docs: Disconnect old_node and connect new_node copying over any properties on the original relationship.
  
          Useful for preventing cardinality violations
  
          :param old_node:
          :param new_node:
          :return: None