如何通过实体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。这可能吗?如果是这样,将如何做?
答案 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用作字符串,即双引号。