Configuration 自定义Neo4j GraphViz书写器

Configuration 自定义Neo4j GraphViz书写器,configuration,neo4j,graphviz,dot,Configuration,Neo4j,Graphviz,Dot,我有一个应用程序,它为我的Neo4j数据库的子图生成一个GraphViz点文件。它就像一个符咒,但也有一些问题 现在,每个节点的标题是节点id。然后列出属性及其各自的类型。这是比我需要的更多的信息,我想改变GraphViz编写器的配置方式 我注意到一些类/接口,如GraphStyle、StyleParameter、StyleConfiguration,但我尝试了一些方法,并不断遇到无法访问其各自包之外的某些类/接口的问题。也许我做错了,也许它的设计让用户无法重新配置GraphViz writer

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

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

我注意到一些类/接口,如GraphStyle、StyleParameter、StyleConfiguration,但我尝试了一些方法,并不断遇到无法访问其各自包之外的某些类/接口的问题。也许我做错了,也许它的设计让用户无法重新配置GraphViz writer,我不知道,但我想知道

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


非常感谢您的帮助。

您可以尝试使用本课程提供的样式:


研究这个类可能也很有用:

我设法让它工作起来。首先,您需要创建两个新类:

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。如果您正在寻找更高级的配置,还可以编写样式配置实现。例如,您可以查看Neo4j代码中的默认实现

还有GraphStyle类的问题。GraphStyle类有一个受保护的构造函数,因此只能从包中访问。我提出了一个将其更改为public的请求,但目前,这里有一个小的“hack”,它提供了一个解决方法

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);

如果我的pull请求被接受,将不再需要使用GraphStyleImpl类。

因此,AsciiDocSimpleStyle为我提供了不同的样式。但是我也不能自定义AscidCSimpleStyle,对吗?不是颜色,而是它推送到点文件的内容。您可以使用最后一种方法,发送NodeStyle和RelationshipStyle实现。如果你不想搞乱这些关系,只需要复制一份DefaultRelationshipStyle。或者你可以将项目分叉,使其更易于扩展。好的请求总是受欢迎的。我对它进行了修改,以便在我们的文档工具中使用,但实际上并没有看得更远。Atm,我已经编写了一个新的GraphStyleImpl,它扩展了GraphStyle。我还编写了NodeStyleImpl和RelationshipStyleImpl,它们实现了NodeStyle和RelationshipStyle接口。我没有编写新的样式配置,也没有使用默认的样式配置,但无论如何,我在NodeStyleImpl和RelationshipStyleImpl中都没有使用样式配置。问题是这些接口不是公共的,我不得不将包改为org.neo4j.visualization.graphviz,这看起来像是一个讨厌的黑客程序。我将通过AsciiDocSimpleStyle研究如何使用自定义实现。对不起,我错了。接口是可访问的。它是受保护的GraphStyle构造函数。