The Relay team is building debugging tools that make it more clear what's happening with a given mutation and config, and longer-term, making the API lower-level and more explicit.
There are resources at facebook.github.io/relay/docs/guides-mutations.ht…
Though we should definitely write even more about mutations, since this is often an area where questions arise.
I often try to explain GraphQL in terms of the functions that each field represents.
For regular queries, it's pretty straight forward. To get my name, imagine the name field maps pretty cleanly to a user.getName() method, makes sense. To get my user object, maybe user(id: 123) maps to app.getUser({ id: 123 }), also fairly straight forward.
For mutations, it's exactly the same concept, but the underlying functions have side effects. They first do something (anything) to your system and then return something related to the change it just made. So perhaps likeStory(id: 456) maps to app.likeStory({ id: 456 }) which first makes sure that we update the database to show that I've liked the story, and then returns the story itself, so we can ask new questions of it, like how many people like it now.