数据拉取表达式

Datomic pull expression

我在这里阅读有关 Datomic 拉语法的信息:

http://docs.datomic.com/pull.html

它在通配符下解释说,像 [*] 这样的模式将拉取一个实体并递归地拉取其实体属性。直接引用:

The wildcard specification * pulls all attributes of an entity, and recursively pulls any component attributes:

;; pattern
[*]

;; result
{:release/name "The Concert for Bangla Desh",
 :release/artists [{:db/id 17592186049854}],
 :release/country {:db/id 17592186045504},
 :release/gid #uuid "f3bdff34-9a85-4adc-a014-922eef9cdaa5",
 :release/day 20,
 :release/status "Official",
 :release/month 12,
 :release/artistCredit "George Harrison",
 :db/id 17592186072003,
 :release/year 1971,
 :release/media
 [{:db/id 17592186072004,
   :medium/format {:db/id 17592186045741},
   :medium/position 1,
   :medium/trackCount 2,
   :medium/tracks
   [{:db/id 17592186072005,
     :track/duration 376000,
     :track/name "George Harrison / Ravi Shankar Introduction",
     :track/position 1,
     :track/artists [{:db/id 17592186048829} {:db/id 17592186049854}]}
    {:db/id 17592186072006,
     :track/duration 979000,
     :track/name "Bangla Dhun",
     :track/position 2,
     :track/artists [{:db/id 17592186048829}]}]}
  ...
  ]}

但是,当我自己尝试时,我只得到 ref 类型的 db/id 值。我基本上必须在 pull 表达式中以更详细的方式调用任何 ref 类型,如下所示:

[* {:content/type [:db/ident] :content/locales [:db/ident] :content/groups [*]}]

这甚至还没有结束,因为 :content/groups 本身就有 ref 类型。通配符的行为是否在某些时候发生了变化并且文档不是最新的?还是我做错了什么?有没有更好(更简洁)的方式来表达 "just recursively pull it all in"?

拉表达式中的通配符仅填充组件属性。即,架构中具有 :db/isComponent true 的属性。

查看 mbrainz schema,只有 :release/media:medium/tracks 是组件属性,因此它们将是唯一填充有 [*] 拉模式的属性。

如果您的数据模型包含分层引用链(即 :person/friend 作为对任何人的引用,可能也引用了朋友),您可以定义 recursive pull patterns 并指定它们的递归深度(或使用 ... 表示无界)。

此主题也在 Datomic Google Group 上进行了讨论,并包括 link 示例递归拉取模式。