code: public Graph<KB, VVB, Projection<KT, VVT, VVB, EV>> projectionBottomFull() {
  		DataSet<Tuple5<KT, KB, EV, VVT, VVB>> edgesWithVertices	= joinEdgeWithVertices();
  
  		DataSet<Edge<KB, Projection<KT, VVT, VVB, EV>>> newEdges = edgesWithVertices.join(edgesWithVertices)
  			.where(0)
  			.equalTo(0)
  			.with(new ProjectionBottomFull<>())
  				.name("Full bottom projection");
  
  		return Graph.fromDataSet(bottomVertices, newEdges, context);
  	}
docs: Convert a bipartite graph into a graph that contains only bottom vertices. An edge between two vertices in the
  new graph will exist only if the original bipartite graph contains at least one top vertex they both connect to.
  
  <p>The full projection performs three joins and returns edges containing the connecting vertex ID and value,
  both bottom vertex values, and both bipartite edge values.
  
  <p>Note: KB must override .equals(). This requirement may be removed in a future release.
  
  @return full bottom projection of the bipartite graph