Как запросить атрибуты нескольких значений?

Протестировано на датаскрипте 1.3.0

датомы:

      [{:db/id -1 :name "Oliver Smith" :hobbies ["reading" "sports" "music"]}] 

попытался выполнить запрос ниже, чтобы найти тех, кто любит спорт, но вернулся пустой набор.

      '[:find ?name
  :where
  [?p :name ?name]
  [?p :hobbies ?hobbies]
  [(some #{"sports"} ?hobbies)]] 

Как правильно сформулировать запрос, чтобы получить ожидаемый результат ниже?

      #{[Oliver Smith]}

1 ответ

Мы должны явно определить схему с помощью cardinality/manyпротив атрибута нескольких значений, чтобы решить проблему, поскольку бессхемный здесь не работает.

      (require '[datascript.core :as d])

(def schema {:hobbies {:db/cardinality db.cardinality/many}})
(def conn (d/create-conn schema))

(def datoms [{:db/id -1 :name "Oliver Smith" :hobbies ["reading" "sports" "music"]}])
(d/transact! conn datoms)

(def query '[:find ?name :where [?p :name ?name] [?p :hobbies "sports"]])
(-> (d/q query @conn) println)
Другие вопросы по тегам