public void testRemoveManyEdges() {
    Graph graph = graphTest.getGraphInstance();
    long counter = 200000l;
    int edgeCount = 100;
    Set<Edge> edges = new HashSet<Edge>();
    for (int i = 0; i < edgeCount; i++) {
      Vertex out = graph.addVertex(convertId("" + counter++));
      Vertex in = graph.addVertex(convertId("" + counter++));
      edges.add(graph.addEdge(null, out, in, convertId("a" + UUID.randomUUID().toString())));
    }
    assertEquals(edgeCount, edges.size());

    if (graphTest.supportsVertexIteration) {
      this.stopWatch();
      assertEquals(edgeCount * 2, count(graph.getVertices()));
      BaseTest.printPerformance(
          graph.toString(), edgeCount * 2, "vertices counted", this.stopWatch());
    }

    if (graphTest.supportsEdgeIteration) {
      this.stopWatch();
      assertEquals(edgeCount, count(graph.getEdges()));
      BaseTest.printPerformance(graph.toString(), edgeCount, "edges counted", this.stopWatch());

      int i = edgeCount;
      this.stopWatch();
      for (Edge edge : edges) {
        graph.removeEdge(edge);
        i--;
        assertEquals(i, count(graph.getEdges()));
        if (graphTest.supportsVertexIteration) {
          int x = 0;
          for (Vertex vertex : graph.getVertices()) {
            if (count(vertex.getOutEdges()) > 0) {
              assertEquals(1, count(vertex.getOutEdges()));
              assertFalse(count(vertex.getInEdges()) > 0);
            } else if (count(vertex.getInEdges()) > 0) {
              assertEquals(1, count(vertex.getInEdges()));
              assertFalse(count(vertex.getOutEdges()) > 0);
            } else {
              x++;
            }
          }
          assertEquals((edgeCount - i) * 2, x);
        }
      }
      BaseTest.printPerformance(
          graph.toString(), edgeCount, "edges removed and graph checked", this.stopWatch());
    }
    graph.shutdown();
  }
  public void testAddManyVertexProperties(final Graph graph) {
    if (!config.isRDFModel) {
      Set<Vertex> vertices = new HashSet<Vertex>();
      this.stopWatch();
      for (int i = 0; i < 50; i++) {
        Vertex vertex = graph.addVertex(null);
        for (int j = 0; j < 15; j++) {
          vertex.setProperty(UUID.randomUUID().toString(), UUID.randomUUID().toString());
        }
        vertices.add(vertex);
      }
      BaseTest.printPerformance(
          graph.toString(),
          15 * 50,
          "vertex properties added (with vertices being added too)",
          this.stopWatch());

      if (config.supportsVertexIteration) assertEquals(50, count(graph.getVertices()));
      assertEquals(50, vertices.size());
      for (Vertex vertex : vertices) {
        assertEquals(15, vertex.getPropertyKeys().size());
      }
    } else {
      Set<Vertex> vertices = new HashSet<Vertex>();
      this.stopWatch();
      for (int i = 0; i < 50; i++) {
        Vertex vertex = graph.addVertex("\"" + UUID.randomUUID().toString() + "\"");
        for (int j = 0; j < 15; j++) {
          vertex.setProperty(SailTokens.DATATYPE, "http://www.w3.org/2001/XMLSchema#anyURI");
        }
        vertices.add(vertex);
      }
      BaseTest.printPerformance(
          graph.toString(),
          15 * 50,
          "vertex properties added (with vertices being added too)",
          this.stopWatch());
      if (config.supportsVertexIteration) assertEquals(count(graph.getVertices()), 50);
      assertEquals(vertices.size(), 50);
      for (Vertex vertex : vertices) {
        assertEquals(2, vertex.getPropertyKeys().size());
        assertTrue(vertex.getPropertyKeys().contains(SailTokens.DATATYPE));
        assertEquals(
            "http://www.w3.org/2001/XMLSchema#anyURI", vertex.getProperty(SailTokens.DATATYPE));
        assertTrue(vertex.getPropertyKeys().contains(SailTokens.VALUE));
      }
    }
  }
  public void testGetEdges() {
    Graph graph = graphTest.getGraphInstance();
    if (!graphTest.isRDFModel) {
      Vertex v1 = graph.addVertex(null);
      Vertex v2 = graph.addVertex(null);
      Vertex v3 = graph.addVertex(null);

      Edge e1 = graph.addEdge(null, v1, v2, "test1");
      Edge e2 = graph.addEdge(null, v2, v3, "test2");
      Edge e3 = graph.addEdge(null, v3, v1, "test3");

      this.stopWatch();
      assertEquals(graph.getEdge(e1.getId()), e1);
      assertEquals(graph.getEdge(e1.getId()).getInVertex(), v2);
      assertEquals(graph.getEdge(e1.getId()).getOutVertex(), v1);

      assertEquals(graph.getEdge(e2.getId()), e2);
      assertEquals(graph.getEdge(e2.getId()).getInVertex(), v3);
      assertEquals(graph.getEdge(e2.getId()).getOutVertex(), v2);

      assertEquals(graph.getEdge(e3.getId()), e3);
      assertEquals(graph.getEdge(e3.getId()).getInVertex(), v1);
      assertEquals(graph.getEdge(e3.getId()).getOutVertex(), v3);

      BaseTest.printPerformance(graph.toString(), 3, "edges retrieved", this.stopWatch());
    }
    graph.shutdown();
  }
  public void testVertexEquality(final Graph graph) {
    List<String> ids = generateIds(1);

    if (!config.ignoresSuppliedIds) {
      Vertex v = graph.addVertex(convertId(ids.get(0)));
      Vertex u = graph.getVertex(convertId(ids.get(0)));
      assertEquals(v, u);
    }

    this.stopWatch();
    Vertex v = graph.addVertex(null);
    Vertex u = graph.getVertex(v.getId());
    BaseTest.printPerformance(graph.toString(), 1, "vertex added and retrieved", this.stopWatch());

    assertEquals(v, u);
    assertEquals(graph.getVertex(u.getId()), graph.getVertex(u.getId()));
    assertEquals(graph.getVertex(v.getId()), graph.getVertex(u.getId()));
    assertEquals(graph.getVertex(v.getId()), graph.getVertex(v.getId()));

    graph.clear();

    if (!config.ignoresSuppliedIds) {
      v = graph.addVertex(convertId(ids.get(0)));
      u = graph.getVertex(convertId(ids.get(0)));
      Set<Vertex> set = new HashSet<Vertex>();
      set.add(v);
      set.add(v);
      set.add(u);
      set.add(u);
      set.add(graph.getVertex(convertId(ids.get(0))));
      set.add(graph.getVertex(convertId(ids.get(0))));
      if (config.supportsVertexIndex) set.add(graph.getVertices().iterator().next());
      assertEquals(1, set.size());
    }
  }
 public void testVertexIterator(final Graph graph) {
   int vertexCount = 5000;
   if (config.supportsVertexIteration) {
     this.stopWatch();
     Set ids = new HashSet();
     for (int i = 0; i < vertexCount; i++) {
       ids.add(graph.addVertex(null).getId());
     }
     BaseTest.printPerformance(graph.toString(), vertexCount, "vertices added", this.stopWatch());
     this.stopWatch();
     assertEquals(vertexCount, count(graph.getVertices()));
     BaseTest.printPerformance(
         graph.toString(), vertexCount, "vertices counted", this.stopWatch());
     // must create unique ids
     assertEquals(vertexCount, ids.size());
   }
 }
  public void testReadingTinkerGraph(Graph graph) throws Exception {
    if (!config.ignoresSuppliedIds) {

      this.stopWatch();
      GraphMLReader.inputGraph(
          graph, GraphMLReader.class.getResourceAsStream("graph-example-1.xml"));
      BaseTest.printPerformance(graph.toString(), null, "graph-example-1 loaded", this.stopWatch());

      assertEquals(count(graph.getVertex("1").getOutEdges()), 3);
      assertEquals(count(graph.getVertex("1").getInEdges()), 0);
      Vertex marko = graph.getVertex("1");
      assertEquals(marko.getProperty("name"), "marko");
      assertEquals(marko.getProperty("age"), 29);
      int counter = 0;
      for (Edge e : graph.getVertex("1").getOutEdges()) {
        if (e.getInVertex().getId().equals("2")) {
          // assertEquals(e.getProperty("weight"), 0.5);
          assertEquals(e.getLabel(), "knows");
          assertEquals(e.getId(), "7");
          counter++;
        } else if (e.getInVertex().getId().equals("3")) {
          assertEquals(Math.round((Float) e.getProperty("weight")), 0);
          assertEquals(e.getLabel(), "created");
          assertEquals(e.getId(), "9");
          counter++;
        } else if (e.getInVertex().getId().equals("4")) {
          assertEquals(Math.round((Float) e.getProperty("weight")), 1);
          assertEquals(e.getLabel(), "knows");
          assertEquals(e.getId(), "8");
          counter++;
        }
      }

      assertEquals(count(graph.getVertex("4").getOutEdges()), 2);
      assertEquals(count(graph.getVertex("4").getInEdges()), 1);
      Vertex josh = graph.getVertex("4");
      assertEquals(josh.getProperty("name"), "josh");
      assertEquals(josh.getProperty("age"), 32);
      for (Edge e : graph.getVertex("4").getOutEdges()) {
        if (e.getInVertex().getId().equals("3")) {
          assertEquals(Math.round((Float) e.getProperty("weight")), 0);
          assertEquals(e.getLabel(), "created");
          assertEquals(e.getId(), "11");
          counter++;
        } else if (e.getInVertex().getId().equals("5")) {
          assertEquals(Math.round((Float) e.getProperty("weight")), 1);
          assertEquals(e.getLabel(), "created");
          assertEquals(e.getId(), "10");
          counter++;
        }
      }

      assertEquals(counter, 5);
    }
  }
  public void testAddManyEdges() {
    Graph graph = graphTest.getGraphInstance();
    int edgeCount = 1000;
    int vertexCount = 2000;
    long counter = 0l;
    this.stopWatch();
    for (int i = 0; i < edgeCount; i++) {
      Vertex out = graph.addVertex(convertId("" + counter++));
      Vertex in = graph.addVertex(convertId("" + counter++));
      graph.addEdge(null, out, in, convertId(UUID.randomUUID().toString()));
    }
    BaseTest.printPerformance(
        graph.toString(), vertexCount + edgeCount, "elements added", this.stopWatch());
    if (graphTest.supportsEdgeIteration) {
      this.stopWatch();
      assertEquals(edgeCount, count(graph.getEdges()));
      BaseTest.printPerformance(graph.toString(), edgeCount, "edges counted", this.stopWatch());
    }
    if (graphTest.supportsVertexIteration) {
      this.stopWatch();
      assertEquals(vertexCount, count(graph.getVertices()));
      BaseTest.printPerformance(
          graph.toString(), vertexCount, "vertices counted", this.stopWatch());
      this.stopWatch();
      for (Vertex vertex : graph.getVertices()) {
        if (count(vertex.getOutEdges()) > 0) {
          assertEquals(1, count(vertex.getOutEdges()));
          assertFalse(count(vertex.getInEdges()) > 0);

        } else {
          assertEquals(1, count(vertex.getInEdges()));
          assertFalse(count(vertex.getOutEdges()) > 0);
        }
      }
      BaseTest.printPerformance(
          graph.toString(), vertexCount, "vertices checked", this.stopWatch());
    }
    graph.shutdown();
  }
  public void testNeo4jRaw() throws Exception {
    double totalTime = 0.0d;
    Graph graph = graphTest.getGraphInstance();
    GraphMLReader.inputGraph(graph, GraphMLReader.class.getResourceAsStream("graph-example-2.xml"));
    graph.shutdown();

    for (int i = 0; i < TOTAL_RUNS; i++) {
      graph = graphTest.getGraphInstance();
      GraphDatabaseService neo4j = ((Neo4jGraph) graph).getRawGraph();
      int counter = 0;
      this.stopWatch();
      for (final Node node : neo4j.getAllNodes()) {
        counter++;
        for (final Relationship relationship : node.getRelationships(Direction.OUTGOING)) {
          counter++;
          final Node node2 = relationship.getEndNode();
          counter++;
          for (final Relationship relationship2 : node2.getRelationships(Direction.OUTGOING)) {
            counter++;
            final Node node3 = relationship2.getEndNode();
            counter++;
            for (final Relationship relationship3 : node3.getRelationships(Direction.OUTGOING)) {
              counter++;
              relationship3.getEndNode();
              counter++;
            }
          }
        }
      }
      double currentTime = this.stopWatch();
      totalTime = totalTime + currentTime;
      BaseTest.printPerformance(
          neo4j.toString(), counter, "Neo4j raw elements touched", currentTime);
      graph.shutdown();
    }
    BaseTest.printPerformance(
        "Neo4jRaw", 1, "Neo4j Raw experiment average", totalTime / (double) TOTAL_RUNS);
  }
  public void testRemoveVertexNullId(final Graph graph) {
    int vertexCount = 1000;
    Vertex v1 = graph.addVertex(null);
    if (config.supportsVertexIteration) assertEquals(1, count(graph.getVertices()));
    graph.removeVertex(v1);
    if (config.supportsVertexIteration) assertEquals(0, count(graph.getVertices()));

    Set<Vertex> vertices = new HashSet<Vertex>();

    this.stopWatch();
    for (int i = 0; i < vertexCount; i++) {
      vertices.add(graph.addVertex(null));
    }
    BaseTest.printPerformance(graph.toString(), vertexCount, "vertices added", this.stopWatch());
    if (config.supportsVertexIteration) assertEquals(vertexCount, count(graph.getVertices()));

    this.stopWatch();
    for (Vertex v : vertices) {
      graph.removeVertex(v);
    }
    BaseTest.printPerformance(graph.toString(), vertexCount, "vertices deleted", this.stopWatch());
    if (config.supportsVertexIteration) assertEquals(0, count(graph.getVertices()));
  }
  public void testNeo4jGraph() throws Exception {
    double totalTime = 0.0d;
    Graph graph = graphTest.getGraphInstance();
    GraphMLReader.inputGraph(graph, GraphMLReader.class.getResourceAsStream("graph-example-2.xml"));
    graph.shutdown();

    for (int i = 0; i < TOTAL_RUNS; i++) {
      graph = graphTest.getGraphInstance();
      this.stopWatch();
      int counter = 0;
      for (final Vertex vertex : graph.getVertices()) {
        counter++;
        for (final Edge edge : vertex.getOutEdges()) {
          counter++;
          final Vertex vertex2 = edge.getInVertex();
          counter++;
          for (final Edge edge2 : vertex2.getOutEdges()) {
            counter++;
            final Vertex vertex3 = edge2.getInVertex();
            counter++;
            for (final Edge edge3 : vertex3.getOutEdges()) {
              counter++;
              edge3.getOutVertex();
              counter++;
            }
          }
        }
      }
      double currentTime = this.stopWatch();
      totalTime = totalTime + currentTime;
      BaseTest.printPerformance(
          graph.toString(), counter, "Neo4jGraph elements touched", currentTime);
      graph.shutdown();
    }
    BaseTest.printPerformance(
        "Neo4jGraph", 1, "Neo4jGraph experiment average", totalTime / (double) TOTAL_RUNS);
  }
  public void testAddEdges() {
    Graph graph = graphTest.getGraphInstance();
    List<String> ids = generateIds(3);

    this.stopWatch();
    Vertex v1 = graph.addVertex(convertId(ids.get(0)));
    Vertex v2 = graph.addVertex(convertId(ids.get(1)));
    Vertex v3 = graph.addVertex(convertId(ids.get(2)));
    graph.addEdge(null, v1, v2, convertId("knows"));
    graph.addEdge(null, v2, v3, convertId("pets"));
    graph.addEdge(null, v2, v3, convertId("cares_for"));
    assertEquals(1, count(v1.getOutEdges()));
    assertEquals(2, count(v2.getOutEdges()));
    assertEquals(0, count(v3.getOutEdges()));
    assertEquals(0, count(v1.getInEdges()));
    assertEquals(1, count(v2.getInEdges()));
    assertEquals(2, count(v3.getInEdges()));
    BaseTest.printPerformance(graph.toString(), 6, "elements added and checked", this.stopWatch());
    graph.shutdown();
  }
 public void testTinkerGraphSoftwareVertices(Graph graph) throws Exception {
   if (config.supportsVertexIteration) {
     this.stopWatch();
     GraphMLReader.inputGraph(
         graph, GraphMLReader.class.getResourceAsStream("graph-example-1.xml"));
     BaseTest.printPerformance(graph.toString(), null, "graph-example-1 loaded", this.stopWatch());
     Set<Vertex> softwareVertices = new HashSet<Vertex>();
     int count = 0;
     for (Vertex v : graph.getVertices()) {
       count++;
       String name = v.getProperty("name").toString();
       if (name.equals("lop") || name.equals("ripple")) {
         softwareVertices.add(v);
       }
     }
     assertEquals(count, 6);
     assertEquals(softwareVertices.size(), 2);
     for (Vertex v : softwareVertices) {
       assertEquals(v.getProperty("lang"), "java");
     }
   }
 }
 public void testTinkerGraphVertices(Graph graph) throws Exception {
   if (config.supportsVertexIteration) {
     this.stopWatch();
     GraphMLReader.inputGraph(
         graph, GraphMLReader.class.getResourceAsStream("graph-example-1.xml"));
     BaseTest.printPerformance(graph.toString(), null, "graph-example-1 loaded", this.stopWatch());
     Set<String> vertexNames = new HashSet<String>();
     int count = 0;
     for (Vertex v : graph.getVertices()) {
       count++;
       vertexNames.add(v.getProperty("name").toString());
       // System.out.println(v);
     }
     assertEquals(count, 6);
     assertEquals(vertexNames.size(), 6);
     assertTrue(vertexNames.contains("marko"));
     assertTrue(vertexNames.contains("josh"));
     assertTrue(vertexNames.contains("peter"));
     assertTrue(vertexNames.contains("vadas"));
     assertTrue(vertexNames.contains("ripple"));
     assertTrue(vertexNames.contains("lop"));
   }
 }
 public void testTinkerGraphEdges(Graph graph) throws Exception {
   if (config.supportsEdgeIteration) {
     this.stopWatch();
     GraphMLReader.inputGraph(
         graph, GraphMLReader.class.getResourceAsStream("graph-example-1.xml"));
     BaseTest.printPerformance(graph.toString(), null, "graph-example-1 loaded", this.stopWatch());
     Set<String> edgeIds = new HashSet<String>();
     Set<String> edgeKeys = new HashSet<String>();
     Set<String> edgeValues = new HashSet<String>();
     int count = 0;
     for (Edge e : graph.getEdges()) {
       count++;
       edgeIds.add(e.getId().toString());
       for (String key : e.getPropertyKeys()) {
         edgeKeys.add(key);
         edgeValues.add(e.getProperty(key).toString());
       }
     }
     assertEquals(count, 6);
     assertEquals(edgeIds.size(), 6);
     assertEquals(edgeKeys.size(), 1);
     assertEquals(edgeValues.size(), 4);
   }
 }
  public void testTinkerGraphVertexAndEdges(Graph graph) throws Exception {
    if (config.supportsVertexIteration) {
      this.stopWatch();
      GraphMLReader.inputGraph(
          graph, GraphMLReader.class.getResourceAsStream("graph-example-1.xml"));
      BaseTest.printPerformance(graph.toString(), null, "graph-example-1 loaded", this.stopWatch());
      Vertex marko = null;
      Vertex peter = null;
      Vertex josh = null;
      Vertex vadas = null;
      Vertex lop = null;
      Vertex ripple = null;
      int count = 0;
      for (Vertex v : graph.getVertices()) {
        count++;
        String name = v.getProperty("name").toString();
        if (name.equals("marko")) {
          marko = v;
        } else if (name.equals("peter")) {
          peter = v;
        } else if (name.equals("josh")) {
          josh = v;
        } else if (name.equals("vadas")) {
          vadas = v;
        } else if (name.equals("lop")) {
          lop = v;
        } else if (name.equals("ripple")) {
          ripple = v;
        } else {
          assertTrue(false);
        }
      }
      assertEquals(count, 6);
      assertTrue(null != marko);
      assertTrue(null != peter);
      assertTrue(null != josh);
      assertTrue(null != vadas);
      assertTrue(null != lop);
      assertTrue(null != ripple);

      // test marko
      Set<Vertex> vertices = new HashSet<Vertex>();
      assertEquals(marko.getProperty("name"), "marko");
      assertEquals(marko.getProperty("age"), 29);
      assertEquals(marko.getPropertyKeys().size(), 2);
      assertEquals(count(marko.getOutEdges()), 3);
      assertEquals(count(marko.getInEdges()), 0);
      for (Edge e : marko.getOutEdges()) {
        vertices.add(e.getInVertex());
      }
      assertEquals(vertices.size(), 3);
      assertTrue(vertices.contains(lop));
      assertTrue(vertices.contains(josh));
      assertTrue(vertices.contains(vadas));
      // test peter
      vertices = new HashSet<Vertex>();
      assertEquals(peter.getProperty("name"), "peter");
      assertEquals(peter.getProperty("age"), 35);
      assertEquals(peter.getPropertyKeys().size(), 2);
      assertEquals(count(peter.getOutEdges()), 1);
      assertEquals(count(peter.getInEdges()), 0);
      for (Edge e : peter.getOutEdges()) {
        vertices.add(e.getInVertex());
      }
      assertEquals(vertices.size(), 1);
      assertTrue(vertices.contains(lop));
      // test josh
      vertices = new HashSet<Vertex>();
      assertEquals(josh.getProperty("name"), "josh");
      assertEquals(josh.getProperty("age"), 32);
      assertEquals(josh.getPropertyKeys().size(), 2);
      assertEquals(count(josh.getOutEdges()), 2);
      assertEquals(count(josh.getInEdges()), 1);
      for (Edge e : josh.getOutEdges()) {
        vertices.add(e.getInVertex());
      }
      assertEquals(vertices.size(), 2);
      assertTrue(vertices.contains(lop));
      assertTrue(vertices.contains(ripple));
      vertices = new HashSet<Vertex>();
      for (Edge e : josh.getInEdges()) {
        vertices.add(e.getOutVertex());
      }
      assertEquals(vertices.size(), 1);
      assertTrue(vertices.contains(marko));
      // test vadas
      vertices = new HashSet<Vertex>();
      assertEquals(vadas.getProperty("name"), "vadas");
      assertEquals(vadas.getProperty("age"), 27);
      assertEquals(vadas.getPropertyKeys().size(), 2);
      assertEquals(count(vadas.getOutEdges()), 0);
      assertEquals(count(vadas.getInEdges()), 1);
      for (Edge e : vadas.getInEdges()) {
        vertices.add(e.getOutVertex());
      }
      assertEquals(vertices.size(), 1);
      assertTrue(vertices.contains(marko));
      // test lop
      vertices = new HashSet<Vertex>();
      assertEquals(lop.getProperty("name"), "lop");
      assertEquals(lop.getProperty("lang"), "java");
      assertEquals(lop.getPropertyKeys().size(), 2);
      assertEquals(count(lop.getOutEdges()), 0);
      assertEquals(count(lop.getInEdges()), 3);
      for (Edge e : lop.getInEdges()) {
        vertices.add(e.getOutVertex());
      }
      assertEquals(vertices.size(), 3);
      assertTrue(vertices.contains(marko));
      assertTrue(vertices.contains(josh));
      assertTrue(vertices.contains(peter));
      // test ripple
      vertices = new HashSet<Vertex>();
      assertEquals(ripple.getProperty("name"), "ripple");
      assertEquals(ripple.getProperty("lang"), "java");
      assertEquals(ripple.getPropertyKeys().size(), 2);
      assertEquals(count(ripple.getOutEdges()), 0);
      assertEquals(count(ripple.getInEdges()), 1);
      for (Edge e : ripple.getInEdges()) {
        vertices.add(e.getOutVertex());
      }
      assertEquals(vertices.size(), 1);
      assertTrue(vertices.contains(josh));
    }
  }