Slide 28
Slide 28 text
Pagerank for TinkerPop3
11
1 public class PageRankVertexProgram implements VertexProgram <
Double > {
2 private MessageType.Local messageType = MessageType.Local.of
(() -> GraphTraversal .of().outE ());
3 public static final String PAGE_RANK = Graph.Key.hide("gremlin
.pageRank");
4 public static final String EDGE_COUNT = Graph.Key.hide("
gremlin.edgeCount");
5 private static final String VERTEX_COUNT = "gremlin.
pageRankVertexProgram .vertexCount";
6 private static final String ALPHA = "gremlin.
pageRankVertexProgram .alpha";
7 private static final String TOTAL_ITERATIONS = "gremlin.
pageRankVertexProgram . totalIterations ";
8 private static final String INCIDENT_TRAVERSAL = "gremlin.
pageRankVertexProgram . incidentTraversal ";
9 private double vertexCountAsDouble = 1;
10 private double alpha = 0.85d;
11 private int totalIterations = 30;
12 private static final Set COMPUTE_KEYS = new HashSet <>(
Arrays.asList(PAGE_RANK , EDGE_COUNT));
13
14 private PageRankVertexProgram () {}
15
16 @Override
17 public void loadState(final Configuration configuration) {
18 this. vertexCountAsDouble = configuration .getDouble(
VERTEX_COUNT , 1.0d);
19 this.alpha = configuration .getDouble(ALPHA , 0.85d);
20 this. totalIterations = configuration .getInt(
TOTAL_ITERATIONS , 30);
21 try {
22 if ( configuration .containsKey( INCIDENT_TRAVERSAL )) {
23 final SSupplier traversalSupplier =
VertexProgramHelper .deserialize(configuration ,
INCIDENT_TRAVERSAL );
24 VertexProgramHelper . verifyReversibility (
traversalSupplier .get());
25 this.messageType = MessageType.Local.of(( SSupplier)
traversalSupplier );
26 }
27 } catch (final Exception e) {
28 throw new IllegalStateException (e.getMessage (), e);
29 }
30 }
32 @Override
33 public void storeState(final Configuration configuration) {
34 configuration .setProperty(GraphComputer.VERTEX_PROGRAM ,
PageRankVertexProgram .class.getName ());
35 configuration .setProperty(VERTEX_COUNT , this.
vertexCountAsDouble );
36 configuration .setProperty(ALPHA , this.alpha);
37 configuration .setProperty(TOTAL_ITERATIONS , this.
totalIterations );
38 try {
39 VertexProgramHelper .serialize(this.messageType.
getIncidentTraversal (), configuration ,
INCIDENT_TRAVERSAL );
40 } catch (final Exception e) {
41 throw new IllegalStateException (e.getMessage (), e);
42 }
43 }
44
45 @Override
46 public Set getElementComputeKeys () {
47 return COMPUTE_KEYS;
48 }
49
50 @Override
51 public void setup(final Memory memory) {
52
53 }
54
55 @Override
56 public void execute(final Vertex vertex , Messenger
messenger , final Memory memory) {
57 if (memory. isInitialIteration ()) {
58 double initialPageRank = 1.0d / this. vertexCountAsDouble
;
59 double edgeCount = Double.valueOf (( Long) this.
messageType.edges(vertex).count ().next ());
60 vertex. singleProperty(PAGE_RANK , initialPageRank );
61 vertex. singleProperty(EDGE_COUNT , edgeCount);
62 messenger.sendMessage(this.messageType , initialPageRank
/ edgeCount);
63 } else {
64 double newPageRank = StreamFactory.stream(messenger.
receiveMessages (this.messageType)).reduce (0.0d, (a,
b) -> a + b);
65 newPageRank = (this.alpha * newPageRank) + ((1.0d - this
.alpha) / this. vertexCountAsDouble );
66 vertex. singleProperty(PAGE_RANK , newPageRank);
67 messenger.sendMessage(this.messageType , newPageRank /
vertex.property(EDGE_COUNT).orElse (0.0d));
68 }
69 }
70
71 @Override
72 public boolean terminate(final Memory memory) {
73 return memory.getIteration () >= this. totalIterations ;
74 }
75 }