Estoy tratando de hacer una 'combinación externa' en Datomic a través de la API REST. De https://github.com/Datomic/day-of-datomic/blob/master/tutorial/social_news.clj He tomado el ejemplo final:Usando una función de base de datos en una consulta dactómica
(defn maybe
"Returns the set of attr for e, or nil if e does not possess
any values for attr."
[db e attr]
(seq (map :a (d/datoms db :eavt e attr))))
;; find all users
(q '[:find ?e ?upvote
:where
[?e :user/email]
[(user/maybe $ ?e :user/upVotes) ?upvote]]
(db conn))
insertar el mejor funcionan en mi base de datos, y que puede ser consultada por lo tanto:
[:find ?n ?v :in $ :where [?e ?a ?v] [?a :db/ident :db/fn] [?e :db/ident ?n]]
vuelve
:maybe #db/fn{:code "(seq (map :a (d/datoms db :eavt e attr)))", :params [db e attr], :requires [], :imports [], :lang :clojure}
Sin embargo, no puedo averiguar cómo llamar a la función en una consulta. Tengo un atributo :data/user
en algunas transacciones, y quiero obtener el valor donde existe. Aquí está la consulta que estoy tratando de ejecutar; Me gustaría que :maybe
sea la función de base de datos definida anteriormente.
[:find ?attr ?v ?when ?who :where
[17592186045423 ?a ?v ?tx true]
[?a :db/ident ?attr]
[(:maybe $ ?tx :data/user) ?who]
[?tx :db/txInstant ?when]]
Estoy bastante seguro de que me falta algo bastante obvio, pero he estado atascado en esto por un día. ¡Gracias por cualquier ayuda!
Por supuesto, puede definir una función que no sea de base de datos que llame a d/invoke por usted, y simplemente llame desde dentro de la consulta. Puede hacer que la consulta sea más legible si elige un buen nombre. – Brian