@Override
 public void handle(ChainReduceVertex vertex, String[] params) throws IOException {
   final Text parentForwardLabel = textFromConfig(vertex, parentForwardLabelKey);
   final Text parentReverseLabel = textFromConfig(vertex, parentReverseLabelKey);
   final Text nextCandidateLabel = textFromConfig(vertex, nextCandidateLabelKey);
   final Text prevCandidateLabel = textFromConfig(vertex, prevCandidateLabelKey);
   final Text src = new Text(params[1]);
   Text pTargetId = findEdgeByValue(vertex, parentForwardLabel);
   if (pTargetId != null) {
     Text candidate =
         methodFromConfig(vertex, deriveEquivalentVertexKey, Text.class)
             .calculate(vertex, src, pTargetId);
     vertex.addEdgeRequest(src, new Edge<Text, Text>(candidate, nextCandidateLabel));
     vertex.addEdgeRequest(candidate, new Edge<Text, Text>(src, prevCandidateLabel));
     nudge(vertex, new Text(candidate));
   } else {
     vertex.addEdgeRequest(src, new Edge<Text, Text>(DUMMY_VERTEX, nextCandidateLabel));
   }
   Text rTargetId = findEdgeByValue(vertex, parentReverseLabel);
   if (rTargetId != null) {
     Text candidate =
         methodFromConfig(vertex, deriveEquivalentVertexKey, Text.class)
             .calculate(vertex, src, rTargetId);
     vertex.addEdgeRequest(src, new Edge<Text, Text>(candidate, prevCandidateLabel));
     vertex.addEdgeRequest(candidate, new Edge<Text, Text>(src, nextCandidateLabel));
     nudge(vertex, new Text(candidate));
   } else {
     vertex.addEdgeRequest(src, new Edge<Text, Text>(DUMMY_VERTEX, prevCandidateLabel));
   }
   nudge(vertex, new Text(src));
 }