Maybe the following will do what you want.
verticeEdgeDescription = {{"foo", "3", "bar"}, {"3",
"bar"}, {"foo"}};
(*give numbers to the vertices*)
vertexNumberPlusConnections = MapIndexed[{Last@#2, #1} &,verticeEdgeDescription];
combinations = Select[Tuples[vertexNumberPlusConnections, 2], #[[1]] != #[[2]] &];
combinations2 = DeleteDuplicates[Sort[#] & /@ combinations];
combinations3 = Select[{#[[1, 1]], #[[2, 1]], Intersection @@ #[[;; , -1]]} & /@ combinations2, #[[-1]] != {} &];
Graph[Flatten[With[{firstNode = #[[1]], secondNode = #[[2]], edges = #[[3]]},
Labeled[firstNode \[UndirectedEdge] secondNode, #] & /@
edges] & /@ combinations3], VertexLabels -> "Name", EdgeLabels -> "Name"]
This is mostly doing what you want. The one odd thing is that the labels in the generated graph seem wrong for the edges.
I'm not (yet) happy with how I determine the connections - too much manipulation to get unique connections.

Here is the connection edges:
{Labeled[1 [UndirectedEdge] 2, "3"] ,
Labeled[1 [UndirectedEdge] 2, "bar"] ,
Labeled[1 [UndirectedEdge] 3, "foo"]}
vertices
to a list like the one above. The vertex{"foo","3","bar"}
is connected to{"foo"}
by the "foo" edge. It should also be connected to{"3","bar"}
by the "3" and "bar" edges, but there is only one edge in the result. (The actual names of the edges in the output isn't important.) $\endgroup$