【问题标题】:How does one serialize a digraph in Erlang or Elixir for export purposes出于导出目的,如何在 Erlang 或 Elixir 中序列化有向图
【发布时间】:2019-05-16 20:06:21
【问题描述】:

我正在使用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")

看起来像这样:

我们可以看到一切正常:

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 中找不到任何这样做的东西。

【问题讨论】:

标签: erlang elixir


【解决方案1】:

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

一些用于将二合字母导出为各种格式的 Elixir 和 Erlang 库:

使用 vis.js 和 web sockets 等 js 库软实时更新前端的一些 Elixir 和 Erlang 示例:

【讨论】:

  • 不幸的是,其中许多已经超过 5 年了,虽然这可能很好,但我只是有点担心软件包的维护。尽管如此,github.com/fenollp/erlang-dot 看起来不错,尤其是与此处列出的一些解决方案结合使用时:stackoverflow.com/questions/22595493/…。如果您想将最后一个网址添加到您的答案中,我会接受。非常感谢您的辛勤工作,欢迎来到 Stack Overflow!
  • 实际上 erlang-dot 在 Elixir 下似乎无法编译,graphvix 似乎是有向图的竞争对手,并且看起来非常不完整,因为它使用 genserver 来存储图形(DDOS风险),而 digraph_viz 没有给我一个我可以看到的导出选项。恐怕这些都不能真正回答我能看到的问题,除非你能以其他方式告诉我。
  • Graphvix 是 digraph 的包装器,而不是这里明显的竞争对手:github.com/mikowitz/graphvix/blob/… 它也没有使用 gen_server。但是,使用 gen_server 不会带来任何安全风险。 “lib”使用 gen 服务器来保存状态是很常见的。同时,digraph_vis 确实具有导出功能,如下所示:github.com/jabarszcz/digraph_viz/blob/…
  • 非常感谢。请在答案中显示一些代码,我会接受。请注意,我需要一个序列化,不一定要写入磁盘,但可能需要通过 zeromq 或 websockets 等通过网络传输。
猜你喜欢
  • 2020-09-30
  • 1970-01-01
  • 2016-03-05
  • 2017-01-24
  • 2018-11-26
  • 2016-03-10
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多