     (s/and list? (s/cat :expr ::join-key-param-key :params ::params))
     (default-gen ::gen-join-key-param-expr)))
 
+(s/def ::mutation-key (s/with-gen symbol? (default-gen ::gen-mutation-key)))
+
+(s/def ::mutation-expr
+  (s/with-gen
+    (s/and list? (s/cat :mutate-key ::mutation-key :params (s/? ::params)))
+    (default-gen ::gen-mutation-expr)))
+
+(s/def ::mutation-join
+  (s/map-of ::mutation-expr ::query :count 1 :conform-keys true))
+
+(s/def ::mutation
+  (s/or :mutation ::mutation-expr
+        :mutation-join ::mutation-join))
+
 (s/def ::query-expr
   (s/or :prop ::property
         :join ::join
         :ident ::ident
+        :mutation ::mutation
         :param-exp ::param-expr
         :special ::special-property))
 

   (fn gen-ident-key [_] gen/keyword)

   ::gen-ident-value
   (fn gen-ident-value [_] gen/any-printable)

   ::gen-ident
   (fn gen-ident [{::keys [gen-ident-key gen-ident-value] :as env}]

   ::gen-mutation
   (fn gen-mutation [{::keys [gen-mutation-expr gen-mutation-join] :as env}]
     (gen/frequency [[5 (gen-mutation-expr env)]
                     [1 (gen-mutation-join env)]]))})

(defn default-gen [name]
  #((get generators name) generators))
