в datomic как можно узнать, какие ключи доступны для обратного просмотра?

В следующем примере используется упрощенная установка 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 является допустимым ключом без проб и ошибок?


person zcaudate    schedule 26.03.2013    source источник


Ответы (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>))
person Grzegorz Luczywo    schedule 26.03.2013
comment
Нет, это определенно работает с сущностями. Найдите «обратный» в docs.datomic.com/tutorial.html. - person zcaudate; 27.03.2013
comment
Ты прав. Я также неправильно понял ваш вопрос. Положительным моментом является то, что я нашел метод containsKey на EntityMap, который должен выполнять эту работу. Отредактировал ответ. - person Grzegorz Luczywo; 02.04.2013
comment
блестяще! благодарю вас. Я бы точно не разобрался с методом .cache - person zcaudate; 15.04.2013

Попробуйте выполнить следующий запрос (не проверено):

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