如何使用 datomic 的 pull 方法通过实体 ID 获取实体?
How can I use datomic's pull method to grab an entity by its entity id?
如何使用 pull
方法通过实体 ID 检索实体?我已经使用 transact 向我的数据库添加了一些 datoms/facts(正确的措辞?)。如果我执行一个简单的查询,我可以看到实体 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 命令需要三个东西:一个数据库,一个选择器模式,我认为确定为每个实体拉取哪些属性,以及实体的“eid”。所以上面的 led-zeppelin
var 在某种程度上是开斋节。
我并不完全了解那里发生的事情。 :artist/gid 似乎是在 musicbrainz 的模式中定义的 id 属性,第三项看起来像特定的 id。我不确定#uuid 是什么。
但是,就我而言,我没有为我的实体定义任何 id 属性。我希望能够使用我认为默认分配给每个实体的唯一实体 ID。这可能吗?如果是这样,这将如何完成?
查询的目的是在给定一个或多个属性的情况下查找某物的 EID。如果您已经知道 EID,则不需要查询,您只想检索该实体的 attr/val 对。所以使用entity
函数:
(let [eid 12345
result (into {} (d/entity db eid)) ]
(println result))
请注意 (d/entity ...)
的结果是惰性的,您需要将其强制转换为 clojure 映射才能查看所有项目。
此外 Datomic's own documentation, you can find more examples and unit tests in the Tupelo Datomic library. Besides containing many convenience functions, the James Bond example 有助于澄清一些 Datomic 概念。
拉取第三个参数是对实体的引用。您可以使用查询返回的 ID 之一,也可以使用 lookup ref,就像在 led-zepplin 示例中一样,您在其中使用唯一属性值来引用实体。
这里的解决方法很简单。直接输入实体编号即可:
(d/pull db '[*] 17592186045418)
我犯的错误是将 eid 用作字符串,即双引号。
如何使用 pull
方法通过实体 ID 检索实体?我已经使用 transact 向我的数据库添加了一些 datoms/facts(正确的措辞?)。如果我执行一个简单的查询,我可以看到实体 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 命令需要三个东西:一个数据库,一个选择器模式,我认为确定为每个实体拉取哪些属性,以及实体的“eid”。所以上面的 led-zeppelin
var 在某种程度上是开斋节。
我并不完全了解那里发生的事情。 :artist/gid 似乎是在 musicbrainz 的模式中定义的 id 属性,第三项看起来像特定的 id。我不确定#uuid 是什么。
但是,就我而言,我没有为我的实体定义任何 id 属性。我希望能够使用我认为默认分配给每个实体的唯一实体 ID。这可能吗?如果是这样,这将如何完成?
查询的目的是在给定一个或多个属性的情况下查找某物的 EID。如果您已经知道 EID,则不需要查询,您只想检索该实体的 attr/val 对。所以使用entity
函数:
(let [eid 12345
result (into {} (d/entity db eid)) ]
(println result))
请注意 (d/entity ...)
的结果是惰性的,您需要将其强制转换为 clojure 映射才能查看所有项目。
此外 Datomic's own documentation, you can find more examples and unit tests in the Tupelo Datomic library. Besides containing many convenience functions, the James Bond example 有助于澄清一些 Datomic 概念。
拉取第三个参数是对实体的引用。您可以使用查询返回的 ID 之一,也可以使用 lookup ref,就像在 led-zepplin 示例中一样,您在其中使用唯一属性值来引用实体。
这里的解决方法很简单。直接输入实体编号即可:
(d/pull db '[*] 17592186045418)
我犯的错误是将 eid 用作字符串,即双引号。