public class TriangleCountComputation extends
AbstractComputation<IntWritable, IntWritable, NullWritable, IntWritable, IntWritable> {
@Override
public void compute(Vertex<IntWritable, IntWritable, NullWritable> vertex,
Iterable<IntWritable> messages) throws IOException {
long superstep = getSuperstep();
if (superstep==0) {
vertex.setValue(new IntWritable(0));
} else if (superstep==1) {
for (Edge<IntWritable, NullWritable> edge: vertex.getEdges()) {
if (edge.getTargetVertexId().compareTo(vertex.getId()) > 0) { //stage1:向所有比自己Id大的边发自己Id
sendMessage(edge.getTargetVertexId(), vertex.getId());
}
}
vertex.voteToHalt();
} else if (superstep==2) {
for (IntWritable msg : messages) {
assert(msg.compareTo(vertex.getId())<0); // This can never happen
for (Edge<IntWritable, NullWritable> edge: vertex.getEdges()) {
if (vertex.getId().compareTo(edge.getTargetVertexId()) < 0) { //stage2:向所有比自己Id小的边发消息
sendMessage(edge.getTargetVertexId(), msg);
}
}
}
vertex.voteToHalt();
} else {
int count = 0;
for (IntWritable msg : messages) {
// If this vertex has a neighbor with this ID, then this means it
// participates in a triangle.
if (vertex.getEdgeValue(msg)!=null) {
count++;
}
}
if (count>0) {
vertex.setValue(new IntWritable(count));
}
vertex.voteToHalt();
}
}
}
举例:1->2,2->3,3->1, 则123构成一个闭环三角,