1

如何pull通过实体 ID 使用该方法检索实体?我已经使用事务向我的数据库添加了一些 datoms/facts(正确的措辞?)。如果我执行以下简单查询,我可以看到实体 ID:

[:find ?e
 :where
 [?e :arb/value]
]

结果是:

{[17592186045418] [17592186045420] [17592186045423]}

现在我想使用pull检索其中之一。但是,拉取文档中的示例使用了相关实体与 id 相关联的示例。

具体来说,文档引用了 musicbrainz 示例数据集中的示例,他们建议的示例是:

(pull db '[*] led-zeppelin)

其中(尽管文档没有显示)led-zeppelin 的定义是这样的(可以在这里看到:

(def led-zeppelin [:artist/gid #uuid "678d88b2-87b0-403b-b63d-5da7465aecc3"])

文档说拉命令需要三件事:一个数据库,一个选择器模式,确定我认为为每个实体提取哪些属性,以及实体的“eid”。所以上面的led-zeppelinvar 在某种程度上是开斋节。

我并不完全了解那里发生的事情。:artist/gid 似乎是在 musicbrainz 的模式中定义的 id 属性,第三项看起来像特定的 id。我不确定#uuid 是什么。

但是,就我而言,我没有为我的实体定义 id 属性。我希望能够使用我认为默认分配给每个实体的唯一实体 ID。这可能吗?如果是这样,这将如何完成?

4

3 回答 3

3

拉取第三个参数是对实体的引用。您可以使用查询返回的 ID 之一,也可以使用查找 ref,例如在 led-zepplin 示例中,您可以在其中使用唯一属性值引用实体。

于 2017-02-21T19:44:29.863 回答
3

这里的解决方案很简单。直接输入实体ID号即可:

(d/pull db '[*] 17592186045418)

我犯的错误是将 eid 用作字符串,即双引号。

于 2017-02-22T07:49:00.947 回答
2

查询的目的是在给定一个或多个属性的情况下找到某事物的 EID。如果您已经知道 EID,则不需要查询,只需检索该实体的 attr/val 对。所以使用entity函数:

(let [eid  12345
      result (into {} (d/entity db eid)) ]
  (println result))

请注意,结果(d/entity ...)是惰性的,您需要将其强制转换为 clojure 映射以查看所有项目。

除了Datomic 自己的文档之外,您还可以在 Tupelo Datomic 库中找到更多示例和单元测试。除了包含许多便利功能外,詹姆斯邦德示例还有助于阐明一些 Datomic 概念。

于 2017-02-21T13:30:28.110 回答