Datomic - объединяет объекты, где нет ссылки

Мой вопрос: есть ли способ объединить два объекта в Dataomic, у которых нет ссылки в схеме, не прибегая к написанию двух вложенных итераторов (ручное соединение).

В Datomic Doco они дают пример запроса с указанием двух параметров.

[:find ?n ?u
 :where
 [?c :community/name ?n]
 [?c :community/url ?u]]

Они называют это «объединением», потому что базовая структура представляет собой базу данных «ключ-значение», поэтому даже атрибуты одного и того же объекта должны быть «объединены» вместе.

Затем они приводят пример соединения между двумя объектами, имеющими ссылку (предположим, что ссылка определена в схеме, которая здесь не показана):

[:find ?c_name
 :where
 [?c :community/name ?c_name]
 [?c :community/neighborhood ?n]
 [?n :neighborhood/district ?d]
 [?d :district/region :region/ne]]

Мой вопрос: возможен ли запрос, подобный приведенному выше, без ссылки в схеме? Или мне придется прибегнуть к написанию итератора и просмотру результатов?


person hawkeye    schedule 30.01.2013    source источник


Ответы (1)


Любая переменная, которая встречается более одного раза в предложении :where, неявно объединяется.

Таким образом, вы можете запросить имена, которые принадлежат как сообществу, так и соседству.

(def results (q '[:find ?name :where [_ :neighborhood/name ?name] 
                                     [_ :district/name ?name]] 
                 (db conn)))

Это то, о чем вы просили? (в этом примере идентификаторы просто игнорируются)

person Falko    schedule 31.01.2013