This paper develops techniques for reasoning about graph functional dependencies (GFDs). We study the satisfiability problem, to decide whether a given set of GFDs has a model, and the implication problem, to decide whether a set of GFDs entails another GFD. While these fundamental problems are important in practice, they are coNP-complete and NP-complete, respectively. We establish a small model property for satisfiability, showing that if a set Σ of GFDs is satisfiable, then it has a model of a size bounded by the size |Σ| of Σ; similarly we prove a small model property for implication. Based on the properties, we develop algorithms for checking the satisfiability and implication of GFDs. Moreover, we provide parallel algorithms that guarantee to reduce running time when more processors are used, despite the intractability of the problems. We experimentally verify the efficiency and scalability of the algorithms. (4) Using real-life and synthetic GFDs, we empirically verify the efficiency and scalability of our algorithms (Section VII). We find the following. (a) On average SeqSat and SeqImp take 1848 and 909 seconds on up to 10000 real-life GFDs with fairly complex patterns, respectively. The performance is substantially improved by parallel ParSat and ParImp, which take 167 and 76 seconds, respectively, when p = 20. Hence it is feasible to reason about GFDs in practice by using the parallel algorithms. (b) ParSat and ParImp are parallel scalable: they are 3.4 and 3.6 times faster on average, respectively, when p varies from 4 to 20. (c) Our optimization strategies are effective, e.g., pipelining improves the performance of parallel ParSat and ParImp by 1.5 and 1.6 times on average, and work unit splitting improves 3.8 and 4.1 times, respectively.