Конвертер двухатомных запросов из 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 произвольны), но опять же, это все хорошо документировано.