Datomic组件ID

时间:2014-09-17 14:55:26

标签: clojure datomic

我想将深层嵌套的树结构交易到Datomic中。示例数据结构:

{:tree/id (d/tempid :db.part/user),
 :tree/nodes [
   {:node/name "Node1",
    :node/parent "root-node-ref",
    :node/tasks {"task-entities-map"}},
   {:node/name "Node2",
    :node/parent "node1-ref",
    :node/tasks {"task-entities-map"}}]}

这里Node2是Node1的子节点,Node1是某个根节点的子节点。

http://blog.datomic.com/2013/06/component-entities.html处的Datomic docs表明没有必要为嵌套映射指定temp id,因为它们将自动创建(假设:db / isComponent设置为true:tree / nodes,:node /任务等。)。

问题是:我如何在这里指定父子关系,如下所示:node / parent attributes?我想避免必须指定节点子节点,例如by:node / children属性。并且Datomic会自动为节点/任务列表中的实体指定临时ID吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

{:db/id (d/tempid :db.part/user),
 :tree/nodes 
 [{:db/id (d/tempid :db.part/user -1),
   :db/name "Node1",
   :node/parent (:db/id root-node)} ;; assuming you have queried root-node
  {:node/name "Node2",
   :node/parent (d/tempid :db.part/user -1)}]

d/tempid的文档字符串:

  

在单个事务的范围内,tempids始终如一地映射   永久性的。 n的值从-1到-1000000(含)   保留给用户创建的时间。

像这样找到Node1的孩子

 (d/q '[:find ?children
        :where [?node-1 :node/name "Node1"]
               [?children :node/parent ?node-1]] 
      (d/db conn))

或者,假设您已查询node1,请通过

查找其子项
 (:node/_parent node1)
相关问题