Datomic拉表达式

时间:2016-06-08 18:16:27

标签: clojure datomic

我在这里阅读有关Datomic pull语法的内容:

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

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

  

通配符规范*提取实体的所有属性,并递归地提取任何组件属性:

;; 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}]}]}
  ...
  ]}

但是,当我自己尝试此操作时,我只会获得db/id类型的ref值。我必须在pull表达式中以更冗长的方式调出任何ref类型,如下所示:

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

这实际上并不是它的结尾,因为:content/groups本身内部有ref种类型。通配符的行为是否在某些时候发生了变化而且文档不是最新的?或者我做错了什么?是否有一种更好(更简洁)的方式去说,"只是递归地将它全部拉入"?

1 个答案:

答案 0 :(得分:2)

pull表达式中的通配符仅填充组件属性。也就是说,架构中的:db/isComponent true属性。

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

如果您的数据模型包含分层参考链(即:person/friend作为对任何人的引用,也可能引用了朋友),您可以定义recursive pull patterns并指定其递归深度(或使用{ {1}}无限制。)

本主题也在Datomic Google Group上讨论,并包含一个示例递归拉模式的链接。