创建引用现有实体的实体

时间:2017-07-12 00:49:06

标签: clojure datomic

我能够从现有的Clojure数据中创建实体。但是,我无法将现有实体附加到我尝试创建的实体。如果架构中有:ref :one,我可以放置eid:db/id吗?我试过了两个,但只收到了错误消息。在以下代码中,:statement/bank-account的架构定义为:ref :oneread-account函数成功检索现有(银行)帐户实体:

(defn read-account [conn account-name]
  (let [db (d/db conn)]
    (d/q '[:find ?a
           :in $ ?an
           :where
           [?a :account/name ?an]
           ] db account-name)))

(defn make-statement [conn {:keys [bank-acct-name]}]
  (let [db (d/db conn)
        bank-acct-id (->> bank-acct-name
                          (read-account conn)
                          ;; (d/pull db [:db/id])
                          first
                          )]
    {:db/id                  (d/tempid :db.part/user)
     :base/type              :statement
     :statement/bank-account bank-acct-id
     }))

此代码提供IllegalArgumentExceptionInfo :db.error/invalid-lookup-ref Invalid list form: [17592186045426] datomic.error/arg (error.clj:57)。如果我注释掉first,我会收到完全相同的错误消息,这让我很困惑。如果我取消评论(d/pull db [:db/id]),我会IllegalArgumentExceptionInfo :db.error/not-an-entity Unable to resolve entity: :db/id datomic.error/arg (error.clj:57)

编辑在回答此问题的过程中,我发现eid:db/id是相同的。

1 个答案:

答案 0 :(得分:1)

您的查询会返回一组1元组,例如#{[1] [42] [323142] ...}

您想要将其更改为仅返回一个值:

[:find ?a . ;; mind the '.'
 :in $ ?an
 :where
 [?a :account/name ?an]
 ]

对于这个函数的功能,你可能不需要使用pull - 这个eid就足够了。