To be precise, the nodes represent the blocks (consisting a set of statements) and the edges represent possible data flow (the execution path).
Now basically the data flow analysis gives the information regarding the definition and use of data in the program (Available Expression, Reaching Definition, Live variable). This information is needed for code optimization.
And moving on to the graph theory applications in the compiler design, I would say Register allocation is the best example (Btw this can be done after gathering information from the data flow analysis).
This is a vast area, not easy to explain everything clearly. So, I would highly recommend to read a good book on compilers to get deeper insights