Hi George,
There are some simple answers which might help if the problems you wish to solve are relatively small. If your problems are large enough that looping over the mesh in Python is too slow, or if you plan to run in MPI parallel then this will be somewhat more complex.
Firedrake does not explicitly store the vertex-vertex adjacency relationship because it's not needed for any of the common finite element computations. What is readily available is the cell to node adjacency list. For the FunctionSpace CG1, the nodes correspond to the vertices. This adjacency is available as a Numpy array in V.cell_node_list (it's also available as a PyOP2 Map as V.cell_node_map() but that's probably not what you currently want). If you really want the vertex-vertex adjacency, then it's pretty easy to derive from V.cell_node_list.
If you need to do this at a scale where performance is really important, then adjacency relationships can be derived using the underlying PETSc DMPlex, but this is a much more involved process.
In parallel, the cell_node_list will contain indices in the local numbering of the current process. This is probably what you want, but it is useful to be aware that this happens.
Regards,
David