2014-06-23 4 views
0

mysql 데이터베이스에서 결과 집합을 가져오고이 값을 사용하여 JUNG 그래프를 작성하려고합니다. 이미 빈 그래프를 인스턴스화했습니다.JUNG 그래프에 링크를 추가하거나 기존 링크 속성을 업데이트하는 방법

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

다음 노드 (586)를 추가했습니다. 나는 지금 링크를 추가하는 과정에 있으며 이제는 상황이 더욱 복잡해집니다. 내 사용자 지정 에지의 구조는 그냥 같은 "시간"속성이 매우 간단하다 :

링크 설정 결과는 형태로 3,273,684 항목이 포함되어

Multiset<Timestamp> time; 
: 이제

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

이 두 가지 이유 느린 :

(1) 당신이 볼 수있는 효율적인 방법이 없습니다 ID가 주어진 노드를 올리십시오. 이 크기의 그래프의 경우 그래프를 채우고 해당지도를 사용하여 findNode()를 구현할 때 Map을 작성하는 것이 좋습니다.

(2) 두 개의 노드가 있고 노드를 연결하는 에지를 얻으려면 Graph.findEdge()를 사용하십시오.

(1)은 코드가 느린 가장 큰 이유입니다. (2)는별로 도움이되지 않지만 코드를 읽기 쉽고 우아하게 만듭니다.

+0

예, 아니오. 본질적으로 그래프를 만들 때 어떤 시점에서 노드 객체를 구성 했으므로 노드와 해당 ID를 직접 가져야합니다. 그 시점에서지도에 넣으십시오. Offhand는 이것을하기위한 가장 쉬운 방법은 노드 클래스에 정적 Map 인스턴스를 포함시키는 것입니다. 이는 findNode() 자체가 노드 클래스의 정적 메서드 여야 함을 의미합니다. –

+0

감사합니다. Joshua, 그래프에 노드를 추가하기 직전에 ID와 노드를 놓는 hashmap 를 선택했습니다. 이제는 findNode() 메소드가 더 이상 필요하지 않습니다. 올바른 노드를 찾아야 할 때 해시지도에서 get()을하면됩니다 ... 이것은 당신의 대답에서 의미하는 것과 다소 가깝습니까? – user299791

+0

및 btw, Graph.findEdge() 문제가 ... g.isPredecessor (보낸 사람, 수신기)에 대한 테스트를 참조하십시오. 그러나 이것이 사실이고 g.findEdge (보낸 사람,받는 사람) 요청하면 null 얻을 포인터 예외 ... – user299791