private void verifyFeedEntityEdges(String feedName, String tag, String group) {
    Vertex feedVertex = getEntityVertex(feedName, RelationshipType.FEED_ENTITY);

    // verify edge to cluster vertex
    verifyVertexForEdge(
        feedVertex,
        Direction.OUT,
        RelationshipLabel.FEED_CLUSTER_EDGE.getName(),
        CLUSTER_ENTITY_NAME,
        RelationshipType.CLUSTER_ENTITY.getName());
    // verify edge to user vertex
    verifyVertexForEdge(
        feedVertex,
        Direction.OUT,
        RelationshipLabel.USER.getName(),
        FALCON_USER,
        RelationshipType.USER.getName());

    // verify edge to tags vertex
    verifyVertexForEdge(
        feedVertex, Direction.OUT, "classified-as", tag, RelationshipType.TAGS.getName());
    // verify edge to group vertex
    verifyVertexForEdge(
        feedVertex,
        Direction.OUT,
        RelationshipLabel.GROUPS.getName(),
        group,
        RelationshipType.GROUPS.getName());
  }
  private void verifyProcessEntityEdges() {
    Vertex processVertex = getEntityVertex(PROCESS_ENTITY_NAME, RelationshipType.PROCESS_ENTITY);

    // verify edge to cluster vertex
    verifyVertexForEdge(
        processVertex,
        Direction.OUT,
        RelationshipLabel.FEED_CLUSTER_EDGE.getName(),
        CLUSTER_ENTITY_NAME,
        RelationshipType.CLUSTER_ENTITY.getName());
    // verify edge to user vertex
    verifyVertexForEdge(
        processVertex,
        Direction.OUT,
        RelationshipLabel.USER.getName(),
        FALCON_USER,
        RelationshipType.USER.getName());
    // verify edge to tags vertex
    verifyVertexForEdge(
        processVertex, Direction.OUT, "classified-as", "Critical", RelationshipType.TAGS.getName());

    // verify edges to inputs
    List<String> actual = new ArrayList<String>();
    for (Edge edge :
        processVertex.getEdges(Direction.IN, RelationshipLabel.FEED_PROCESS_EDGE.getName())) {
      Vertex outVertex = edge.getVertex(Direction.OUT);
      Assert.assertEquals(
          RelationshipType.FEED_ENTITY.getName(),
          outVertex.getProperty(RelationshipProperty.TYPE.getName()));
      actual.add(outVertex.<String>getProperty(RelationshipProperty.NAME.getName()));
    }

    Assert.assertTrue(
        actual.containsAll(Arrays.asList("impression-feed", "clicks-feed")),
        "Actual does not contain expected: " + actual);

    actual.clear();
    // verify edges to outputs
    for (Edge edge :
        processVertex.getEdges(Direction.OUT, RelationshipLabel.PROCESS_FEED_EDGE.getName())) {
      Vertex outVertex = edge.getVertex(Direction.IN);
      Assert.assertEquals(
          RelationshipType.FEED_ENTITY.getName(),
          outVertex.getProperty(RelationshipProperty.TYPE.getName()));
      actual.add(outVertex.<String>getProperty(RelationshipProperty.NAME.getName()));
    }
    Assert.assertTrue(
        actual.containsAll(Arrays.asList("imp-click-join1", "imp-click-join2")),
        "Actual does not contain expected: " + actual);
  }
  private void verifyUpdatedEdges(Feed newFeed) {
    Vertex feedVertex = getEntityVertex(newFeed.getName(), RelationshipType.FEED_ENTITY);

    // groups
    Edge edge =
        feedVertex.getEdges(Direction.OUT, RelationshipLabel.GROUPS.getName()).iterator().next();
    Assert.assertEquals(edge.getVertex(Direction.IN).getProperty("name"), "reporting");

    // tags
    edge = feedVertex.getEdges(Direction.OUT, "classified-as").iterator().next();
    Assert.assertEquals(edge.getVertex(Direction.IN).getProperty("name"), "Secured");
    edge = feedVertex.getEdges(Direction.OUT, "source").iterator().next();
    Assert.assertEquals(edge.getVertex(Direction.IN).getProperty("name"), "data-warehouse");

    // new cluster
    List<String> actual = new ArrayList<String>();
    for (Edge clusterEdge :
        feedVertex.getEdges(Direction.OUT, RelationshipLabel.FEED_CLUSTER_EDGE.getName())) {
      actual.add(clusterEdge.getVertex(Direction.IN).<String>getProperty("name"));
    }
    Assert.assertTrue(
        actual.containsAll(Arrays.asList("primary-cluster", "another-cluster")),
        "Actual does not contain expected: " + actual);
  }
  public void updateFeedClusters(
      List<org.apache.falcon.entity.v0.feed.Cluster> oldClusters,
      List<org.apache.falcon.entity.v0.feed.Cluster> newClusters,
      Vertex feedEntityVertex) {
    if (areFeedClustersSame(oldClusters, newClusters)) {
      return;
    }

    // remove edges to old clusters
    for (org.apache.falcon.entity.v0.feed.Cluster oldCuster : oldClusters) {
      if (ClusterType.TARGET != oldCuster.getType()) {
        removeEdge(
            feedEntityVertex, oldCuster.getName(), RelationshipLabel.FEED_CLUSTER_EDGE.getName());
      }
    }

    // add edges to new clusters
    for (org.apache.falcon.entity.v0.feed.Cluster newCluster : newClusters) {
      if (ClusterType.TARGET != newCluster.getType()) {
        addRelationToCluster(
            feedEntityVertex, newCluster.getName(), RelationshipLabel.FEED_CLUSTER_EDGE);
      }
    }
  }