What I'd like to know is how (or if!) it does query building. I recently had a project where GraphQL looked like a perfect fit, since I needed an arbitrary amount of possibly nested data about some entities. The problem I had was that the GraphQL library basically requires you to do a SELECT *, and then picks the fields the client wants from that. Unfortunately, the DB schema was nowhere near 1:1 with the GraphQL schema I wanted, and getting certain fields required some very expensive JOINs. There's a stagnant PR to add a query planner, but at the moment it offers no way to assemble your query to match the client's request: the library says 'get the data' with no details about precisely which data must be gotten.
It's true that graphql-js pushes you in a direction where the code that fetches the data from the db is inefficient, but that is not a GraphQL problem, that is an implementation problem.
To be efficient, you need to implement your own logic (in the resolvers) that analyses the entire graphql AST, generates an optimal query, and sidesteps the default execution engine in graphql-js.