如何添加链接或将现有链接属性更新为JUNG图

时间:2014-06-23 09:44:29

标签: java mysql jung

我有一个来自mysql数据库的结果集,我正在尝试使用这些值构建JUNG图。我已经将我的空图实例化为:

Graph<Node, Edge> g = new SparseMultigraph<>();

然后我添加了节点(586)。我现在正在添加链接,现在事情变得更复杂了。我的自定义Edge的结构非常简单,只有一个“时间”属性,如:

Multiset<Timestamp> time;

链接的结果集包含以下形式的3273684个条目:

id  time                    sender  receiver
12  2014-03-20 09:26:04.000 2       99

现在,我想要做的是从id为2的节点创建一个链接,如果链接不存在则创建id为99的节点,或者只是将时间戳添加到现有链接。我所做的是:

while (resultSet.next()) {
    // retrieve sender
    Node sender = findNode(resultSet.getInt("sender"), g);
    // retrieve receiver
    Node receiver = findNode(resultSet.getInt("receiver"), g);
    // if they are already linked
    if(g.isPredecessor(sender, receiver)){
        // just add the new timestamp to the existing link
        Collection<Edge> outEdges = g.getOutEdges(sender);
        // find the right edge
        for(Edge e:outEdges){
            // if this edge is connected to receiver
            if(g.getDest(e).equals(receiver)){
                // add the new timestamp to this edge
                e.setTime(resultSet.getTimestamp("time"));
            }
        }
    } else { // else a new link is added
        Information e = new Information();
        e.setId(resultSet.getInt("id"));
        e.setTime(resultSet.getTimestamp("time"));
        g.addEdge(e, sender, receiver, EdgeType.DIRECTED);
    }
}

我的问题是这真的很慢,我不明白这是否正常,因为结果集非常大,或者我错过了更清晰/更快的方式来实现我需要的东西。

为了清楚起见,我的findNode()方法是这样的:

private static Node findNode(int aInt, Graph<Node, Edge>g) {
    for(Node n:g.getVertices()){
        if(n.getId()== aInt){
            return n;
        }
    }
    return null;
}

1 个答案:

答案 0 :(得分:1)

这有点慢,原因有两个:

(1)您没有一种有效的方法来查找给定ID的节点。对于此大小的图表,我建议您在填充图表时构建Map,并使用该映射来实现findNode()。

(2)一旦有了两个节点,并且想要获得连接它们的边缘(如果有的话),只需使用Graph.findEdge()。

(1)是目前代码速度较慢的最大原因。 (2)没有那么多帮助,但它也会使你的代码更容易阅读和更优雅。