Clojure Datomic组件ID

Clojure Datomic组件ID,clojure,datomic,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 {

我想将深度嵌套的树结构转换为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是某个根节点的子节点

位于的Datomic文档表明无需为嵌套映射指定临时ID,因为它们将自动创建(假设:树/节点、:节点/任务等的:db/isComponent设置为true)

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

提前谢谢

{: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的Docstring

在单个事务的范围内,tempid一致地映射到 永久居民身份证。从-1到-1000000(含)的n值为 为用户创建的临时ID保留

找到像这样的节点1的子节点

 (d/q '[:find ?children
        :where [?node-1 :node/name "Node1"]
               [?children :node/parent ?node-1]] 
      (d/db conn))
或者,假设您查询了
节点1
,则通过

 (:node/_parent node1)

很抱歉,我为变量(子节点)使用了错误的名称,这一定使您感到困惑。将子节点更改为“任务”并更新原始问题。““任务”是未包含在原始层次结构中的实体列表。因此,只指定了:节点/父节点,而不是:节点/子节点。我已相应地修改了答案。谢谢!但必须纠正tempid生成,以便节点和任务的负值不同。