Как получить ребра в виде списка из файла graphviz

#python-3.x #graphviz

#python-3.x #graphviz

Вопрос:

У меня есть приведенный ниже файл .gv, который отображает график как ожидалось, но я также пытаюсь получить, сколько связанных ребер (разных путей к дереву) находится в файле

 digraph G {
    300 -> 100 [label="3"]
    400 -> 100 [label="4"]
    500 -> 400 [label="5"]
}
  

Редактировать:
Добавлено больше узлов дерева

 digraph G {
    300 -> 100 [label="3"]
    400 -> 100 [label="4"]
    500 -> 400 [label="5"]
    600 -> 500 [label="6"]    
    700 -> 100 [label="1"]
    800 -> 700 [label="2"]
    900 -> 800 [label="3"]    
    1000 -> 100 [label="1"]
    2000 -> 1000 [label="2"]
    3000 -> 2000 [label="3"]
    4000 -> 2000 [label="4"]
    5000 -> 4000 [label="5"]
    5000 -> 3000 [label="6"]
}
  

Ожидается, что нижеприведенные списки будут созданы из дерева выше

 [300 , 100]
[600 , 500 , 400 , 100]
[900 , 800 , 700 , 100]
[5000 , 4000 , 3000 , 2000 , 1000 , 100]
  

Есть ли способ, которым graphviz может предоставить эту информацию или любой другой модуль python, который может помочь с этим?

Комментарии:

1. Какого результата (количества) вы ожидали бы, если бы у графика была только одна (терминальная) головка и только один (терминальный) хвост, но в середине было много ветвей (т. Е. все ветви были объединены)?

2. У меня не было бы такого сценария, но если есть несколько средних ветвей, то объедините их все в один список. поскольку все средние ветви ведут к одной голове, в этом случае ветвь началась самостоятельно (300 -> 100), поэтому я пытаюсь найти такие сценарии.

3. Не могли бы вы прикрепить более крупный, более реалистичный пример. Я думаю, у меня есть ваш ответ, но для тестирования нужен график большего размера.

4. Я добавил больше реалистичных узлов дерева, пожалуйста, поделитесь любым решением, которое у вас может быть.

5. Пожалуйста, добавьте полный список путей, которые вы ожидаете от вашего примера, чтобы людям было легче понять, что вы имеете в виду.

Ответ №1:

Это делается не с помощью Python, а только с помощью программ Graphviz и сценария оболочки. Также выходные данные необходимо будет переформатировать, но я предполагаю, что вы можете это сделать.

  1. однострочная программа gvpr (gvpr — это программа Graphviz) для перечисления каждого узла с степенью ==0 (без входных ребер).
  2. для каждого такого узла используйте программу cliptree gvpr, которая поставляется (обычно) с пакетом Graphviz (посмотрите в /usr/share/graphviz/gvpr)

Здесь:

 gvpr 'N[indegree==0]{print ($.name)}' subTree1.gv  | while read N; do gvpr -a $N -f $DIR/cliptree  subTree1.gv;done  
  

Вывод:

 digraph gvpr_result {
        300;
        100;
}
digraph gvpr_result {
        100;
        400;
        500;
        600;
}
digraph gvpr_result {
        100;
        700;
        800;
        900;
}
digraph gvpr_result {
        100;
        1000;
        2000;
        3000;
        4000;
        5000;
}
  

Комментарии:

1. Я пытался запустить эту команду из кода python, используя подпроцесс, и увидел ошибку, хотя она не распознается как внутренняя или внешняя команда. Работает ли эта команда как в Linux, так и в Windows?

2. Я могу протестировать это в ОС Linux, но это не сработало в Windows. Я не мог найти cliptree, когда загружал graphviz для Windows.