2017-02-21 52 views
1

如何使用其实体ID使用pull方法检索实体?我使用了事务来添加一些数据/事实(正确的措辞?)到我的数据库。我可以看到实体的ID,如果我喜欢一个简单的查询:如何使用datomic的pull方法通过其实体ID获取实体?

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

其结果是:

{[17592186045418] [17592186045420] [17592186045423]}

现在我我想用pull来检索其中的一个。但是,拉的文档中的示例使用示例,其中所讨论的实体与id相关联。

具体地,文档表示示例从MusicBrainz的样本的数据集,以及他们建议的样品是:

(pull db '[*] led-zeppelin)

其中(虽然该文档不显示此)导致-飞艇具有被定义像这样(如可以看到here

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

的文档说拉命令采用三件事情:一个分贝,选择器图案确定我认为为每个实体提供了哪些属性,以及实体的“eid”。所以上面的led-zeppelin var是某种方式的eid。

我并不真正遵循那里发生的事情。 :artist/gid是一个在musicbrainz模式中定义的id属性,而第三项看起来就像是特定的id。我不确定#uuid是什么。

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

+0

“使用查询的拉式表达式”位于链接文件的最底部。 – ClojureMostly

+0

@ClojureMostly我想了解如何使用'pull'功能 – fraxture

回答

2

这里的解决方案很简单。只需直接在实体身份证号码下降:

(d/pull db '[*] 17592186045418)

我会犯的错误是使用EID作为字符串,即通过双引号。

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概念。

+0

这很有帮助。我在这里咆哮的唯一事情是我的实体有嵌套的组件,我猜它也需要递归地强制到地图中......一旦我发现eid只能用作数字,并且使用pull方法,这很好,因为它将整个结构作为常规数据结构返回。 – fraxture

3

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

+0

你可以举一个例子,看看使用查询返回的ID之一的样子吗?因为我试图没有成功......可能只是一个语法错误。或者你的意思是我会(像@AlanThompson建议的那样)使用'entity'方法? – fraxture

相关问题