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/05/29 00:44:04 UTC

incubator-tinkerpop git commit: Neo4jGraph is smart about ids given new designs in TP3. ElementHelper has a mixedId validator.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/neo4j-gremlin-apache dffcc033b -> 47f513070


Neo4jGraph is smart about ids given new designs in TP3. ElementHelper has a mixedId validator.


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

Branch: refs/heads/neo4j-gremlin-apache
Commit: 47f5130703098d0ab578b7fecbad122262f788e2
Parents: dffcc03
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu May 28 16:44:16 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu May 28 16:44:16 2015 -0600

----------------------------------------------------------------------
 .../gremlin/structure/util/ElementHelper.java   | 19 ++++-
 .../gremlin/neo4j/structure/Neo4jGraph.java     | 79 ++++++++++++++++++++
 .../gremlin/neo4j/structure/Neo4jVertex.java    | 45 +++++++++++
 .../neo4j/structure/full/FullNeo4jGraph.java    | 50 ++-----------
 .../neo4j/structure/full/FullNeo4jVertex.java   | 40 ----------
 .../structure/simple/SimpleNeo4jGraph.java      | 41 ++--------
 .../structure/simple/SimpleNeo4jVertex.java     | 60 ---------------
 7 files changed, 150 insertions(+), 184 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47f51307/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java
index c77b82d..f5b4f68 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java
@@ -18,11 +18,11 @@
  */
 package org.apache.tinkerpop.gremlin.structure.util;
 
-import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Property;
+import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 import org.javatuples.Pair;
@@ -85,6 +85,19 @@ public final class ElementHelper {
         return iterator.hasNext() ? iterator.next() : graph.addVertex(T.id, id, T.label, label);
     }
 
+    public static void validateMixedElementIds(final Class<? extends Element> clazz, final Object... ids) {
+        if (ids.length > 1) {
+            final boolean element = clazz.isAssignableFrom(ids[0].getClass());
+            for (int i = 1; i < ids.length; i++) {
+                final boolean assignable = clazz.isAssignableFrom(ids[i].getClass());
+                if (assignable && !element)
+                    throw Graph.Exceptions.idArgsMustBeEitherIdOrElement();
+                else if (!assignable && element)
+                    throw Graph.Exceptions.idArgsMustBeEitherIdOrElement();
+            }
+        }
+    }
+
     /**
      * Determines whether the property key/value for the specified thing can be legally set. This is typically used as
      * a pre-condition check prior to setting a property.
@@ -269,7 +282,7 @@ public final class ElementHelper {
      * Assign key/value pairs as properties to an {@link org.apache.tinkerpop.gremlin.structure.Vertex}.  If the value of {@link T#id} or
      * {@link T#label} is in the set of pairs, then they are ignored. The {@link org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality} of the key is determined from the {@link org.apache.tinkerpop.gremlin.structure.Graph.Features.VertexFeatures}.
      *
-     * @param vertex           the graph vertex to assign the {@code propertyKeyValues}
+     * @param vertex            the graph vertex to assign the {@code propertyKeyValues}
      * @param propertyKeyValues the key/value pairs to assign to the {@code element}
      * @throws ClassCastException       if the value of the key is not a {@link String}
      * @throws IllegalArgumentException if the value of {@code element} is null
@@ -280,7 +293,7 @@ public final class ElementHelper {
 
         for (int i = 0; i < propertyKeyValues.length; i = i + 2) {
             if (!propertyKeyValues[i].equals(T.id) && !propertyKeyValues[i].equals(T.label))
-                vertex.property(vertex.graph().features().vertex().getCardinality((String) propertyKeyValues[i]),  (String) propertyKeyValues[i], propertyKeyValues[i + 1]);
+                vertex.property(vertex.graph().features().vertex().getCardinality((String) propertyKeyValues[i]), (String) propertyKeyValues[i], propertyKeyValues[i + 1]);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47f51307/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
index 5697543..1e4c6da 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
@@ -28,6 +28,7 @@ import org.apache.tinkerpop.gremlin.neo4j.structure.simple.SimpleNeo4jGraph;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Transaction;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
@@ -35,6 +36,7 @@ import org.apache.tinkerpop.gremlin.structure.util.AbstractTransaction;
 import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 import org.apache.tinkerpop.gremlin.structure.util.wrapped.WrappedGraph;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.neo4j.tinkerpop.api.Neo4jFactory;
 import org.neo4j.tinkerpop.api.Neo4jGraphAPI;
 import org.neo4j.tinkerpop.api.Neo4jNode;
@@ -44,6 +46,8 @@ import org.neo4j.tinkerpop.api.Neo4jTx;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
 
 /**
  * @author Stephen Mallette (http://stephen.genoprime.com)
@@ -158,6 +162,10 @@ public abstract class Neo4jGraph implements Graph, WrappedGraph<Neo4jGraphAPI> {
 
     public abstract Neo4jEdge createEdge(final Neo4jRelationship relationship);
 
+    public abstract Predicate<Neo4jNode> getNodePredicate();
+
+    public abstract Predicate<Neo4jRelationship> getRelationshipPredicate();
+
     @Override
     public Vertex addVertex(final Object... keyValues) {
         ElementHelper.legalPropertyKeyValueArray(keyValues);
@@ -172,6 +180,72 @@ public abstract class Neo4jGraph implements Graph, WrappedGraph<Neo4jGraphAPI> {
         return vertex;
     }
 
+    @Override
+    public Iterator<Vertex> vertices(final Object... vertexIds) {
+        this.tx().readWrite();
+        if (0 == vertexIds.length) {
+            final Predicate<Neo4jNode> nodePredicate = this.getNodePredicate();
+            return IteratorUtils.stream(this.getBaseGraph().allNodes())
+                    .filter(node -> !this.checkElementsInTransaction || !Neo4jHelper.isDeleted(node))
+                    .filter(nodePredicate)
+                    .map(node -> (Vertex) this.createVertex(node)).iterator();
+        } else {
+            ElementHelper.validateMixedElementIds(Vertex.class, vertexIds);
+            return Stream.of(vertexIds)
+                    .map(id -> {
+                        if (id instanceof Number)
+                            return ((Number) id).longValue();
+                        else if (id instanceof String)
+                            return Long.valueOf(id.toString());
+                        else if (id instanceof Neo4jVertex) {
+                            return (Long) ((Neo4jVertex) id).id();
+                        } else
+                            throw new IllegalArgumentException("Unknown vertex id type: " + id);
+                    })
+                    .flatMap(id -> {
+                        try {
+                            return Stream.of((Vertex) this.createVertex(this.getBaseGraph().getNodeById(id)));
+                        } catch (final RuntimeException e) {
+                            if (Neo4jHelper.isNotFound(e)) return Stream.empty();
+                            throw e;
+                        }
+                    }).iterator();
+        }
+    }
+
+    @Override
+    public Iterator<Edge> edges(final Object... edgeIds) {
+        this.tx().readWrite();
+        if (0 == edgeIds.length) {
+            final Predicate<Neo4jRelationship> relationshipPredicate = this.getRelationshipPredicate();
+            return IteratorUtils.stream(this.getBaseGraph().allRelationships())
+                    .filter(relationship -> !this.checkElementsInTransaction || !Neo4jHelper.isDeleted(relationship))
+                    .filter(relationshipPredicate)
+                    .map(relationship -> (Edge) this.createEdge(relationship)).iterator();
+        } else {
+            ElementHelper.validateMixedElementIds(Edge.class, edgeIds);
+            return Stream.of(edgeIds)
+                    .map(id -> {
+                        if (id instanceof Number)
+                            return ((Number) id).longValue();
+                        else if (id instanceof String)
+                            return Long.valueOf(id.toString());
+                        else if (id instanceof Neo4jEdge) {
+                            return (Long) ((Neo4jEdge) id).id();
+                        } else
+                            throw new IllegalArgumentException("Unknown vertex id type: " + id);
+                    })
+                    .flatMap(id -> {
+                        try {
+                            return Stream.of((Edge) this.createEdge(this.getBaseGraph().getRelationshipById(id)));
+                        } catch (final RuntimeException e) {
+                            if (Neo4jHelper.isNotFound(e)) return Stream.empty();
+                            throw e;
+                        }
+                    }).iterator();
+        }
+    }
+
 
     /**
      * Construct a Neo4jGraph instance using an existing Neo4j raw instance.
@@ -469,6 +543,11 @@ public abstract class Neo4jGraph implements Graph, WrappedGraph<Neo4jGraphAPI> {
             public boolean supportsUserSuppliedIds() {
                 return false;
             }
+
+            @Override
+            public boolean supportsAnyIds() {
+                return false;
+            }
         }
 
         public class Neo4jEdgePropertyFeatures implements EdgePropertyFeatures {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47f51307/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertex.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertex.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertex.java
index 97ee84d..b9c216e 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertex.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertex.java
@@ -18,6 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.neo4j.structure;
 
+import org.apache.tinkerpop.gremlin.neo4j.structure.full.FullNeo4jVertexProperty;
+import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -26,12 +28,15 @@ import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 import org.apache.tinkerpop.gremlin.structure.util.wrapped.WrappedVertex;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.neo4j.tinkerpop.api.Neo4jNode;
+import org.neo4j.tinkerpop.api.Neo4jRelationship;
 
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.Set;
 import java.util.TreeSet;
+import java.util.function.Predicate;
 
 /**
  * @author Stephen Mallette (http://stephen.genoprime.com)
@@ -87,6 +92,46 @@ public abstract class Neo4jVertex extends Neo4jElement implements Vertex, Wrappe
         return String.join(LABEL_DELIMINATOR, this.labels());
     }
 
+    @Override
+    public Iterator<Vertex> vertices(final Direction direction, final String... edgeLabels) {
+        this.graph.tx().readWrite();
+        return new Iterator<Vertex>() {
+            final Iterator<Neo4jRelationship> relationshipIterator = IteratorUtils.filter(0 == edgeLabels.length ?
+                    getBaseVertex().relationships(Neo4jHelper.mapDirection(direction)).iterator() :
+                    getBaseVertex().relationships(Neo4jHelper.mapDirection(direction), (edgeLabels)).iterator(), graph.getRelationshipPredicate());
+
+            @Override
+            public boolean hasNext() {
+                return this.relationshipIterator.hasNext();
+            }
+
+            @Override
+            public Neo4jVertex next() {
+                return graph.createVertex(this.relationshipIterator.next().other(getBaseVertex()));
+            }
+        };
+    }
+
+    @Override
+    public Iterator<Edge> edges(final Direction direction, final String... edgeLabels) {
+        this.graph.tx().readWrite();
+        return new Iterator<Edge>() {
+            final Iterator<Neo4jRelationship> relationshipIterator = IteratorUtils.filter(0 == edgeLabels.length ?
+                    getBaseVertex().relationships(Neo4jHelper.mapDirection(direction)).iterator() :
+                    getBaseVertex().relationships(Neo4jHelper.mapDirection(direction), (edgeLabels)).iterator(), graph.getRelationshipPredicate());
+
+            @Override
+            public boolean hasNext() {
+                return this.relationshipIterator.hasNext();
+            }
+
+            @Override
+            public Neo4jEdge next() {
+                return graph.createEdge(this.relationshipIterator.next());
+            }
+        };
+    }
+
     /////////////// Neo4jVertex Specific Methods for Multi-Label Support ///////////////
     public Set<String> labels() {
         this.graph.tx().readWrite();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47f51307/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/full/FullNeo4jGraph.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/full/FullNeo4jGraph.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/full/FullNeo4jGraph.java
index a2e0b2c..c959ddd 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/full/FullNeo4jGraph.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/full/FullNeo4jGraph.java
@@ -26,19 +26,14 @@ import org.apache.commons.configuration.Configuration;
 import org.apache.tinkerpop.gremlin.neo4j.process.traversal.strategy.optimization.Neo4jGraphStepStrategy;
 import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jEdge;
 import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
-import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jHelper;
 import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jVertex;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.neo4j.tinkerpop.api.Neo4jGraphAPI;
 import org.neo4j.tinkerpop.api.Neo4jNode;
 import org.neo4j.tinkerpop.api.Neo4jRelationship;
 
-import java.util.Iterator;
-import java.util.stream.Stream;
+import java.util.function.Predicate;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -74,47 +69,12 @@ public final class FullNeo4jGraph extends Neo4jGraph {
     }
 
     @Override
-    public Iterator<Vertex> vertices(final Object... vertexIds) {
-        this.tx().readWrite();
-        if (0 == vertexIds.length) {
-            return IteratorUtils.stream(this.getBaseGraph().allNodes())
-                    .filter(node -> !this.checkElementsInTransaction || !Neo4jHelper.isDeleted(node))
-                    .filter(node -> !node.hasLabel(FullNeo4jVertexProperty.VERTEX_PROPERTY_LABEL))
-                    .map(node -> (Vertex) this.createVertex(node)).iterator();
-        } else {
-            return Stream.of(vertexIds)
-                    .filter(id -> id instanceof Number)
-                    .flatMap(id -> {
-                        try {
-                            return Stream.of((Vertex) this.createVertex(this.getBaseGraph().getNodeById(((Number) id).longValue())));
-                        } catch (final RuntimeException e) {
-                            if (Neo4jHelper.isNotFound(e)) return Stream.empty();
-                            throw e;
-                        }
-                    }).iterator();
-        }
+    public Predicate<Neo4jNode> getNodePredicate() {
+        return node -> !node.hasLabel(FullNeo4jVertexProperty.VERTEX_PROPERTY_LABEL);
     }
 
     @Override
-    public Iterator<Edge> edges(final Object... edgeIds) {
-        this.tx().readWrite();
-        if (0 == edgeIds.length) {
-            return IteratorUtils.stream(this.getBaseGraph().allRelationships())
-                    .filter(relationship -> !this.checkElementsInTransaction || !Neo4jHelper.isDeleted(relationship))
-                    .filter(relationship -> !relationship.type().startsWith(FullNeo4jVertexProperty.VERTEX_PROPERTY_PREFIX))
-                    .map(relationship -> (Edge) this.createEdge(relationship)).iterator();
-        } else {
-            return Stream.of(edgeIds)
-                    .filter(id -> id instanceof Number)
-                    .flatMap(id -> {
-                        try {
-                            return Stream.of((Edge) this.createEdge(this.getBaseGraph().getRelationshipById(((Number) id).longValue())));
-                        } catch (final RuntimeException e) {
-                            if (Neo4jHelper.isNotFound(e)) return Stream.empty();
-                            throw e;
-                        }
-                    }).iterator();
-        }
-
+    public Predicate<Neo4jRelationship> getRelationshipPredicate() {
+        return relationship -> !relationship.type().startsWith(FullNeo4jVertexProperty.VERTEX_PROPERTY_PREFIX);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47f51307/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/full/FullNeo4jVertex.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/full/FullNeo4jVertex.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/full/FullNeo4jVertex.java
index bc9d409..07d24ad 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/full/FullNeo4jVertex.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/full/FullNeo4jVertex.java
@@ -123,46 +123,6 @@ final class FullNeo4jVertex extends Neo4jVertex {
     }
 
     @Override
-    public Iterator<Vertex> vertices(final Direction direction, final String... edgeLabels) {
-        this.graph.tx().readWrite();
-        return new Iterator<Vertex>() {
-            final Iterator<Neo4jRelationship> relationshipIterator = IteratorUtils.filter(0 == edgeLabels.length ?
-                    getBaseVertex().relationships(Neo4jHelper.mapDirection(direction)).iterator() :
-                    getBaseVertex().relationships(Neo4jHelper.mapDirection(direction), (edgeLabels)).iterator(), r -> !r.type().startsWith(FullNeo4jVertexProperty.VERTEX_PROPERTY_PREFIX));
-
-            @Override
-            public boolean hasNext() {
-                return this.relationshipIterator.hasNext();
-            }
-
-            @Override
-            public Neo4jVertex next() {
-                return graph.createVertex(this.relationshipIterator.next().other(getBaseVertex()));
-            }
-        };
-    }
-
-    @Override
-    public Iterator<Edge> edges(final Direction direction, final String... edgeLabels) {
-        this.graph.tx().readWrite();
-        return new Iterator<Edge>() {
-            final Iterator<Neo4jRelationship> relationshipIterator = IteratorUtils.filter(0 == edgeLabels.length ?
-                    getBaseVertex().relationships(Neo4jHelper.mapDirection(direction)).iterator() :
-                    getBaseVertex().relationships(Neo4jHelper.mapDirection(direction), (edgeLabels)).iterator(), r -> !r.type().startsWith(FullNeo4jVertexProperty.VERTEX_PROPERTY_PREFIX));
-
-            @Override
-            public boolean hasNext() {
-                return this.relationshipIterator.hasNext();
-            }
-
-            @Override
-            public Neo4jEdge next() {
-                return graph.createEdge(this.relationshipIterator.next());
-            }
-        };
-    }
-
-    @Override
     public <V> Iterator<VertexProperty<V>> properties(final String... propertyKeys) {
         this.graph.tx().readWrite();
         return IteratorUtils.stream(getBaseVertex().getKeys())

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47f51307/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/simple/SimpleNeo4jGraph.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/simple/SimpleNeo4jGraph.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/simple/SimpleNeo4jGraph.java
index 9f3dec9..50d14cc 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/simple/SimpleNeo4jGraph.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/simple/SimpleNeo4jGraph.java
@@ -39,6 +39,7 @@ import org.neo4j.tinkerpop.api.Neo4jNode;
 import org.neo4j.tinkerpop.api.Neo4jRelationship;
 
 import java.util.Iterator;
+import java.util.function.Predicate;
 import java.util.stream.Stream;
 
 /**
@@ -77,45 +78,13 @@ public final class SimpleNeo4jGraph extends Neo4jGraph {
     }
 
     @Override
-    public Iterator<Vertex> vertices(final Object... vertexIds) {
-        this.tx().readWrite();
-        if (0 == vertexIds.length) {
-            return IteratorUtils.stream(this.getBaseGraph().allNodes())
-                    .filter(node -> !this.checkElementsInTransaction || !Neo4jHelper.isDeleted(node))
-                    .map(node -> (Vertex) new SimpleNeo4jVertex(node, this)).iterator();
-        } else {
-            return Stream.of(vertexIds)
-                    .filter(id -> id instanceof Number)
-                    .flatMap(id -> {
-                        try {
-                            return Stream.of((Vertex) new SimpleNeo4jVertex(this.getBaseGraph().getNodeById(((Number) id).longValue()), this));
-                        } catch (final RuntimeException e) {
-                            if (Neo4jHelper.isNotFound(e)) return Stream.empty();
-                            throw e;
-                        }
-                    }).iterator();
-        }
+    public Predicate<Neo4jNode> getNodePredicate() {
+        return node -> true;
     }
 
     @Override
-    public Iterator<Edge> edges(final Object... edgeIds) {
-        this.tx().readWrite();
-        if (0 == edgeIds.length) {
-            return IteratorUtils.stream(this.getBaseGraph().allRelationships())
-                    .filter(relationship -> !this.checkElementsInTransaction || !Neo4jHelper.isDeleted(relationship))
-                    .map(relationship -> (Edge) this.createEdge(relationship)).iterator();
-        } else {
-            return Stream.of(edgeIds)
-                    .filter(id -> id instanceof Number)
-                    .flatMap(id -> {
-                        try {
-                            return Stream.of((Edge) this.createEdge(this.getBaseGraph().getRelationshipById(((Number) id).longValue())));
-                        } catch (final RuntimeException e) {
-                            if (Neo4jHelper.isNotFound(e)) return Stream.empty();
-                            throw e;
-                        }
-                    }).iterator();
-        }
+    public Predicate<Neo4jRelationship> getRelationshipPredicate() {
+        return relationship -> true;
     }
 
     ////////////////////////

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/47f51307/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/simple/SimpleNeo4jVertex.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/simple/SimpleNeo4jVertex.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/simple/SimpleNeo4jVertex.java
index df73a8d..b4cb95f 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/simple/SimpleNeo4jVertex.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/simple/SimpleNeo4jVertex.java
@@ -21,14 +21,10 @@
 
 package org.apache.tinkerpop.gremlin.neo4j.structure.simple;
 
-import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jEdge;
 import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
 import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jHelper;
 import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jVertex;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Property;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
@@ -50,22 +46,6 @@ final class SimpleNeo4jVertex extends Neo4jVertex {
     }
 
     @Override
-    public Edge addEdge(final String label, final Vertex inVertex, final Object... keyValues) {
-        if (null == inVertex) throw Graph.Exceptions.argumentCanNotBeNull("inVertex");
-        if (this.removed) throw Element.Exceptions.elementAlreadyRemoved(Vertex.class, this.getBaseVertex().getId());
-        ElementHelper.validateLabel(label);
-        ElementHelper.legalPropertyKeyValueArray(keyValues);
-        if (ElementHelper.getIdValue(keyValues).isPresent())
-            throw Edge.Exceptions.userSuppliedIdsNotSupported();
-
-        this.graph.tx().readWrite();
-        final Neo4jNode node = (Neo4jNode) this.baseElement;
-        final Neo4jEdge edge = this.graph.createEdge(node.connectTo(((Neo4jVertex) inVertex).getBaseVertex(), label));
-        ElementHelper.attachProperties(edge, keyValues);
-        return edge;
-    }
-
-    @Override
     public <V> VertexProperty<V> property(final String key) {
         if (this.removed) throw Element.Exceptions.elementAlreadyRemoved(Vertex.class, this.getBaseVertex().getId());
         this.graph.tx().readWrite();
@@ -93,46 +73,6 @@ final class SimpleNeo4jVertex extends Neo4jVertex {
     }
 
     @Override
-    public Iterator<Vertex> vertices(final Direction direction, final String... edgeLabels) {
-        this.graph.tx().readWrite();
-        return new Iterator<Vertex>() {
-            final Iterator<Neo4jRelationship> relationshipIterator = 0 == edgeLabels.length ?
-                    getBaseVertex().relationships(Neo4jHelper.mapDirection(direction)).iterator() :
-                    getBaseVertex().relationships(Neo4jHelper.mapDirection(direction), (edgeLabels)).iterator();
-
-            @Override
-            public boolean hasNext() {
-                return this.relationshipIterator.hasNext();
-            }
-
-            @Override
-            public Neo4jVertex next() {
-                return graph.createVertex(this.relationshipIterator.next().other(getBaseVertex()));
-            }
-        };
-    }
-
-    @Override
-    public Iterator<Edge> edges(final Direction direction, final String... edgeLabels) {
-        this.graph.tx().readWrite();
-        return new Iterator<Edge>() {
-            final Iterator<Neo4jRelationship> relationshipIterator = 0 == edgeLabels.length ?
-                    getBaseVertex().relationships(Neo4jHelper.mapDirection(direction)).iterator() :
-                    getBaseVertex().relationships(Neo4jHelper.mapDirection(direction), (edgeLabels)).iterator();
-
-            @Override
-            public boolean hasNext() {
-                return this.relationshipIterator.hasNext();
-            }
-
-            @Override
-            public Neo4jEdge next() {
-                return graph.createEdge(this.relationshipIterator.next());
-            }
-        };
-    }
-
-    @Override
     public <V> Iterator<VertexProperty<V>> properties(final String... propertyKeys) {
         this.graph.tx().readWrite();
         return (Iterator) IteratorUtils.stream(getBaseVertex().getKeys())