【问题标题】:Datomic component ids原子组件 ID
【发布时间】:2014-09-17 14:55:25
【问题描述】:

我想将深度嵌套的树结构转换为 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 文档表明没有必要为嵌套映射指定临时 ID,因为它们将自动创建(假设 :db/isComponent 对于 :tree/nodes、:node/tasks 等设置为 true .).

问题是:我如何在这里指定父子关系,由 :node/parent 属性给出?我想避免必须指定节点子节点,例如通过 :node/children 属性。 Datomic 是否会自动为 :node/tasks 列表中的实体指定临时 ID?

提前致谢。

【问题讨论】:

    标签: clojure datomic


    【解决方案1】:
    {: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 的文档字符串:

    在单个事务的范围内,tempid 始终映射到 永久身份证。 n 的值从 -1 到 -1000000(含)为 为用户创建的 tempids 保留。

    像这样找到 Node1 的子节点

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

    或者,假设你已经查询了node1,通过

    找到它的孩子
     (:node/_parent node1)
    

    【讨论】:

    • 对不起,我为变量(子节点)使用了错误的名称,这一定会让您感到困惑。将更改子节点以说出任务并更新原始问题。 “任务”是不包括在原始层次结构中的实体列表。这样只有 :node/parents 指定,但没有 :node/sub-nodes。
    • 我已经相应地修改了答案。
    • 谢谢!但是必须纠正临时生成,以便节点和任务的负值不同。
    猜你喜欢
    • 2015-01-21
    • 2021-06-08
    • 2017-10-15
    • 2021-01-24
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    相关资源
    最近更新 更多