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;
}
예, 아니오. 본질적으로 그래프를 만들 때 어떤 시점에서 노드 객체를 구성 했으므로 노드와 해당 ID를 직접 가져야합니다. 그 시점에서지도에 넣으십시오. Offhand는 이것을하기위한 가장 쉬운 방법은 노드 클래스에 정적 Map 인스턴스를 포함시키는 것입니다. 이는 findNode() 자체가 노드 클래스의 정적 메서드 여야 함을 의미합니다. –
감사합니다. Joshua, 그래프에 노드를 추가하기 직전에 ID와 노드를 놓는 hashmap를 선택했습니다. 이제는 findNode() 메소드가 더 이상 필요하지 않습니다. 올바른 노드를 찾아야 할 때 해시지도에서 get()을하면됩니다 ... 이것은 당신의 대답에서 의미하는 것과 다소 가깝습니까? –
user299791
및 btw, Graph.findEdge() 문제가 ... g.isPredecessor (보낸 사람, 수신기)에 대한 테스트를 참조하십시오. 그러나 이것이 사실이고 g.findEdge (보낸 사람,받는 사람) 요청하면 null 얻을 포인터 예외 ... – user299791