You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/06/24 00:36:50 UTC

incubator-tinkerpop git commit: added cypher vs. gremlin match() in Neo4jCypherTest.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master 8aaef32b4 -> dba50ee48


added cypher vs. gremlin match() in Neo4jCypherTest.


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/dba50ee4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/dba50ee4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/dba50ee4

Branch: refs/heads/master
Commit: dba50ee48af034ea77ed23e0f405ca2938d7555a
Parents: 8aaef32
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Jun 23 16:36:45 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Jun 23 16:36:45 2015 -0600

----------------------------------------------------------------------
 .../gremlin/driver/simple/SimpleClient.java     | 16 ----
 .../neo4j/process/NativeNeo4jCypherTest.java    | 83 ++++++++++++++++++++
 2 files changed, 83 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/dba50ee4/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/simple/SimpleClient.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/simple/SimpleClient.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/simple/SimpleClient.java
index 15b280f..3cd4701 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/simple/SimpleClient.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/simple/SimpleClient.java
@@ -26,29 +26,13 @@ import java.io.Closeable;
 import java.util.function.Consumer;
 
 /**
- * Interface for a simple implementation of a client for Gremlin Server.  It is meant largely for testing purposes
- * and very simple scenarios where it is better to be closer to the {@link RequestMessage} and
- * {@link ResponseMessage}.
- *
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public interface SimpleClient extends Closeable {
 
-    /**
-     * Helper method for constructing a {@link RequestMessage} that requests an evaluation of a Gremlin query.
-     *
-     * @param gremlin the query to execute
-     * @param callback the callback that occurs when the result arrives.
-     */
     public default void submit(final String gremlin, final Consumer<ResponseMessage> callback) throws Exception {
         submit(RequestMessage.build(Tokens.OPS_EVAL).addArg(Tokens.ARGS_GREMLIN, gremlin).create(), callback);
     }
 
-    /**
-     * Sends a {@link RequestMessage} to the server.
-     *
-     * @param requestMessage the message to send
-     * @param callback the callback that occurs when the result arrives.
-     */
     public void submit(final RequestMessage requestMessage, final Consumer<ResponseMessage> callback) throws Exception;
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/dba50ee4/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/NativeNeo4jCypherTest.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/NativeNeo4jCypherTest.java b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/NativeNeo4jCypherTest.java
index 872dadc..48aa308 100644
--- a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/NativeNeo4jCypherTest.java
+++ b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/NativeNeo4jCypherTest.java
@@ -20,8 +20,13 @@ package org.apache.tinkerpop.gremlin.neo4j.process;
 
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.neo4j.AbstractNeo4jGremlinTest;
+import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
+import org.apache.tinkerpop.gremlin.process.traversal.P;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.TimeUtil;
 import org.junit.Test;
 
 import java.util.Arrays;
@@ -30,7 +35,10 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Supplier;
 
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.as;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.where;
 import static org.junit.Assert.*;
 
 /**
@@ -122,4 +130,79 @@ public class NativeNeo4jCypherTest extends AbstractNeo4jGremlinTest {
         assertTrue(result.contains(v2.id()));
     }
 
+    @Test
+    @LoadGraphWith(LoadGraphWith.GraphData.GRATEFUL)
+    public void benchmarkCypherAndMatch() throws Exception {
+        final Neo4jGraph n = (Neo4jGraph) graph;
+        final List<Supplier<GraphTraversal<?, ?>>> traversals = Arrays.asList(
+                () -> g.V().match("a",
+                        as("a").in("sungBy").as("b"),
+                        as("a").in("writtenBy").as("b")).select().by("name"),
+                () -> n.cypher("MATCH (a)<-[:sungBy]-(b), (a)<-[:writtenBy]-(b) RETURN a.name, b.name"),
+                ///
+                () -> g.V().match("a",
+                        as("a").out("followedBy").as("b"),
+                        as("b").out("followedBy").as("a")).select().by("name"),
+                () -> n.cypher("MATCH (a)-[:followedBy]->(b), (b)-[:followedBy]->(a) RETURN a.name, b.name"),
+                ///
+                /*() -> g.V().match("a",
+                        as("a").out("followedBy").count().as("b"),
+                        as("a").in("followedBy").count().as("b"),
+                        as("b").is(P.gt(10))).select("a").by("name"),
+                () -> n.cypher("MATCH (a)-[:followedBy]->(b), (a)<-[:followedBy]-(c) WITH a, COUNT(b) AS bCount, COUNT(c) AS cCount WHERE bCount = cCount AND bCount > 10 RETURN a.name"),
+                ///
+                () -> g.V().match("a",
+                        as("a").in("sungBy").count().as("b"),
+                        as("a").in("sungBy").as("c"),
+                        as("c").out("followedBy").as("d"),
+                        as("d").out("sungBy").as("e"),
+                        as("e").in("sungBy").count().as("b"),
+                        where("a",P.neq("e"))).select("a","e").by("name"),
+                () -> n.cypher("MATCH (a)<-[:sungBy]-(b), (a)<-[:sungBy]-(c), (c)-[:followedBy]->(d), (d)-[:sungBy]->(e), (e)<-[:sungBy]-(f) WITH a, e, COUNT(b) as countB, COUNT(f) as countF WHERE a <> e AND countB = countF RETURN a.name, e.name"),*/
+                ///
+                () -> g.V().match("a",
+                        as("a").in("followedBy").as("b"),
+                        as("a").out("sungBy").as("c"),
+                        as("a").out("writtenBy").as("d")).select().by("name"),
+                () -> n.cypher("MATCH (a)<-[:followedBy]-(b), (a)-[:sungBy]->(c), (a)-[:writtenBy]->(d) RETURN a.name, b.name, c.name, d.name"),
+                ///
+                () -> g.V().match("a",
+                        as("a").in("followedBy").as("b"),
+                        as("a").out("sungBy").as("c"),
+                        as("a").out("writtenBy").as("d"),
+                        where("c", P.neq("d"))).select().by("name"),
+                () -> n.cypher("MATCH (a)<-[:followedBy]-(b), (a)-[:sungBy]->(c), (a)-[:writtenBy]->(d) WHERE c <> d RETURN a.name, b.name, c.name, d.name"),
+                ///
+                () -> g.V().match("a",
+                        as("a").in("sungBy").as("b"),
+                        as("a").in("writtenBy").as("b"),
+                        as("b").out("followedBy").as("c"),
+                        as("c").out("sungBy").as("a"),
+                        as("c").out("writtenBy").as("a")).select().by("name"),
+                () -> n.cypher("MATCH (a)<-[:sungBy]-(b), (a)<-[:writtenBy]->(b), (b)-[:followedBy]->(c), (c)-[:sungBy]->(a), (c)-[:writtenBy]->(a) RETURN a.name, b.name, c.name"),
+                ///
+                () -> g.V().match("a",
+                        as("a").has("name", "Garcia").has(T.label, "artist"),
+                        as("a").in("writtenBy").as("b"),
+                        as("b").out("followedBy").as("c"),
+                        as("c").out("writtenBy").as("d"),
+                        as("d").where(P.neq("a"))).select().by("name"),
+                () -> n.cypher("MATCH (a)<-[:writtenBy]-(b), (b)-[:followedBy]->(c), (c)-[:writtenBy]->(d) WHERE a <> d AND a.name = 'Garcia' AND 'artist' IN labels(a) RETURN a.name, b.name, c.name, d.name"),
+                ///
+                () -> g.V().as("a").out("followedBy").as("b").match(
+                        as("a").has(T.label, "song").has("performances", P.gt(10)),
+                        as("a").out("writtenBy").as("c"),
+                        as("b").out("writtenBy").as("c")).select().by("name"),
+                () -> n.cypher("MATCH (a)-[:followedBy]->(b), (a)-[:writtenBy]->(c), (b)-[:writtenBy]->(c) WHERE a.performances > 10 AND 'song' IN labels(a) RETURN a.name, b.name, c.name")
+        );
+        int counter = 0;
+        for (final Supplier<GraphTraversal<?, ?>> traversal : traversals) {
+            System.out.println("pre-strategy:  " + traversal.get());
+            System.out.println("post-strategy: " + traversal.get().iterate());
+            System.out.println(TimeUtil.clockWithResult(50, () -> traversal.get().count().next()));
+            if (++counter % 2 == 0)
+                System.out.println("------------------");
+        }
+    }
+
 }
\ No newline at end of file