Hi Nick
I'll try not to get carried away here...
First off, folks in the Clojure and ClojureScript communities are absolutely familiar with, inspired by, and building on top of or in the direction of GraphQL. David Nolen, the author of Om and the lead ClojureScript developer, has build om-next which is more or less a Clojury take on the GraphQL idea. The insight there, which Dustin hints to, is that Datomic has this thing called a pull query you can execute, which is more or less isomorphic (I guess if it's more or less I should just say homomorphic...) to the GraphQL query. Om-next is basically just "let's close that gap", and most of the gap is stuff like pagination and sorting of collections. So it gives you a way of describing these things directly in your pull queries. The nice thing about the pull query, is it's just a data structure, so it's very composable. You can build queries up programatically, which is really lovely. This pattern of building programs around the composition of data structures is really a cornerstone of the Clojure philosophy.
As I think some others have pointed out here, there seem to be others experimenting more directly with the GraphQL api. But om-next is really no less agnostic about a lot of things than GraphQL. It's not really tied to Datomic, except in that it inherits the pull query syntax. But you can implement the resolvers and such to work with any backend storage mechanism (and long as you can traverse the relationships). The Datomic integration happens to be trivial, which is nice, and opens up other possibilities. However, Datomic is not the only "Datomic" in a sense. DataScript is a cljc (meaning, it can compile to and be used from both Clojure AND ClojureScript (And JS actually)) implementation of an in memory version of the Datomic API. It's actually surprisingly feature complete, and a great way to experiment with the underlying data model, pull queries, and even Datalog (a query language also baked into Datomic which is more expressive than SQL, and better for querying graph relations). The folks at Mozilla have also started working on Mentat, a Rust (I believe) implementation of a Datomic like database on top of SQLite. It's very clear to me with all the activity around these projects that while Datomic remains a very powerful system with many features these other projects will likely never aim for, the overall idea has started catching on, and is worth paying attention to.
Part of what makes the om-next approach so fascinating is that Datomic's data model is based on RDF. If you're not familiar with it, RDF is a web standard, and the de facto data language of the Semantic Web (also manifest as web standards). It's part of the vision of the computable web of data. The idea is that all data should be self-describing, globally meaningful, and infinitely extensible. There are vocabularies which can be described in RDF data, which themselves describe the schema and meaning of other data. It's super brilliant stuff, and actually really simple! Data is organized as (entity, attribute, value) triples of "facts". The key is that as long as your attributes are globally meaningful, you can merge information about an entity without ever worrying about overwriting other information about that entity. This gives us extensibility. In Clojure and Datomic, these globally meaninful attributes are achieved via namespaced keywords, which is also: brilliant and simple. We can also have entities that point to other entities, giving us polymorphic entity relationships. Datomic owes some of it's brilliance and I think success to making this collection of ideas a bit simpler, more approachable and more idiomatic. RDF has been a great idea waiting for someone to come around and maximize it. And Datomic is not alone. Look at other companies like MarkLogic who've built big businesses around RDF technology. By contrast, GraphQL is an idea that was hacked together kind of recently, is not as far as I know a standard (please correct me if I'm wrong here), and doesn't have namespaced attributes, so you're a little stuck not being able to get all of the natural polymorphism and extensibility of Datomic and friends as easily. However, it's also proven that streamlining the communication of data from server to client, and stripping out all of our bloated controllers and REST apis is possible, and that it can dramatically shrink code bases and accelerate development, which is really awesome. But in short, it's really worth seeing what the Clojure community is doing with these ideas, because it definitely adds some dimensions of awesomeness.
I'd be remiss if I did not mention that I'm working with some folks on building out Datsync, a system for syncing Datomic/DataScript data (EAV / triple data, in technical terms) between nodes in a network (either server client or P2P). Here, our goal is to extend the scope of what om-next describes by automating the synchronization of EAV triples given that this is what your data looks like. We do plan to support om-next style pull query syntax (so you'd be able to differentially sync using something more or less equivalent to a GraphQL query). But we're also considering implementing a reactive, incrementally maintained, eventually consistent Datalog engine. It's been shown that a subset of Datalog is more or less the most expressive eventually consistent language you can construct, so this effectively means we'll have maxed out what you can describe without needing coordination between peers (and hence some kind of consensus algorithm, like Raft or Paxos). In general, it's a really lovely complement to the pull query. Taking a step back though, the audacious goal of Datsync is to more or less one-up GraphQL by having the full expressiveness of Datalog+pull for the description of synchronization scope, together with the flexibility of RDF data for data modelling, and almost 0 hook-up (you won't have to implement resolvers or anything; just plug in an synchronize). There are some caveats to this of course, and there will be plenty of work exploring this paradigm, but we're very excited by the potentialities!
As for your comments about your experience coming to the Clojure ecosystem, I really appreciate your voice here. The Clojure community is full of extremely bright folks working on lots of really wonderful things, and it can feel a little overwhelming coming to so many new ideas and ways of doing things at once. Having done ruby and rails development in the past prior to Clojure, I can testify to that feeling. So, while I can say that it does get better, there have been discussions in the community of late about how we can reduce the burden here. So again, I thank you for voicing your perception of things here. However, I can also say having poked a stick at various JS tooling that the ClojureScript ecosystem anyway feels way saner to me. There are two build systems, but to at least some extent they are compatible. Contrast that with Python's infinite menagerie of tooling. Also, FP is getting more popular in JS, so folks start bringing in libraries to help with that, and instantly, confusion ensues about which one, how they handle this edge case, etc. In contrast, ClojureScript has good pure data structures built right into the language, as well as all (well, most) of the well thought out functional programming utilities baked into the clojure.core namespace, so there's never a question about any of that. And by building on the Google Closure compiler, ClojureScript is able to leverage a bunch of useful properties of that sytem automatically, without any real thought, such as code shaking, browser compatibility, etc. And yes, it's a little confusing some times figuring out which lib works on front end versus back end, but honestly? This is way better than the alternative in my opinion. What other functional language has as high a utilization across browser, server and distributed system? That's a lot of power to pack into the punch of one well thought out language. So I'd argue that the mild discomfort of coming into the scene and having to figure out what libs are for clojure and which for clojurescript is more or less worth it, cause in the end it's only giving you more options. And I think now that we have .cljc files for doing this, more and more libraries are doing this "first-class" now, and for old libs, they are frequently rewritten to work with both after the fact, so the situation is improving overall. But that doesn't mean there isn't more we can do to make the situation better.
Ok... I think I got carried away... but hopefully that 2c was useful.
Chris