我想在datomic
中表示以下SQL查询SELECT A.a C.c. 从A,B,C 在哪里A.id = B.id和B.index = C.index
这将是什么样的数据组查询表示?
此外,如果WHERE条件被反转,那么相同的数据组查询是否有效,即我们有" B.index = C.index和A.id = B.id"?
答案 0 :(得分:0)
以下是字面翻译:
(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)
我写过,所以你应该能够看到如何从问题转化为答案。
希望很明显在SQL where子句中与?index
执行相同工作的两个地方使用=
。
条款无论如何都可以重新排序,并且在逻辑上保持等价。不同之处在于性能:将最窄/特定的条款放在首位以获得更好的性能。
一些警告:
是否要为index
和id
概念(例如a.index
和b.index
或仅index
)设置不同的属性取决于您的要求。 Datomic有很好的docs和教程。
SQL和Datalog之间存在许多差异,例如Datalog中没有表(意思是变量名?A,?B,?C是任意的),但这一点都有详细记录。