来自 SQL 的数据查询转换器
datomic query converter from SQL
我想在 datomic
中表示以下 SQL 查询
SELECT A.a C.c
从 A、B、C
其中 A.id = B.id 和 B.index = C.index
这将是什么数据查询表示?
此外,如果 WHERE 条件颠倒,即我们有 "B.index = C.index and A.id = B.id",相同的数据查询是否有效?
直译如下:
(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 where 子句中的 =
的作用相同。
这些子句无论如何都可以重新排序并在逻辑上保持等价。不同之处在于性能:将最多 narrowing/specific 个子句放在首位以获得更好的性能。
一些注意事项:
是否要为 index
和 id
概念(例如 a.index
和 b.index
或仅 index
设置不同的属性已关闭根据您的要求。 Datomic 有很好的 docs 和教程。
SQL 和 Datalog 之间有很多区别,例如 Datalog 中没有表格(意思是变量名称?A,?B,?C 是任意的),但是同样,这都是有据可查的。
我想在 datomic
中表示以下 SQL 查询SELECT A.a C.c 从 A、B、C 其中 A.id = B.id 和 B.index = C.index
这将是什么数据查询表示?
此外,如果 WHERE 条件颠倒,即我们有 "B.index = C.index and A.id = B.id",相同的数据查询是否有效?
直译如下:
(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 where 子句中的 =
的作用相同。
这些子句无论如何都可以重新排序并在逻辑上保持等价。不同之处在于性能:将最多 narrowing/specific 个子句放在首位以获得更好的性能。
一些注意事项:
是否要为 index
和 id
概念(例如 a.index
和 b.index
或仅 index
设置不同的属性已关闭根据您的要求。 Datomic 有很好的 docs 和教程。
SQL 和 Datalog 之间有很多区别,例如 Datalog 中没有表格(意思是变量名称?A,?B,?C 是任意的),但是同样,这都是有据可查的。