有向环回图的人类可读文本表示形式

iva*_*eev 5 language-agnostic representation directed-acyclic-graphs

一棵树有大量的人类可读和机器可读的文本表示形式,例如嵌套列表(以各种表示形式,例如JSON和YAML)和XML。结合缩进,它们使想象结构变得非常容易。

但是我看不到有向无环图具有相同程度的可读性。它是比树更通用的数据结构,因此不能使用上述格式(无论如何,都是冗长的)。

  • 我见过的所有人类可读的表示都是图形的
  • 原始的文本表示形式是列出所有节点及其连接-如果节点数多,则很难想象该图

我想到的应用程序将是各种流程图-例如,它自然会出现在各种计划任务中。


为了限制问题的范围,我主要是在寻求标准解决方案,或者至少是准备用于生产并且已在某些实践领域证明有效的解决方案。如果没有,那么任何经过某种同行评审(例如,发表在科学论文中的提议)的实验命题都必须要做。

sle*_*man 5

图形的一种很好的文本表示是graphviz中的语言。语法是易于阅读的关系描述。

请注意,背后的核心思想graphviz不是从图表开始并描述它,而是在不知道图表是什么样子的情况下从您所知道的开始,然后让我们graphviz为您生成图表。由于此设计目标graphviz没有任何手动放置节点的功能 - 它将根据您选择的算法自动绘制节点。

以下是使用的示例graphviz

假设您要绘制一家公司的组织结构图。您还不知道图表是什么样子,但您知道谁向谁报告。您可以对公司进行如下描述:

digraph {
    CEO                ->  Board_of_Directors
    CTO                ->  CEO
    CFO                ->  CEO
    COO                ->  CEO
    DevLead            ->  CTO
    DevTeam            ->  DevLead
    DevOps             ->  CTO
    Head_of_Accounting ->  CFO
    Accountants        ->  Head_of_Accounting
    Procurement        ->  Head_of_Accounting
    Procurement        ->  COO
    Logistics          ->  COO
    Tech_support       ->  CTO
    Tech_support       ->  COO
}
Run Code Online (Sandbox Code Playgroud)

使用该dot算法运行将生成以下图表:

组织结构图

Graphviz 确实具有复杂的节点和边描述功能,例如定义节点的形状、边的标签等。但是添加此类细节通常会稍微降低图形的可读性,因为大多数代码现在看起来像样式定义而不是之间的关系节点。尽管如此,我认为图表定义本身还是相当干净的。与任何语言一样,它的目的是用于解决人类问题(在这种情况下,如果您知道状态和转换,则可以弄清楚图形的样子)并且必须至少在一定程度上可用于其预期用途。


iva*_*eev 4

我将使用带有锚点的 YAML 嵌套列表。(这相当于带有实体的 XML,但后者有更多噪音。)
\n (我已经在考虑它,但想知道是否发明了更好的东西。看起来还没有。但最重要的是,@Patrick87 正式表明这是一个充分的代表。)

\n

如果我用缩进替换组合并用无缩进替换联合,则它相当于@Patrick87建议的正式正则表达式表示形式;当多次引用节点时,锚点可以消除节点下子图的重复。

\n
\n

例如@GuyCoder的例子

\n
\n
A->B\nA->C\nA->D\nB->E\nB->F\nC->E\nC->G\nD->F\nD->G\nE->H\nF->H\nG->H\n
Run Code Online (Sandbox Code Playgroud)\n
\n

对应于A(B(E+F)+C(E+G)+D(F+G))H\xe2\x89\xa1A(B(EH+FH)+C(EH+GH)+D(FH+GH))

\n

将会

\n
A->B\nA->C\nA->D\nB->E\nB->F\nC->E\nC->G\nD->F\nD->G\nE->H\nF->H\nG->H\n
Run Code Online (Sandbox Code Playgroud)\n

(为了统一,每个原始节点都可以成为一个锚点,例如生成它。)

\n
\n

图形是否是平面的并不重要,因为任何横切链接都不会被“绘制”。

\n

作为奖励,它允许将附加到每个节点的数据指定为以该节点为根的哈希表。(虽然超过了一定的大小,但单独放置数据可能会更清晰。)

\n