Algebraic Approaches to Graph Transformation - Part I: Basic Concepts and Double Pushout Approach