Datomic запрос: найти все объекты с некоторым значением

С этим запросом:

{:find  [?e]
         :where [[?e :db/valueType :db.type/string]]}

Я могу найти все объекты со свойством с именем :db/valueType и значением :db.type/string. В моем случае с некоторыми данными в базе данных он возвращает десять идентификаторов.

Как мне искать все объекты со значением :db.type/string независимо от имени свойства? Например, этот запрос:

{:find  [?e]
         :where [[?e _ :db.type/string]]}

возвращает пустой набор. Насколько я понимаю журнал данных Datomic, _ должен работать как подстановочный знак, соответствующий чему угодно, поэтому второй запрос должен возвращать как минимум такое же количество результатов, как и первый, а может быть, даже больше.

Спасибо...


person kmelvn    schedule 03.07.2014    source источник


Ответы (1)


В этом примере логическая структура запроса по существу верна, но ключевое слово атрибута ident не преобразуется в идентификатор объекта. Обратите внимание, что это особый случай, когда вы запрашиваете атрибуты в качестве входных данных — сценарий, в котором обработчик запросов не гарантирует выполнение такого преобразования. См. документацию Datomic по запросу (http://docs.datomic.com/query.html). для «Атрибуты как входные данные запроса».

Способ реструктуризации этого запроса выглядит следующим образом:

    (let [db (d/db conn)] 
            (d/q '[:find ?e 
                   :in $ ?id 
                   :where [?e _ ?id]] 
             db (d/entid db :db.type/string)))

В этом случае мы разрешаем ключевое слово :db.type/string в его идентификатор сущности вручную во входных данных для параметризованного запроса.

person Ben Kamphaus    schedule 04.07.2014
comment
Спасибо, это имеет смысл: типы также являются сущностями. Это довольно элегантно, но иногда можно забыть о его сущностях на всем пути вниз! Принятие ответа... - person kmelvn; 08.07.2014