Java 使用graphml和jung加载自定义节点和边

Java 使用graphml和jung加载自定义节点和边,java,graph,bigdata,jung,graphml,Java,Graph,Bigdata,Jung,Graphml,当我试图与JUNG在文本文件中读写图表时,我遇到了一些问题。情况如下:给定的是一个包含多重图坐标及其权重的文件 例如: 6346 6728 5911 156 5 6346 6728 6599 156 10 6346 6728 8555 156 5 我用JUNG编写了一个转换器,它读取一个包含数百万行的文件,并构造一个 DirectedSparseMultigraph<Node, Edge> 从这些数据在内存中构建一个图形效果很

当我试图与JUNG在文本文件中读写图表时,我遇到了一些问题。情况如下:给定的是一个包含多重图坐标及其权重的文件

例如:

6346    6728    5911    156 5
6346    6728    6599    156 10
6346    6728    8555    156 5
我用JUNG编写了一个转换器,它读取一个包含数百万行的文件,并构造一个

DirectedSparseMultigraph<Node, Edge>
从这些数据在内存中构建一个图形效果很好。我们更接近这个问题。需要注意的是,通过使用 DirectedSparMultigraph对象。在下一步中,通过以下代码行从磁盘加载构造的DirectedSparMultigraph

    GraphMLReader<DirectedSparseMultigraph<Node, Edge>, Node, Edge> gmlr = null;

    try
    {
        gmlr = new GraphMLReader<DirectedSparseMultigraph<Node, Edge>, Node, Edge>();
    } catch (ParserConfigurationException e1)
    {
        e1.printStackTrace();
    } catch (SAXException e1)
    {
        e1.printStackTrace();
    }

    DirectedSparseMultigraph<Node, Edge> g_new = null;
    try
    {
        gmlr.load("bla.sh", g_new);
    } catch (IOException e)
    {
        e.printStackTrace();
    }
如果你有任何想法或提示如何解决这个问题,我真的很期待你的消息。 问候语
J Bug

GraphmReader有两种方法可以解析您的文件:

(1) 您提供节点和边缘工厂;在这种情况下,节点和边类型可以是您想要的任何类型。()

(2) 您不提供节点和边缘工厂;在这种情况下,节点和边类型必须是
String
s。()

您的代码不提供节点和边缘工厂,并且您的
边缘
类型与
字符串
不兼容,因此它会爆炸。诚然,从错误消息来看,这并不是非常明显,但在本文中是相当清楚的


在这种情况下,您不能真正提供
节点
边缘
工厂(不重新设计它们),因为您没有无参数构造函数。因此,您需要重新设计这些类,或者使用两个阶段的过程,即:使用节点和边的简单字符串键解析图形+填充元数据,然后根据GraphmReader提供的数据结构构建一个新的图形。

快速尝试:必须使用
GraphmReader
构造函数,该构造函数接收顶点的
工厂和边的
工厂,这些工厂应该分别创建
Vertex
-和
Edge
类的实例。感谢您的帮助,我很抱歉这么晚才接受了答案,但我也想提供一个具体的解决方案,在类似情况下可以帮助其他人。因此,我遇到了一个与你的建议一致的例子。它有点笨拙,但当人们习惯了它之后,它就可以完美地工作,并且可以很容易地扩展。再次感谢您。根据这张表,您也可以查看
    GraphMLReader<DirectedSparseMultigraph<Node, Edge>, Node, Edge> gmlr = null;

    try
    {
        gmlr = new GraphMLReader<DirectedSparseMultigraph<Node, Edge>, Node, Edge>();
    } catch (ParserConfigurationException e1)
    {
        e1.printStackTrace();
    } catch (SAXException e1)
    {
        e1.printStackTrace();
    }

    DirectedSparseMultigraph<Node, Edge> g_new = null;
    try
    {
        gmlr.load("bla.sh", g_new);
    } catch (IOException e)
    {
        e.printStackTrace();
    }
Exception in thread "main" java.lang.IllegalArgumentException: If no edge factory is supplied, edge id may not be null: {source=V6818, target=V2472}
at edu.uci.ics.jung.io.GraphMLReader.createEdge(GraphMLReader.java:693)
at edu.uci.ics.jung.io.GraphMLReader.startElement(GraphMLReader.java:299)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:182)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1343)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2786)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:649)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:333)
at edu.uci.ics.jung.io.GraphMLReader.parse(GraphMLReader.java:241)
at edu.uci.ics.jung.io.GraphMLReader.load(GraphMLReader.java:192)
at edu.uci.ics.jung.io.GraphMLReader.load(GraphMLReader.java:201)
at main.Graph.main(Graph.java:99)