创建引用现有实体的实体

Create entity that refers to an existing entity

我能够从现有的 Clojure 数据创建实体。但是,我无法将现有实体附加到我试图创建的实体。我可以在模式中有 :ref :one 的地方放置 eid:db/id 吗?我都试过了,但只收到错误消息。在以下代码中,:statement/bank-account 的架构定义为 :ref :one,并且 read-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 是一回事。

您的查询 return 是一组一元组,例如 #{[1] [42] [323142] ...}

您需要将其更改为 return 只有一个值:

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

对于此函数的作用,您可能不需要使用 pull - eid 本身就足够了。