Yup, lots of temporaries (I haven&#x27;t written much Clojure recently, so I&#x27;m sure I&#x27;m missing lots of simplifying core fns).<p><pre><code>  (let [; input
        js (cheshire.core&#x2F;parse-string (slurp (clojure.java.io&#x2F;resource &quot;awful.json&quot;)))
        ; utils
        get-match (fn [k v coll] (first (filter #(= (get % k) v) coll)))
        model-for (fn [title toplevel] (get-match &quot;title&quot; title (toplevel &quot;models&quot;)))
        key-for (fn [name* model] ((get-match &quot;name&quot; name* (model &quot;fields&quot;)) &quot;key&quot;))
        ; models
        fruit-model (model-for &quot;fruits&quot; js)
        farmer-model (model-for &quot;farmers&quot; js)
        ; keys
        fruit-name-key (key-for &quot;Name&quot; fruit-model)
        farmer-name-key (key-for &quot;Full name&quot; farmer-model)
        farmer-fruits-key (key-for &quot;Fruits&quot; farmer-model)
        ; values
        bob-entity (get-match farmer-name-key &quot;Bob, the farmer&quot; (farmer-model &quot;entities&quot;))
        bob-fruit-keys (bob-entity farmer-fruits-key)
        bob-fruit-entities (map #(get-match &quot;_id&quot; % (fruit-model &quot;entities&quot;)) bob-fruit-keys)
        bob-fruit-names (map #(% fruit-name-key) bob-fruit-entities)]
    bob-fruit-names)

  =&gt; (&quot;Orange&quot;)</code></pre>