            (if-let [ser (:values f)]
              (ser (k rec))
              (k rec))]))
-       (into {})))
+       (into {})
+       (merge (select-keys rec (keys (apply dissoc rec :id (keys props)))))))
 
 (defn extract-key
   [props key]

        ctor       (symbol (str 'make- ctor-name))
        dctor      (symbol (str 'describe- ctor-name))
        dctor-as   (symbol (str 'describe-as- ctor-name))
        mctor      (symbol (str 'map-> name))]
    `(let [validators# (build-validators ~props)
           defaults#   (extract-key ~props :default)

    (let [k (id x)]
      (if (map? (first k)) (mapv :id k) (vec k)))))

(defn entity-map-from-triples
  [triples props id]
  (let [iprop (reduce-kv (fn [acc k v] (assoc acc (:prop v) k)) {} props)
        conj* (fnil conj [])]
    (->> triples
         (filter #(= id (:s %)))
         (reduce
          (fn [acc [_ p o]]
            (let [p' (iprop p p)
                  op (props p')]
              (if (and op (-> op :card (not= :*)))
                (assoc acc p' o)
                (update-in acc [p'] conj* o))))
          {:id id}))))

(defmacro defentity
  [name type props]
