如何使用datomic的pull方法按实体ID获取实体?

时间:2017-02-21 10:00:56

标签: clojure datomic datalog

如何通过实体ID使用pull方法检索实体?我用transact将一些数据/事实(正确的措辞?)添加到我的数据库中。如果我做一个简单的查询,我可以看到实体ID:

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

结果是:

  

{[17592186045418] [17592186045420] [17592186045423]}

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

具体来说,文档是指musicbrainz样本数据集中的一个示例,他们建议的样本是:

(pull db '[*] led-zeppelin)

其中(虽然文档没有显示这一点)led-zeppelin的定义是这样的(可以看出here

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

文档说pull命令有三个方面:db,一个选择器模式,确定我认为为每个实体提取了哪些属性,以及实体的“eid”。所以上面的led-zeppelin var就是eid。

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

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

3 个答案:

答案 0 :(得分:3)

Pulls第三个参数是对实体的引用。您可以使用查询返回的ID之一,也可以使用lookup ref,就像在led-zepplin示例中一样,您可以使用唯一属性值来引用实体。

答案 1 :(得分:2)

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

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

请注意(d/entity ...)的结果是懒惰的,您需要强制它进入clojure地图以查看所有项目。

Datomic's own documentation外,您还可以找到更多示例和单元测试in the Tupelo Datomic library。除了包含许多便利功能外,the James Bond example还有助于澄清一些Datomic概念。

答案 2 :(得分:2)

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

(d/pull db '[*] 17592186045418)

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