Пользовательский Neo4j GraphViz Writer

У меня есть приложение, которое создает файл точек GraphViz для подграфа моей базы данных Neo4j. Это работает как шарм, но есть некоторая проблема.

Прямо сейчас заголовок каждого узла является идентификатором узла. Затем перечислены свойства с соответствующими типами. Это больше информации, чем мне нужно, и я хотел бы изменить способ настройки средства записи GraphViz.

Я заметил несколько классов/интерфейсов, таких как GraphStyle, StyleParameter, StyleConfiguration, но я пробовал несколько вещей и продолжаю сталкиваться с проблемой, что я не могу получить доступ к определенным классам/интерфейсам за пределами их соответствующего пакета. Может быть, я делаю это неправильно, может быть, он разработан таким образом, что пользователи не могут перенастроить средство записи GraphViz, я не знаю, но хотел бы знать.

Как мне перенастроить средство записи GraphViz, чтобы файл точек содержал только ту информацию, которую я хочу, а именно свойство, которое я выбрал в качестве заголовка, и ничего больше, что касается узлов. Кроме того, это не всегда одно и то же свойство, поэтому для некоторых узлов я бы хотел, чтобы свойство A было заголовком, а для узлов, у которых нет свойства A, я бы хотел, чтобы свойство B было заголовком.

Любая помощь будет принята с благодарностью.


person Pieter-Jan    schedule 19.04.2013    source источник


Ответы (2)


Вы можете попробовать использовать стили, предоставляемые этим классом: https://github.com/neo4j/neo4j/blob/master/community/graphviz/src/main/java/org/neo4j/visualization/graphviz/AsciiDocSimpleStyle.java

Также может быть полезно изучить этот класс: https://github.com/neo4j/neo4j/blob/master/community/graphviz/src/main/java/org/neo4j/visualization/asciidoc/AsciidocHelper.java

person nawroth    schedule 19.04.2013
comment
Таким образом, AsciiDocSimpleStyle предоставляет мне другой стиль. Но я тоже не могу настроить AsciiDocSimpleStyle, верно? Не с точки зрения цвета, а с точки зрения содержимого, которое он подталкивает к точечному файлу. - person Pieter-Jan; 19.04.2013
comment
Вы можете использовать последний метод и отправить реализации NodeStyle и RelationshipStyle. Если вы не хотите возиться с отношениями, просто сделайте копию DefaultRelationshipStyle. - person nawroth; 19.04.2013
comment
Или вы можете разветвить проект и упростить его расширение. Хорошие пулреквесты всегда приветствуются. Я модифицировал его для использования в наших инструментах документирования, но дальше этого не заглядывал. - person nawroth; 19.04.2013
comment
Atm, я написал новый GraphStyleImpl, который расширяет GraphStyle. Я также написал NodeStyleImpl и RelationshipStyleImpl, которые реализуют интерфейсы NodeStyle и RelationshipStyle. Я не писал новую StyleConfiguration и не использовал конфигурацию по умолчанию, но я все равно не использую StyleConfiguration в своих NodeStyleImpl и RelationshipStyleImpl. Проблема в том, что эти интерфейсы не являются общедоступными, и мне пришлось изменить свой пакет на org.neo4j.visualization.graphviz, что кажется неприятным взломом. Я рассмотрю возможность использования своих пользовательских реализаций через AsciiDocSimpleStyle. - person Pieter-Jan; 19.04.2013
comment
Извините, я был неправ. Интерфейсы доступны. Это конструктор GraphStyle, который защищен. - person Pieter-Jan; 19.04.2013
comment
Я нашел обходной путь (см. мой ответ). Это не очень красиво, поэтому я отправил запрос на извлечение, чтобы сделать конструктор общедоступным. Вы поставили меня на правильный путь с реализациями NodeStyle и RelationshipStyle. Спасибо! - person Pieter-Jan; 19.04.2013

Мне удалось заставить его работать. Прежде всего, вам нужно создать два новых класса:

class NodeStyleImpl implements NodeStyle
class RelationshipStyleImpl implements RelationshipStyle

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

public class NodeStyleImpl implements NodeStyle {

    public void emitNodeStart(Appendable apndbl, Node node) throws IOException {
        apndbl.append("  N" + node.getId() + " [\n    label = \"");
    }

    public void emitEnd(Appendable apndbl) throws IOException {
        apndbl.append("\"\n]\n");
    }

    public void emitProperty(Appendable apndbl, String propkey, Object propvalue) throws IOException {
        if(propkey.equals("propkeyone") || propkey.equals("propkeytwo"){
            apndbl.append(propvalue.toString());
        }
    }
}

Аналогичным образом вы можете написать RelationshipStyleImpl. Если вам нужна более продвинутая конфигурация, вы также можете написать реализацию StyleConfiguration. В качестве примера вы можете посмотреть реализации по умолчанию в коде Neo4j.

Тогда есть проблема с классом GraphStyle. Класс GraphStyle имеет защищенный конструктор, доступный только внутри пакета. Я сделал запрос на перенос, чтобы сделать его общедоступным, но на данный момент вот небольшой «хак», который обеспечивает обходной путь.

package org.neo4j.visualization.graphviz

public class GraphStyleImpl extends GraphStyle {

    private GraphStyleImpl (NodeStyleImpl nstyle, RelationshipStyleImpl rstyle) {
        super(nstyle, rstyle);
    }
}

Обратите внимание на объявление пакета. Поскольку конструктор GraphStyle защищен, метод super(nstyle, rstyle) доступен только из того же пакета. Расширив класс новым общедоступным конструктором, теперь вы можете делать следующее:

GraphStyle graphstyle = new GraphStyleImpl(new NodeStyleImpl(), new RelationshipStyleImpl());
GraphvizWriter writer = new GraphvizWriter(graphstyle);

Если мой запрос на вытягивание будет принят, использование класса GraphStyleImpl больше не понадобится.

person Pieter-Jan    schedule 19.04.2013