предложение or в datomic

#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»