Я использую Модуль орграфа Эрланга для хранения направленных ациклических графиков (Группы DAG). Итак, для аргументации, вот супер простой график (с использованием 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 или другой?
Я мог бы написать свой собственный сериализатор, но предпочел бы что-нибудь уже существующее. Я не могу найти ничего, что делает это в диграф или digraph_utils.
Поиск Существуют различные решения для экспорта данных орграфа в различные популярные форматы, но ничего канонического. Два самых популярных из этих форматов - это ТОЧКА и GraphML.
Некоторые библиотеки Elixir и Erlang для экспорта диграфов в различные форматы:
Некоторые примеры Elixir и Erlang обновления внешнего интерфейса в мягком реальном времени с использованием js-библиотек, таких как vis.js и веб-сокетов:
К сожалению, многим из них больше 5 лет, и, хотя это может быть нормально, я немного беспокоюсь о поддержке пакетов. Тем не менее, github.com/fenollp/erlang-dot выглядит хорошо, особенно в сочетании с некоторыми решениями, описанными здесь: stackoverflow.com/questions/22595493/…. Если вы хотите добавить этот последний URL к своему ответу, я приму его. Большое спасибо за вашу тяжелую работу и добро пожаловать в Stack Overflow!
на самом деле erlang-dot, похоже, не компилируется под Elixir, graphvix кажется конкурент для орграфа и выглядит очень неоднородно, потому что он использует genserver для хранения графиков (риск DDOS), в то время как digraph_viz не дает мне возможность экспорта, которую я можно видеть. Боюсь, что ни один из них на самом деле не отвечает на мой вопрос, который я могу понять, если вы не покажете мне иное.
Graphvix - это оболочка для орграфа, а не его конкурент, как видно здесь: github.com/mikowitz/graphvix/blob/… Он также не использует gen_server. Однако использование gen_server не влечет за собой никаких рисков для безопасности. Довольно часто библиотеки "lib" используют генеральные серверы для хранения состояния. Между тем, у digraph_vis действительно есть функции для экспорта, как видно здесь: github.com/jabarszcz/digraph_viz/blob/…
отлично спасибо. Пожалуйста, покажите какой-нибудь код в ответе, и я приму его. Обратите внимание, что мне нужна сериализация, которая не обязательно будет записана на диск, но может потребоваться передача по сети через zeromq или веб-сокеты и т. д.
Для тех, кто хочет сериализовать / десериализовать
digraph
для сохранения состояния процесса, передачи графиков между процессами и т. д. На языках на основе BEAM: Как передать орграф другому процессу и другому узлу?