private void mergeGraph(GraphModel merge) { // Add any new nodes for (GraphNode node : merge.getNodes()) { if (null == resultModel.findNode(node.getId())) { // TODO: Should be cloning the node. resultModel.addNode(node); // Speed up edge lookups Set<GraphEdge> empty = Sets.newHashSet(); headToEdges.put(node, empty); } } // Add any new edges for (GraphEdge edge : merge.getEdges()) { Set<GraphEdge> forHead = headToEdges.get(edge.getHead()); if (null == forHead) { continue; } if (!forHead.contains(edge)) { resultModel.addEdge(edge.getRelation(), edge.getHead(), edge.getTail()); forHead.add(edge); } } }