自定义Neo4j GraphViz Writer

时间:2013-04-19 08:43:05

标签: configuration neo4j graphviz dot

我有一个应用程序,它为我的Neo4j数据库的子图生成GraphViz点文件。它就像一个魅力,但有一些问题。

现在,每个节点的标题是节点ID。然后列出属性及其各自的类型。这比我需要的信息更多,我想改变GraphViz编写器的配置方式。

我注意到了几个类/接口,例如GraphStyle,StyleParameter,StyleConfiguration,但我已经尝试了几件事情并继续遇到我无法访问各自包之外的某些类/接口的问题。也许我做错了,也许它的设计是因为用户无法重新配置GraphViz编写器,我不知道,但我想知道。

如何重新配置​​GraphViz编写器,使点文件只包含我希望它包含的信息,即我选择的属性作为标题,就节点而言,没有其他任何内容。此外,这并不总是相同的属性,因此对于某些节点,我希望属性A为标题,对于没有属性A的节点,我希望属性B为标题。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分: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类。