【问题标题】:How can I use datomic's pull method to grab an entity by its entity id?如何使用 datomic 的 pull 方法通过实体 id 抓取实体?
【发布时间】:2017-02-21 10:00:56
【问题描述】:

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

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

结果是:

{[17592186045418] [17592186045420] [17592186045423]}

现在我想使用pull 检索其中一个。但是,文档中的 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 在某种程度上就是开斋节。

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

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

【问题讨论】:

  • “使用查询的拉取表达式”位于链接文件的最底部。
  • @ClojureMostly 我想了解如何使用pull 函数

标签: clojure datomic datalog


【解决方案1】:

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

【讨论】:

  • 您能否举例说明使用查询返回的其中一个 ID 会是什么样子?因为我试过没有成功......可能只是一个语法错误。或者你的意思是我会(正如@AlanThompson 建议的那样)使用entity 方法?
【解决方案2】:

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

(d/pull db '[*] 17592186045418)

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 这很有帮助。我在这里咆哮的唯一一件事是我的实体有嵌套组件,我想这也需要递归地强制到地图中......一旦我发现 eid 可以用作数字,并使用 pull 方法,这很好,因为它将整个结构作为常规数据结构返回。
    猜你喜欢
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多