Graph 如何将嵌套贴图转换为一组边

Graph 如何将嵌套贴图转换为一组边,graph,clojure,Graph,Clojure,我有一个嵌套贴图中的图形,我想将其转换为一组带有节点ID、节点标签和边标签的边: #{{:edge/from 17592186325348 :edge/to 17592186325351 :edge/label :A2 :edge/from_node_label "a" :edge/to_node_label "l"}} 这里,我展示了在下面的数据结构中出现两次的edge a->l的所需格式。数据结构以源节点开始。儿童对其他目标进行编码:edge_label是从父对象到子对象的定向边的标

我有一个嵌套贴图中的图形,我想将其转换为一组带有节点ID、节点标签和边标签的边:

#{{:edge/from 17592186325348 :edge/to 17592186325351 
:edge/label :A2 
:edge/from_node_label "a" :edge/to_node_label "l"}} 
这里,我展示了在下面的数据结构中出现两次的edge a->l的所需格式。数据结构以源节点开始。儿童对其他目标进行编码:edge_label是从父对象到子对象的定向边的标签

我猜递归解决方案最简单

{:db/id 17592186325353,
 :predicate/children [{:db/id 17592186325357,
                       :predicate/children [{:db/id 17592186325348,
                                             :predicate/children [{:db/id 17592186325351,
                                                                   :predicate/children [],
                                                                   :node_label "l",
                                                                   :edge_label :A1}],
                                             :node_label "a",
                                             :edge_label :A2}],
                       :node_label "m",
                       :edge_label :A2}
                      {:db/id 17592186325348,
                       :predicate/children [{:db/id 17592186325351,
                                             :predicate/children [],
                                             :node_label "l",
                                             :edge_label :A1}],
                       :node_label "a",
                       :edge_label :A1}],
 :node_label "e"}
这是一个图表,因为在a处有一个循环。 然而,为了可视化的目的,我滥用了根状茎的视图树:

给出:

({:edge/from 17592186325353,
  :edge/to 17592186325357,
  :edge/from_node_labe "e",
  :edge/to_node_label "m",
  :edge/label :A2}
 {:edge/from 17592186325353,
  :edge/to 17592186325348,
  :edge/from_node_labe "e",
  :edge/to_node_label "a",
  :edge/label :A1}
 {:edge/from 17592186325357,
  :edge/to 17592186325348,
  :edge/from_node_labe "m",
  :edge/to_node_label "a",
  :edge/label :A2}
 {:edge/from 17592186325348,
  :edge/to 17592186325351,
  :edge/from_node_labe "a",
  :edge/to_node_label "l",
  :edge/label :A1}
 {:edge/from 17592186325348,
  :edge/to 17592186325351,
  :edge/from_node_labe "a",
  :edge/to_node_label "l",
  :edge/label :A1})

我不确定这是否是最简单的。

a没有循环。从e到a有两条路径。而且结构看起来是多余的。是吗?:a下面的图表重复,使用相同的方法;边标签和:节点标签,但不同的是:db/ids,是的,我以一种糟糕的方式生成了这个图。您是对的,在这个数据结构中,边a->l出现了两次。如果我能得到一组边,那就最好了。我对这个问题增加了更多的描述。在我的想象中,我觉得宽度优先遍历将是一个接一个地处理边的最简单方法。但是,我不确定在没有队列的情况下是否能以更有效的方式进行。
({:edge/from 17592186325353,
  :edge/to 17592186325357,
  :edge/from_node_labe "e",
  :edge/to_node_label "m",
  :edge/label :A2}
 {:edge/from 17592186325353,
  :edge/to 17592186325348,
  :edge/from_node_labe "e",
  :edge/to_node_label "a",
  :edge/label :A1}
 {:edge/from 17592186325357,
  :edge/to 17592186325348,
  :edge/from_node_labe "m",
  :edge/to_node_label "a",
  :edge/label :A2}
 {:edge/from 17592186325348,
  :edge/to 17592186325351,
  :edge/from_node_labe "a",
  :edge/to_node_label "l",
  :edge/label :A1}
 {:edge/from 17592186325348,
  :edge/to 17592186325351,
  :edge/from_node_labe "a",
  :edge/to_node_label "l",
  :edge/label :A1})