#clojure #datomic
#clojure #datomic
Вопрос:
Я работаю с or
предложением в datomic. Я знаю, что, используя or
в этом запросе, я получаю пользователей с :user/first-name "Mia"
и пользователей с. :user/first-name "Wallace"
(d/q
'[:find ?u
:where
(or [?u :user/first-name "Mia"]
[?u :user/last-name "Wallace"])]
(d/db conn))
Но я хотел бы предложение, которое работает как у Clojure or
. Вот и все, я хочу, чтобы пользователи имели: user / first-name «Mia», а если нет, я хочу найти те, с :user/last-name "Lucas"
которыми . Возможно ли это сделать в одном запросе? Я знаю, что могу сделать это с помощью двух запросов.
Ответ №1:
Вы можете сделать это, используя либо привязку коллекции, либо привязку отношения. Из документов:
Привязка коллекции привязывает одну переменную к нескольким значениям, переданным в качестве коллекции. Это можно использовать, чтобы задавать вопросы «или», т.Е. Какие релизы связаны с Полом Маккартни или Джорджем Харрисоном?
;; query
[:find ?release-name
:in $ [?artist-name ...]
:where [?artist :artist/name ?artist-name]
[?release :release/artists ?artist]
[?release :release/name ?release-name]]
;; inputs
db, ["Paul McCartney" "George Harrison"]
;; result
#{["My Sweet Lord"]
["Electronic Sound"]
["Give Me Love (Give Me Peace on Earth)"]
["All Things Must Pass"]
...}
Комментарии:
1. Спасибо, но это имеет тот же эффект
or-join
, что и возвращает результаты как для «Paul McCartney», так и для «George Harrison»