Конвертер двухатомных запросов из SQL

Я хочу представить следующий запрос SQL в Datomic

ВЫБЕРИТЕ Aa Cc ОТ A, B, C, ГДЕ A.id = B.id и B.index = C.index

Что для этого будет представлять двухатомный запрос?

Кроме того, будет ли работать тот же самый двухатомный запрос, если условия ГДЕ меняются местами, то есть у нас есть "B.index = C.index и A.id = B.id"?

1 ответ

Решение

Вот буквальный перевод:

(d/q '[:find ?a-val ?c-val
       :where
       [?A :a.id ?id]
       [?B :b.id ?id]
       [?B :b.index ?index]
       [?C :c.index ?index]
       [?A :a ?a-val]
       [?C :c ?c-val]]
  db)

Я написал это, чтобы вы могли видеть, как переводить с вопроса на ответ.

Надеюсь, понятно, что с помощью ?index в двух местах, которые делают ту же работу, что и = в предложении SQL где.

Пункты могут быть переупорядочены в любом случае и остаются логически эквивалентными. Разница будет в производительности: ставьте сначала наиболее узкие / специфические предложения для лучшей производительности.

Некоторые предостережения:

Хотите ли вы иметь различные атрибуты для index а также id концепции (например, a.index а также b.index или только index) до ваших требований. Datomic имеет хорошие документы и учебные пособия.

Существует много различий между SQL и Datalog, например, нет таблиц в Datalog (это означает, что имена переменных?A,?B,?C произвольны), но опять же, это все хорошо документировано.

Другие вопросы по тегам