graphviz - сравнить графические деревья

Я должен сделать работу с graphviz. Мне нужно визуализировать графическое представление нескольких деревьев, но в любом случае мне нужно сравнить два дерева, чтобы увидеть их различия: примерно так, у меня есть дерево А и дерево Б. После создания их представления и сравнения их мне нужно видеть только узлы, не имеющие общего. Кто-то сказал мне использовать EMF Compare, но, к сожалению, я не знаю, как заставить этот плагин принимать расширение graphviz.

Любой совет или любое другое возможное решение для этой работы?

С Уважением.


person user2343521    schedule 20.05.2013    source источник
comment
Я не знаком с graphviz, поэтому понятия не имею, можно ли это сделать... быстрое гугление ничего не дало для экспорта из graphviz в EMF (основная технология моделирования, используемая EMF Compare). EMF Compare позволит вам сравнивать модели EMF: вам нужен способ представить вашу графическую графику в такой модели, прежде чем сравнивать их.   -  person Kellindil    schedule 21.05.2013
comment
Да, Келлиндил, это еще одна проблема. Я не мог найти, как создать модель из graphviz и использовать ее с моделями EMF. Вот почему я решил написать этот вопрос, потому что у меня нет другого представления о том, как с этим справиться. Но все равно спасибо.   -  person user2343521    schedule 21.05.2013


Ответы (1)


Учитывая два файла .dot, a1.dot:

digraph g1 {
    A -> B -> D -> E
    A -> C -> E
    }

... и a2.dot:

digraph g2 {
    A -> B -> F -> E
    A -> C -> F
    }

... вы можете найти узлы, которые отличаются между ними, следующим образом:

$ dot -Tplain a1.dot | sed -ne 's/^node \([^ ]\+\).*$/\1/p' | sort >a1.nodes
$ dot -Tplain a2.dot | sed -ne 's/^node \([^ ]\+\).*$/\1/p' | sort >a2.nodes
$ diff a1.nodes a2.nodes
4d3
< D
5a5
> F

Я использую sed, чтобы вырезать список имен узлов для каждого файла .dot из plain вывода из dot, сортирую узлы по порядку, а затем использую diff для поиска различий. Этот подход не представляет различия графически, но это сложно сделать в лучшие времена.

person Simon    schedule 27.05.2013
comment
Чувак, большое спасибо за твой трюк, на самом деле может быть полезен для того, что я делаю. - person user2343521; 13.06.2013
comment
Поскольку я ответил на ваш вопрос, я думал о том, как показать различия графически, и я думаю, что это должно быть возможно путем отображения объединенного графика и затенения или иного аннотирования каждого узла по-разному, в зависимости от того, является ли он общим для обоих графиков, только на графике 1 или только на графике 2. Если вас заинтересует это графическое решение, я могу изучить его. Грубо говоря, я бы начал с подхода, который я использовал в своем ответе, создал объединенный график, а затем использовал diff в качестве входных данных для сценария, который добавляет разные атрибуты узлов для узлов, которые различаются между исходными графами. - person Simon; 14.06.2013
comment
@ Саймон, вы когда-нибудь создавали режим визуального сравнения, о котором вы здесь говорите? - person Techdragon; 23.08.2014