Are Graft messages only sent when a node join a topic?

I am a little confused about how gossipbsub works. As per the documentation when a node joins a topic, both a graft and a join is issued.

  1. Is there ever a case where only a Graft is issued but no a join?
  2. In other words, in the gossipsub model, can two nodes have bi-directional peering even if they are not peers of each other for any topic?
  3. When a host.connect is issued, does that adds the node as a metadata-only node to begin with?

I guess my confusion stems from where does regular libp2p without the pubsub model ends and where does the pubsub model begins in terms of caching the peers in the peer store.

Will appreciate any help.

thanks in advance,