2013-04-19 3 views
1

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

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

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

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

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

ответ

0

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

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 больше не будет необходимости.

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

+0

Таким образом, AsciiDocSimpleStyle предоставляет мне различные стили. Но я не могу настроить AsciiDocSimpleStyle, верно? Не с точки зрения цвета, а с точки зрения содержимого, которое он подталкивает к точечному файлу. –

+0

Вы можете использовать последний метод и отправлять его в реализациях NodeStyle и RelationshipStyle. Если вы не хотите связываться с отношениями, просто создайте копию DefaultRelationshipStyle. – nawroth

+0

Или вы можете разветвить проект и упростить его расширение. Хорошие запросы на тягу всегда приветствуются.Я изменил его для использования в наших инструментах документации, но на самом деле не смотрел дальше. – nawroth