如何为导出目的在Erlang或Elixir中序列化有向图

时间:2018-12-16 01:04:46

标签: erlang elixir

我正在使用Erlang's digraph module存储有向无环图(DAGs)。因此,为了论证,这里是一个超级简单的图(使用Elixir):

gr = :digraph.new()
:digraph.add_vertex(gr, "A")
:digraph.add_vertex(gr, "B")
:digraph.add_vertex(gr, "C")
:digraph.add_edge(gr, "A", "B")
:digraph.add_edge(gr, "A", "C")

如下所示:

enter image description here

我们可以看到它们全部起作用:

iex(7)> :digraph.vertices(gr)
["A", "C", "B"]
iex(8)> :digraph.edges(gr)
[[:"$e" | 0], [:"$e" | 1]]
iex(9)> :digraph.out_neighbours(gr, "A")
["C", "B"]
iex(10)> :digraph.out_neighbours(gr, "B")
[]
iex(11)> :digraph.out_neighbours(gr, "C")
[]
iex(12)> :digraph_utils.is_acyclic(gr)
true

现在,我将添加和删除更多的顶点和边,但是我想将这些图形传输到Elixir / Erlang生态系统之外的应用程序,例如Cytoscape.js。有没有一种标准化的方法可以将图序列化为某种行业标准的可读格式(例如json或xml),例如JGF,Netlix的Falcor JSON Graph格式或其他格式?

我可以编写自己的序列化器,但我希望有一个预先存在的东西。我在digraphdigraph_utils中找不到能做到这一点的任何东西。

1 个答案:

答案 0 :(得分:5)

搜索有多种解决方案,可将有向图数据导出为各种流行的格式,但是没有规范。DOTGraphML是这些格式中最流行的两个。

一些Elixir和Erlang库,用于将有向图导出为各种格式:

一些Elixir和Erlang使用js库(例如vis.js和Web套接字)以软实时方式更新前端的示例: