Из комментариев видно, что вы хотите использовать формат JSON для хранения и загрузки этих графиков, поэтому простая структура данных, которая не использует слишком много места, должна подойти. список смежностей (который вы описали как from: to[]
) - это хорошая структура данных графов общего назначения, и, вероятно, она подходит для вашего варианта использования.
Список смежностей может быть реализован в различных пути. Самый простой способ - это словарь, отображающий каждый узел в список соседей:
{
"source1": ["do_filter"],
"do_filter": ["join"],
"join": ["output"],
"output": [],
"source2": ["join"]
}
Если вам нужно сохранить только имена узлов и топологию графа, это, вероятно, хорошо. Однако для больших графов с большим количеством ребер JSON займет больше места, чем необходимо, поскольку имя каждого узла записывается в виде строки для каждого ребра этого узла. Если требуется более компактное представление, вы можете использовать цифру c ID для ссылки на узлы:
{
"nodes": ["source1", "do_filter", "join", "output", "source2"],
"edges": [[1], [2], [3], [], [2]]
}
Здесь source1
- это узел 0, do_filter
- это узел 1 и т. Д. по их показателям в nodes
; поэтому край от source1
до do_filter
представлен edges[0]
, содержащим число 1
. Аналогично, edges[3]
пусто, что означает, что nodes[3]
, то есть output
, не имеет ребер для других узлов.
Другой вариант, если вам нужно хранить больше информации о каждом узле (например, координаты x, y для рисуя его, цвет и т. д. c.), нужно сделать каждый узел объектом. Это все еще список смежности, потому что он представляет топологию графа, связывая каждый узел со списком его соседей:
[
{ "name": "source1", "colour": "green", "edges": [1] },
{ "name": "do_filter", "colour": "red", "edges": [2] },
{ "name": "join", "colour": "orange", "edges": [3] },
{ "name": "output", "colour": "blue", "edges": [] },
{ "name": "source2", "colour": "black", "edges": [2] }
]