在datomic中,如何找出可用于反向查找的键?

时间:2013-03-26 03:49:59

标签: clojure 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是有效密钥?

2 个答案:

答案 0 :(得分: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>))

答案 1 :(得分:0)

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

(q '[:find ?attrs
     :in $ ?e
     :where [_ ?attrs ?e]]
    my-db my-entity)