我想将深层嵌套的树结构交易到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吗?
提前致谢。
答案 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)