【发布时间】:2016-11-09 13:53:24
【问题描述】:
我想用 datomic 表示下面的 SQL 查询
选择 A.a C.c 从 A、B、C WHERE A.id = B.id 和 B.index = C.index
这将是什么数据查询表示?
此外,如果 WHERE 条件相反,即我们有“B.index = C.index and A.id = B.id”,相同的 datomic 查询是否有效?
【问题讨论】:
标签: datomic
我想用 datomic 表示下面的 SQL 查询
选择 A.a C.c 从 A、B、C WHERE A.id = B.id 和 B.index = C.index
这将是什么数据查询表示?
此外,如果 WHERE 条件相反,即我们有“B.index = C.index and A.id = B.id”,相同的 datomic 查询是否有效?
【问题讨论】:
标签: datomic
这里是直译:
(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 子句中的 = 执行相同的工作。
这些子句无论如何都可以重新排序,并且在逻辑上保持等效。不同之处在于性能:将最狭窄/具体的子句放在首位以获得更好的性能。
一些注意事项:
您是否希望index 和id 概念具有不同的属性(例如a.index 和b.index 或仅index)取决于您的要求。 Datomic 有很好的docs 和教程。
SQL 和 Datalog 之间有许多不同之处,例如 Datalog 中没有表(意味着变量名称 ?A、?B、?C 是任意的),但这些都有很好的文档记录。
【讨论】: