2

以下使用简化的 datomic 设置:

:account/user -> string
:account/email -> ref

:email/name -> string
:email/type -> keyword

如果我有包含帐户信息的实体,很容易知道它有电子邮件信息

(keys <account entity>) 
;; => [:account/user :account/email]

(:account/email <account entity>) 
;; => <email entity>

但另一方面,如果我查看电子邮件实体的密钥,我不知道它有关联的帐户信息。

(keys <email entity>) 
;; => [:email/name :email/type]

(:account/_email <email entity>) 
;; => <account entity>

:account/_email如果没有反复试验,如何发现这是一个有效的密钥?

4

2 回答 2

2

要检查密钥是否有效,您可以使用:

(.containsKey <email entity> :account/_email)
;; => true

为了获得所有有效的实体密钥,包括反向密钥:

(.touch <email entity>)
(keys (.cache <email entity>))

请注意,(keys)直接在实体上调用仅返回转发键。

在类似的架构上进行了测试。

旁注:除了

(:account/_email <email entity>)

您还可以查询以获取已链接指定电子邮件的帐户:

(q '[:find ?a :in $ ?e :where [?a :account/email ?e] ] (db conn) (:db/id <email entity>))
于 2013-03-26T16:43:21.397 回答
0

尝试以下查询(未测试):

(q '[:find ?attrs
     :in $ ?e
     :where [_ ?attrs ?e]]
    my-db my-entity)
于 2013-04-05T18:36:12.053 回答