I am actually writing a library to help compose queries, specifically the n+1 problem https://github.com/oliyh/superlifter
It'll be interesting to compare; we have a Dataloader library that we're trying to get through the Walmart open-source pipeline.
I think our approaches are simiilar. We'll see.
It uses the composability + deduplication characteristics of urania
There is an example folder with a Lacinia example of the n+1 solution using superlifter
I'm halfway through refactoring how it works though so it's definitely not stable yet but it's nearly where I want it to be (see the pools branch if you're really interested)
Essentially at resolve time you throw all your work into a bucket and the bucket of work is performed asynchronously, either after a certain amount of time has passed (dataloader style) or when the bucket reaches a certain size (useful for n+1 when you know n in advance)