来自 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 个子句放在首位以获得更好的性能。

一些注意事项:

是否要为 indexid 概念(例如 a.indexb.index 或仅 index 设置不同的属性已关闭根据您的要求。 Datomic 有很好的 docs 和教程。

SQL 和 Datalog 之间有很多区别,例如 Datalog 中没有表格(意思是变量名称?A,?B,?C 是任意的),但是同样,这都是有据可查的。