Good questions, especially relevant with the newly-released 4.0. I can supplement some answers.
Historically, with Neo4j, database and graph were interchangeable, in that for a Neo4j instance you could only run a single database, and that database consisted of a single graph. As Neo4j and its tools have evolved, we need to refine these terms somewhat, and this is still ongoing, things are still rather fuzzy.
With Neo4j Desktop, it's still using "Add Graph" for each of those squares, but that's no longer quite accurate. Each of these is actually its own dbms, or instance of Neo4j (since you can choose which version of Neo4j to setup for each). They are completely independent of each other, each having a separate Neo4j instance as well as a their own data directories, and via Desktop only 1 of these can be running at a time. Via the Desktop application, you should only have visibility to the dbms level, I don't believe it currently shows info on the databases present on each.
Prior to 4.0, a dbms could only have a single database, with a single graph.
With 4.0, we introduced multi-database capability. A single dbms can now simultaneously run multiple databases. By default and at minimum, one dbms will run 2 databases: the default database (neo4j), and the system database (system).
The system database is unique in that it is only for administration, and allows a set of special administrative commands instead of regular Cypher. This is for user, role, and database administration, as well as role based security configuration.
Through the system database, new databases can be created and started. You can switch which database you're working with via special commands (in browser and cypher shell) or on session creation (via a driver).
Each database has its own graph, 1 graph per database (but that is something we're likely going to be revisiting in the future).
Each database (and even the directories per database) is separate from each other, so there isn't ever any common data between them (at least, not the same node...but there may be separate nodes that have the same property values), and relationships cannot span between databases.
Neo4j Fabric is a federated/sharded approach to querying across multiple databases. This allows you to configure a proxy database (that you will connect to and query through) as well as databases that you can query via Fabric (and these can be local or remote to the system, and they can be single instances or clusters, and none of them need any extra configuration to be able to be used by Fabric). After querying across the databases you want, you can continue to work with the combined results to get what you need.
It's up to you how you want to distribute your data, whether to use multiple databases running on the same dbms, or to separate these out to separate Neo4j instances/clusters and use Fabric to query across them (if needing queries that need to work with some combined sets of data from the separate databases).