强制Graphviz抱怨重复的节点

时间:2015-09-06 10:32:59

标签: graphviz

我刚注意到,重复的节点名称(即使标记为唯一)在没有Graphviz投诉的情况下得到处理。例如,在下图中考虑以下简单图形(使用circo):

graph { 
      a [label="a1"]
      a [label="a2"]
      b
      c
      d
      e
      a -- b; 
      b -- c; 
      a -- c; 
      d -- c; 
      e -- c; 
      e -- a; 
}

A simple graph with two duplicate nodes a

我希望上面的图有两个节点:a1和a2。所以我知道我应该使用唯一的名称来实例化它们(与我上面所做的不同)。但是在一个大图中,我可能没有注意到我错误地实例化了两个名称相同的不同节点。因此,如果我做这样的事情,我想强迫Graphviz抱怨它或以某种方式引起我的注意,可能带有警告或错误信息。

我如何做到这一点?

1 个答案:

答案 0 :(得分:1)

所有graphviz程序都默默地合并具有重复名称的节点,我找不到任何方法让它们在执行此操作时发出警告。因为我们只需要找到自己声明节点的情况,而不是声明边缘时隐式声明的节点(在这种情况下复制是正常的和预期的),我们只需找到所有节点名称和识别重复项。

如果一行中只声明了一个节点,可以使用以下脚本完成:

#!/bin/sh
sed -n 's/^[\t ][\t ]*\([_a-zA-Z][_a-zA-Z0-9]*\) *\(\[.*\)*;*$/\1/ p' | \
sort | uniq -c | awk '$$1>1'

如果我们调用此脚本findDupNodes,我们可以按如下方式运行它:

$ findDupNodes <duplicates.gv
      2 a

该脚本查找自己声明的节点名称或者以[开头的属性列表,对它们进行排序,计算每个声明的次数(使用uniq -c)并过滤掉只宣告一次的那些。

可以在一行上声明多个节点(例如a; b; c; d;)但是这个脚本不处理这种情况,或者(可能)其他一些情况 - 大多数情况可能需要一个完整的xdot 1}}语言解析器。

尽管如此,这个脚本应该找到许多可能会进入手写graphviz脚本的重复节点名称。