java - 如何向 JUNG 图表添加链接或更新现有链接属性

标签 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) 您没有有效的方法来查找给定 ID 的节点。对于这种大小的图表,我建议在填充图表时构建一个映射,并使用该映射来实现 findNode()。

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

(1) 是迄今为止代码缓慢的最大原因。 (2) 不会有太大帮助,但它也会让你的代码更容易阅读、更优雅。

关于java - 如何向 JUNG 图表添加链接或更新现有链接属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24362841/

相关文章:

java - 如何使用 GSON 有效地延迟加载 JSON 文件的特定元素?

mysql - 将命令中的密码从 .env 传递到 docker 内的 mysql

php - 如果动态字段为空,则阻止表单提交....Php/Jquery/Ajax

Java Jung 类型转换和 getTrees()

java - Android/java中调用类的私有(private)对象的方法

java - 想要抛出打开新 Activity 的 Intent ,但不断崩溃

java - 使用 SWT 在树项单击上填充表行

php - 使用 php/mysql/jQuery 随机聊天

java - Katz相似度-矩阵/图运算(JAVA + JUNG)

java - 如何聆听 Jung 2 中的顶点选择变化?