You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2018/08/13 18:43:00 UTC
[19/50] tinkerpop git commit: TINKERPOP-1878 Major refactoring of
sparql-gremlin classes
TINKERPOP-1878 Major refactoring of sparql-gremlin classes
Renamed the "compiler" to a "transpiler" since it's really transforming sparql to a language of a similar level of abstraction in Gremlin. Lots of code reformatting and dead code pruning.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/a8e25a84
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/a8e25a84
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/a8e25a84
Branch: refs/heads/TINKERPOP-1878
Commit: a8e25a8461c9a34f01eca561bd15e84bf84abdd4
Parents: 6211e76
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Fri Jan 26 13:36:29 2018 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Mon Aug 13 14:39:22 2018 -0400
----------------------------------------------------------------------
.../gremlin/sparql/SparqlToGremlinCompiler.java | 381 -------------------
.../sparql/SparqlToGremlinTranspiler.java | 286 ++++++++++++++
.../gremlin/sparql/TraversalBuilder.java | 7 +-
.../gremlin/sparql/WhereTraversalBuilder.java | 66 ++--
.../traversal/strategy/SparqlStrategy.java | 5 +-
5 files changed, 322 insertions(+), 423 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a8e25a84/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinCompiler.java
----------------------------------------------------------------------
diff --git a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinCompiler.java b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinCompiler.java
deleted file mode 100644
index adb36e9..0000000
--- a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinCompiler.java
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.tinkerpop.gremlin.sparql;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.jena.graph.Triple;
-import org.apache.jena.query.Query;
-import org.apache.jena.query.QueryFactory;
-import org.apache.jena.query.SortCondition;
-import org.apache.jena.query.Syntax;
-import org.apache.jena.sparql.algebra.Algebra;
-import org.apache.jena.sparql.algebra.Op;
-import org.apache.jena.sparql.algebra.OpVisitorBase;
-import org.apache.jena.sparql.algebra.OpWalker;
-import org.apache.jena.sparql.algebra.op.OpBGP;
-import org.apache.jena.sparql.algebra.op.OpFilter;
-import org.apache.jena.sparql.algebra.op.OpLeftJoin;
-import org.apache.jena.sparql.algebra.op.OpUnion;
-import org.apache.jena.sparql.core.Var;
-import org.apache.jena.sparql.core.VarExprList;
-import org.apache.jena.sparql.expr.Expr;
-import org.apache.jena.sparql.expr.ExprAggregator;
-import org.apache.tinkerpop.gremlin.process.traversal.Order;
-import org.apache.tinkerpop.gremlin.process.traversal.Scope;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-// TODO: implement OpVisitor, don't extend OpVisitorBase
-public class SparqlToGremlinCompiler extends OpVisitorBase {
-
- private GraphTraversal<Vertex, ?> traversal;
-
- List<Traversal> traversalList = new ArrayList<Traversal>();
-
- String groupVariable = "";
- int sortingDirection = 0;
- long offsetLimit = 0;
- String sortingVariable = "";
-
- GraphTraversalSource temp;
- Graph graph;
-
- private SparqlToGremlinCompiler(final GraphTraversal<Vertex, ?> traversal) {
- this.traversal = traversal;
- }
-
- private SparqlToGremlinCompiler(final GraphTraversalSource g) {
- this(g.V());
- temp = g;
-
- }
-
- private SparqlToGremlinCompiler(final Graph g) {
- this.traversal = (GraphTraversal<Vertex, ?>) g.traversal();
- graph = g;
- }
-
- public String createMatchStep(String step) {
- String st = "";
- step = step.substring(1, step.length() - 2);
- String first = step.substring(0, step.indexOf(","));
- String second = step.substring(step.indexOf(",") + 1);
- //System.out.println("First : " + first);
- //System.out.println("Second : " + second);
- st = first.substring(first.indexOf("["), first.length() - 1);
- st = "[" + st + "," + second + "]";
- return st;
- }
-
- GraphTraversal<Vertex, ?> convertToGremlinTraversal(final Query query) {
-
- // long startTime = System.currentTimeMillis();
- // long endTime;
- final Op op = Algebra.compile(query); // SPARQL query compiles here to
- // OP
-// System.out.println("OP Tree: " + op.toString());
-
-
- OpWalker.walk(op, this); // OP is being walked here
-
-
-
-
- //System.out.println("time taken for opWalker:"+ (endTime-startTime));
- // startTime = System.currentTimeMillis();
- int traversalIndex = 0;
- int numberOfTraversal = traversalList.size();
- Traversal arrayOfAllTraversals[] = new Traversal[numberOfTraversal];
-
- if (query.hasOrderBy() && !query.hasGroupBy()) {
- List<SortCondition> sortingConditions = query.getOrderBy();
- int directionOfSort = 0;
-
- for (SortCondition sortCondition : sortingConditions) {
- Expr expr = sortCondition.getExpression();
- directionOfSort = sortCondition.getDirection();
- sortingVariable = expr.getVarName();
-
- }
-
- Order orderDirection = Order.incr;
- if (directionOfSort == -1) {
- orderDirection = Order.decr;
- }
- }
- for (Traversal tempTrav : traversalList) {
-
- arrayOfAllTraversals[traversalIndex++] = tempTrav;
- }
-
- int directionOfSort = 0;
- Order orderDirection = Order.incr;
- if (query.hasOrderBy()) {
- List<SortCondition> sortingConditions = query.getOrderBy();
-
- //
- for (SortCondition sortCondition : sortingConditions) {
- Expr expr = sortCondition.getExpression();
- directionOfSort = sortCondition.getDirection();
- sortingVariable = expr.getVarName();
-// System.out.println("order by var: "+sortingDirection);
- }
- //
-
- if (directionOfSort == -1) {
- orderDirection = Order.decr;
- }
-
- }
-
- if (traversalList.size() > 0)
- traversal = traversal.match(arrayOfAllTraversals);
-
- final List<String> vars = query.getResultVars();
- List<ExprAggregator> lstexpr = query.getAggregators();
- if (!query.isQueryResultStar() && !query.hasGroupBy()) {
-
- switch (vars.size()) {
- case 0:
- throw new IllegalStateException();
- case 1:
- if (query.isDistinct()) {
-// System.out.println("Inside ------------------- >Select 1------------------------> Distinct");
- traversal = traversal.dedup(vars.get(0));
- }
- if (query.hasOrderBy()) {
-// System.out.println("Inside ------------------- >Select 1");
- traversal = traversal.order().by(sortingVariable, orderDirection);
- } else {
-
- traversal = traversal.select(vars.get(0));
- }
- break;
- case 2:
- if (query.isDistinct()) {
- traversal = traversal.dedup(vars.get(0), vars.get(1));
- }
- if (query.hasOrderBy()) {
-// System.out.println("Inside ------------------- >Select 1");
- traversal = traversal.order().by(__.select(vars.get(0)), orderDirection).by(__.select(vars.get(1)));
- } else
- traversal = traversal.select(vars.get(0), vars.get(1));
- break;
- default:
- final String[] all = new String[vars.size()];
- vars.toArray(all);
- if (query.isDistinct()) {
-
- traversal = traversal.dedup(all);
- }
- final String[] others = Arrays.copyOfRange(all, 2, vars.size());
- if (query.hasOrderBy()) {
-
- traversal = traversal.order().by(__.select(vars.get(0)), orderDirection).by(__.select(vars.get(1)));
-
- } else
- traversal = traversal.select(vars.get(0), vars.get(1), others);
-
- break;
- }
-
- }
-
-
- if (query.hasGroupBy()) {
- VarExprList lstExpr = query.getGroupBy();
- String grpVar = "";
- Traversal tempTrav;
- for (Var expr : lstExpr.getVars()) {
- grpVar = expr.getName();
- // System.out.println("The Group by var: " + expr.getName());
- }
-
- if (query.hasLimit()) {
- long limit = query.getLimit(), offset = 0;
-
- if (query.hasOffset()) {
- offset = query.getOffset();
-
- }
- // if (query.hasGroupBy() && query.hasOrderBy())
- // traversal = traversal.range( offset, offset + limit);
- // else
- // traversal = traversal.range(offset, offset + limit);
-
- }
-
- if (!grpVar.isEmpty())
- traversal = traversal.select(grpVar);
- if (query.hasAggregators()) {
- List<ExprAggregator> exprAgg = query.getAggregators();
- for (ExprAggregator expr : exprAgg) {
-
-// System.out.println("The Aggregator by var: " + expr.getAggregator().getExprList().toString()
-// + " is :" + expr.getAggregator().toString());
- if (expr.getAggregator().getName().contains("COUNT")) {
- if (!query.toString().contains("GROUP")) {
- if (expr.getAggregator().toString().contains("DISTINCT")) {
- traversal = traversal
- .dedup(expr.getAggregator().getExprList().get(0).toString().substring(1));
- } else {
- traversal = traversal
- .select(expr.getAggregator().getExprList().get(0).toString().substring(1));
- }
- traversal = traversal.count();
- } else
- traversal = traversal.groupCount();
- }
- if (expr.getAggregator().getName().contains("MAX")) {
- traversal = traversal.max();
- }
- }
-
- } else {
-
- traversal = traversal.group();
- }
-
-
- }
-
-
- if (query.hasOrderBy() && query.hasGroupBy()) {
-
- traversal = traversal.order().by(sortingVariable, orderDirection);
- }
- if (query.hasLimit()) {
- long limit = query.getLimit(), offset = 0;
-
- if (query.hasOffset()) {
- offset = query.getOffset();
-
- }
- if (query.hasGroupBy() && query.hasOrderBy())
- traversal = traversal.range(Scope.local, offset, offset + limit);
- else
- traversal = traversal.range(offset, offset + limit);
-
- }
- // endTime = System.currentTimeMillis();
- // System.out.println("time taken for convertToGremlinTraversal Function : "+ (endTime-startTime)+" mili seconds");
-
- return traversal;
- }
-
- private static GraphTraversal<Vertex, ?> convertToGremlinTraversal(final GraphTraversalSource g,
- final Query query) {
- return new SparqlToGremlinCompiler(g).convertToGremlinTraversal(query);
- }
-
- public static GraphTraversal<Vertex, ?> convertToGremlinTraversal(final Graph graph, final String query) {
- return convertToGremlinTraversal(graph.traversal(), QueryFactory.create(Prefixes.prepend(query)));
- }
-
- public static GraphTraversal<Vertex, ?> convertToGremlinTraversal(final GraphTraversalSource g,
- final String query) {
- return convertToGremlinTraversal(g, QueryFactory.create(Prefixes.prepend(query), Syntax.syntaxSPARQL));
- }
-
- // VISITING SPARQL ALGEBRA OP BASIC TRIPLE PATTERNS - MAYBE
- @Override
- public void visit(final OpBGP opBGP) {
- {
-
- // System.out.println("Inside opBGP ---------------------------------------------->");
- final List<Triple> triples = opBGP.getPattern().getList();
- final Traversal[] matchTraversals = new Traversal[triples.size()];
- int i = 0;
- for (final Triple triple : triples) {
-
- matchTraversals[i++] = TraversalBuilder.transform(triple);
- traversalList.add(matchTraversals[i - 1]);
- }
-
- }
-
- }
-
- // VISITING SPARQL ALGEBRA OP FILTER - MAYBE
- @Override
- public void visit(final OpFilter opFilter) {
-
- // System.out.println("Inside opFilter ---------------------------------------------->");
- Traversal traversal = null;
-
- for (Expr expr : opFilter.getExprs().getList()) {
- if (expr != null) {
-
- traversal = __.where(WhereTraversalBuilder.transform(expr));
- traversalList.add(traversal);
- }
- }
-
- }
- // TODO: add more functions for operators other than FILTER, such as
- // OPTIONAL
- // This can be done by understanding how Jena handles these other
- // operators/filters inherently and then map them to Gremlin
-
- public void visit(final OpLeftJoin opLeftJoin) {
-
-// System.out.println("Inside opOptional ---------------------------------------------->");
-// System.out.println(opLeftJoin.getRight().toString());
-
- }
-
- @Override
- public void visit(final OpUnion opUnion) {
-
- // System.out.println("Inside opUnion ---------------------------------------------->");
- Traversal unionTemp[] = new Traversal[2];
- Traversal unionTemp1[] = new Traversal[traversalList.size() / 2];
- Traversal unionTemp2[] = new Traversal[traversalList.size() / 2];
-
- int count = 0;
-
- for (int i = 0; i < traversalList.size(); i++) {
-
- if (i < traversalList.size() / 2) {
-
- unionTemp1[i] = traversalList.get(i);
- } else {
- unionTemp2[count++] = traversalList.get(i);
- }
- }
-
- unionTemp[1] = __.match(unionTemp2);
- unionTemp[0] = __.match(unionTemp1);
-
- traversalList.clear();
- traversal = (GraphTraversal<Vertex, ?>) traversal.union(unionTemp);
- // System.out.println("Getting out from Union -------------------> :
- // "+traversal);
- // traversalList.add(__.union(unionTemp));
- // traversalList.clear();
- }
-}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a8e25a84/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinTranspiler.java
----------------------------------------------------------------------
diff --git a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinTranspiler.java b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinTranspiler.java
new file mode 100644
index 0000000..9db7d82
--- /dev/null
+++ b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinTranspiler.java
@@ -0,0 +1,286 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.sparql;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.jena.graph.Triple;
+import org.apache.jena.query.Query;
+import org.apache.jena.query.QueryFactory;
+import org.apache.jena.query.SortCondition;
+import org.apache.jena.query.Syntax;
+import org.apache.jena.sparql.algebra.Algebra;
+import org.apache.jena.sparql.algebra.Op;
+import org.apache.jena.sparql.algebra.OpVisitorBase;
+import org.apache.jena.sparql.algebra.OpWalker;
+import org.apache.jena.sparql.algebra.op.OpBGP;
+import org.apache.jena.sparql.algebra.op.OpFilter;
+import org.apache.jena.sparql.algebra.op.OpUnion;
+import org.apache.jena.sparql.core.Var;
+import org.apache.jena.sparql.core.VarExprList;
+import org.apache.jena.sparql.expr.Expr;
+import org.apache.jena.sparql.expr.ExprAggregator;
+import org.apache.tinkerpop.gremlin.process.traversal.Order;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+/**
+ * The engine that transpiles SPARQL to Gremlin traversals thus enabling SPARQL to be executed on any TinkerPop-enabled
+ * graph system.
+ */
+public class SparqlToGremlinTranspiler {
+
+ private GraphTraversal<Vertex, ?> traversal;
+
+ private List<Traversal> traversalList = new ArrayList<>();
+
+ private String sortingVariable = "";
+
+ private SparqlToGremlinTranspiler(final GraphTraversal<Vertex, ?> traversal) {
+ this.traversal = traversal;
+ }
+
+ private SparqlToGremlinTranspiler(final GraphTraversalSource g) {
+ this(g.V());
+ }
+
+ /**
+ * Converts SPARQL to a Gremlin traversal.
+ *
+ * @param graph the {@link Graph} instance to execute the traversal from
+ * @param sparqlQuery the query to transpile to Gremlin
+ */
+ public static GraphTraversal<Vertex, ?> transpile(final Graph graph, final String sparqlQuery) {
+ return transpile(graph.traversal(), sparqlQuery);
+ }
+
+ /**
+ * Converts SPARQL to a Gremlin traversal.
+ *
+ * @param g the {@link GraphTraversalSource} instance to execute the traversal from
+ * @param sparqlQuery the query to transpile to Gremlin
+ */
+ public static GraphTraversal<Vertex, ?> transpile(final GraphTraversalSource g, final String sparqlQuery) {
+ return transpile(g, QueryFactory.create(Prefixes.prepend(sparqlQuery), Syntax.syntaxSPARQL));
+ }
+
+ private GraphTraversal<Vertex, ?> transpile(final Query query) {
+ final Op op = Algebra.compile(query);
+ OpWalker.walk(op, new GremlinOpVisitor());
+
+ int traversalIndex = 0;
+ final int numberOfTraversal = traversalList.size();
+ final Traversal arrayOfAllTraversals[] = new Traversal[numberOfTraversal];
+
+ if (query.hasOrderBy() && !query.hasGroupBy()) {
+ final List<SortCondition> sortingConditions = query.getOrderBy();
+
+ for (SortCondition sortCondition : sortingConditions) {
+ final Expr expr = sortCondition.getExpression();
+ sortingVariable = expr.getVarName();
+ }
+ }
+
+ for (Traversal tempTrav : traversalList) {
+ arrayOfAllTraversals[traversalIndex++] = tempTrav;
+ }
+
+ Order orderDirection = Order.incr;
+ if (query.hasOrderBy()) {
+ int directionOfSort = 0;
+ final List<SortCondition> sortingConditions = query.getOrderBy();
+
+ for (SortCondition sortCondition : sortingConditions) {
+ final Expr expr = sortCondition.getExpression();
+ directionOfSort = sortCondition.getDirection();
+ sortingVariable = expr.getVarName();
+ }
+
+ if (directionOfSort == -1) orderDirection = Order.decr;
+ }
+
+ if (traversalList.size() > 0)
+ traversal = traversal.match(arrayOfAllTraversals);
+
+ final List<String> vars = query.getResultVars();
+ if (!query.isQueryResultStar() && !query.hasGroupBy()) {
+ switch (vars.size()) {
+ case 0:
+ throw new IllegalStateException();
+ case 1:
+ if (query.isDistinct())
+ traversal = traversal.dedup(vars.get(0));
+
+ if (query.hasOrderBy())
+ traversal = traversal.order().by(sortingVariable, orderDirection);
+ else
+ traversal = traversal.select(vars.get(0));
+
+ break;
+ case 2:
+ if (query.isDistinct())
+ traversal = traversal.dedup(vars.get(0), vars.get(1));
+
+ if (query.hasOrderBy())
+ traversal = traversal.order().by(__.select(vars.get(0)), orderDirection).by(__.select(vars.get(1)));
+ else
+ traversal = traversal.select(vars.get(0), vars.get(1));
+
+ break;
+ default:
+ final String[] all = new String[vars.size()];
+ vars.toArray(all);
+ if (query.isDistinct())
+ traversal = traversal.dedup(all);
+
+ final String[] others = Arrays.copyOfRange(all, 2, vars.size());
+ if (query.hasOrderBy())
+ traversal = traversal.order().by(__.select(vars.get(0)), orderDirection).by(__.select(vars.get(1)));
+ else
+ traversal = traversal.select(vars.get(0), vars.get(1), others);
+
+ break;
+ }
+ }
+
+ if (query.hasGroupBy()) {
+ final VarExprList lstExpr = query.getGroupBy();
+ String grpVar = "";
+ for (Var expr : lstExpr.getVars()) {
+ grpVar = expr.getName();
+ }
+
+ if (!grpVar.isEmpty())
+ traversal = traversal.select(grpVar);
+ if (query.hasAggregators()) {
+ final List<ExprAggregator> exprAgg = query.getAggregators();
+ for (ExprAggregator expr : exprAgg) {
+ if (expr.getAggregator().getName().contains("COUNT")) {
+ if (!query.toString().contains("GROUP")) {
+ if (expr.getAggregator().toString().contains("DISTINCT"))
+ traversal = traversal.dedup(expr.getAggregator().getExprList().get(0).toString().substring(1));
+ else
+ traversal = traversal.select(expr.getAggregator().getExprList().get(0).toString().substring(1));
+
+ traversal = traversal.count();
+ } else {
+ traversal = traversal.groupCount();
+ }
+ }
+
+ if (expr.getAggregator().getName().contains("MAX")) {
+ traversal = traversal.max();
+ }
+ }
+ } else {
+ traversal = traversal.group();
+ }
+ }
+
+ if (query.hasOrderBy() && query.hasGroupBy())
+ traversal = traversal.order().by(sortingVariable, orderDirection);
+
+ if (query.hasLimit()) {
+ long limit = query.getLimit(), offset = 0;
+
+ if (query.hasOffset())
+ offset = query.getOffset();
+
+ if (query.hasGroupBy() && query.hasOrderBy())
+ traversal = traversal.range(Scope.local, offset, offset + limit);
+ else
+ traversal = traversal.range(offset, offset + limit);
+ }
+
+ return traversal;
+ }
+
+ private static GraphTraversal<Vertex, ?> transpile(final GraphTraversalSource g, final Query query) {
+ return new SparqlToGremlinTranspiler(g).transpile(query);
+ }
+
+ /**
+ * An {@code OpVisitor} implementation that reads SPARQL algebra operations into Gremlin traversals.
+ */
+ private class GremlinOpVisitor extends OpVisitorBase {
+
+ /**
+ * Visiting triple patterns in SPARQL algebra.
+ */
+ @Override
+ public void visit(final OpBGP opBGP) {
+ final List<Triple> triples = opBGP.getPattern().getList();
+ final Traversal[] matchTraversals = new Traversal[triples.size()];
+ int i = 0;
+ for (final Triple triple : triples) {
+
+ matchTraversals[i++] = TraversalBuilder.transform(triple);
+ traversalList.add(matchTraversals[i - 1]);
+ }
+ }
+
+ /**
+ * Visiting filters in SPARQL algebra.
+ */
+ @Override
+ public void visit(final OpFilter opFilter) {
+ Traversal traversal;
+ for (Expr expr : opFilter.getExprs().getList()) {
+ if (expr != null) {
+ traversal = __.where(WhereTraversalBuilder.transform(expr));
+ traversalList.add(traversal);
+ }
+ }
+ }
+
+ /**
+ * Visiting unions in SPARQL algebra.
+ */
+ @Override
+ public void visit(final OpUnion opUnion) {
+ final Traversal unionTemp[] = new Traversal[2];
+ final Traversal unionTemp1[] = new Traversal[traversalList.size() / 2];
+ final Traversal unionTemp2[] = new Traversal[traversalList.size() / 2];
+
+ int count = 0;
+
+ for (int i = 0; i < traversalList.size(); i++) {
+ if (i < traversalList.size() / 2)
+ unionTemp1[i] = traversalList.get(i);
+ else
+ unionTemp2[count++] = traversalList.get(i);
+ }
+
+ unionTemp[1] = __.match(unionTemp2);
+ unionTemp[0] = __.match(unionTemp1);
+
+ traversalList.clear();
+ traversal = (GraphTraversal<Vertex, ?>) traversal.union(unionTemp);
+ }
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a8e25a84/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/TraversalBuilder.java
----------------------------------------------------------------------
diff --git a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/TraversalBuilder.java b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/TraversalBuilder.java
index 72a32a5..6d29442 100644
--- a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/TraversalBuilder.java
+++ b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/TraversalBuilder.java
@@ -26,10 +26,12 @@ import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.structure.PropertyType;
import org.apache.tinkerpop.gremlin.structure.Vertex;
-
+/**
+ * Converts triple patterns into {@link GraphTraversal} instances.
+ */
class TraversalBuilder {
- public static GraphTraversal<?, ?> transform(final Triple triple) {
+ static GraphTraversal<?, ?> transform(final Triple triple) {
final GraphTraversal<Vertex, ?> matchTraversal = __.as(triple.getSubject().getName());
final Node predicate = triple.getPredicate();
@@ -53,7 +55,6 @@ class TraversalBuilder {
final PropertyType type, final Node object) {
switch (propertyName) {
case "id":
-
return object.isConcrete()
? traversal.hasId(object.getLiteralValue())
: traversal.id().as(object.getName());
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a8e25a84/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/WhereTraversalBuilder.java
----------------------------------------------------------------------
diff --git a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/WhereTraversalBuilder.java b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/WhereTraversalBuilder.java
index f4d49b6..80da707 100644
--- a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/WhereTraversalBuilder.java
+++ b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/WhereTraversalBuilder.java
@@ -33,61 +33,77 @@ import org.apache.jena.sparql.expr.E_LogicalAnd;
import org.apache.jena.sparql.expr.E_LogicalOr;
import org.apache.jena.sparql.expr.E_NotEquals;
import org.apache.jena.sparql.expr.E_NotExists;
-import org.apache.jena.sparql.expr.E_StrLength;
import org.apache.jena.sparql.expr.Expr;
import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+/**
+ * Converts SPARQL "where" expressions to Gremlin predicates.
+ */
class WhereTraversalBuilder {
- public static GraphTraversal<?, ?> transform(final E_Equals expression) {
- // System.out.println("The aggr one : "+expression.getArg1().getClass().getName() + "The aggr one :"+expression.getArg2().getClass().getName());
+ /**
+ * Converts a general {@code Expr} to an anonymous {@link GraphTraversal}.
+ */
+ static GraphTraversal<?, ?> transform(final Expr expression) {
+ if (expression instanceof E_Equals) return transform((E_Equals) expression);
+ if (expression instanceof E_NotEquals) return transform((E_NotEquals) expression);
+ if (expression instanceof E_LessThan) return transform((E_LessThan) expression);
+ if (expression instanceof E_LessThanOrEqual) return transform((E_LessThanOrEqual) expression);
+ if (expression instanceof E_GreaterThan) return transform((E_GreaterThan) expression);
+ if (expression instanceof E_GreaterThanOrEqual) return transform((E_GreaterThanOrEqual) expression);
+ if (expression instanceof E_LogicalAnd) return transform((E_LogicalAnd) expression);
+ if (expression instanceof E_LogicalOr) return transform((E_LogicalOr) expression);
+ if (expression instanceof E_Exists) return transform((E_Exists) expression);
+ if (expression instanceof E_NotExists) return transform((E_NotExists) expression);
+ throw new IllegalStateException(String.format("Unhandled expression: %s", expression));
+ }
+
+ private static GraphTraversal<?, ?> transform(final E_Equals expression) {
final Object value = expression.getArg2().getConstant().getNode().getLiteralValue();
return __.as(expression.getArg1().getVarName()).is(P.eq(value));
}
- public static GraphTraversal<?, ?> transform(final E_NotEquals expression) {
+ private static GraphTraversal<?, ?> transform(final E_NotEquals expression) {
final Object value = expression.getArg2().getConstant().getNode().getLiteralValue();
return __.as(expression.getArg1().getVarName()).is(P.neq(value));
}
- public static GraphTraversal<?, ?> transform(final E_LessThan expression) {
- // System.out.println("The aggr one : "+expression.getArg1().getClass().getName() + "The aggr one :"+expression.getArg2().getClass().getName());
+ private static GraphTraversal<?, ?> transform(final E_LessThan expression) {
final Object value = expression.getArg2().getConstant().getNode().getLiteralValue();
return __.as(expression.getArg1().getVarName()).is(P.lt(value));
}
- public static GraphTraversal<?, ?> transform(final E_LessThanOrEqual expression) {
- // System.out.println("The aggr one : "+expression.getArg1().getClass().getName() + "The aggr one :"+expression.getArg2().getClass().getName());
+ private static GraphTraversal<?, ?> transform(final E_LessThanOrEqual expression) {
final Object value = expression.getArg2().getConstant().getNode().getLiteralValue();
return __.as(expression.getArg1().getVarName()).is(P.lte(value));
}
- public static GraphTraversal<?, ?> transform(final E_GreaterThan expression) {
+ private static GraphTraversal<?, ?> transform(final E_GreaterThan expression) {
final Object value = expression.getArg2().getConstant().getNode().getLiteralValue();
return __.as(expression.getArg1().getVarName()).is(P.gt(value));
}
- public static GraphTraversal<?, ?> transform(final E_GreaterThanOrEqual expression) {
+ private static GraphTraversal<?, ?> transform(final E_GreaterThanOrEqual expression) {
final Object value = expression.getArg2().getConstant().getNode().getLiteralValue();
return __.as(expression.getArg1().getVarName()).is(P.gte(value));
}
- public static GraphTraversal<?, ?> transform(final E_LogicalAnd expression) {
+ private static GraphTraversal<?, ?> transform(final E_LogicalAnd expression) {
return __.and(
transform(expression.getArg1()),
transform(expression.getArg2()));
}
- public static GraphTraversal<?, ?> transform(final E_LogicalOr expression) {
+ private static GraphTraversal<?, ?> transform(final E_LogicalOr expression) {
return __.or(
transform(expression.getArg1()),
transform(expression.getArg2()));
}
- public static GraphTraversal<?, ?> transform(final E_Exists expression) {
+ private static GraphTraversal<?, ?> transform(final E_Exists expression) {
final OpBGP opBGP = (OpBGP) expression.getGraphPattern();
final List<Triple> triples = opBGP.getPattern().getList();
if (triples.size() != 1) throw new IllegalStateException("Unhandled EXISTS pattern");
@@ -99,7 +115,7 @@ class WhereTraversalBuilder {
}
- public static GraphTraversal<?, ?> transform(final E_NotExists expression) {
+ private static GraphTraversal<?, ?> transform(final E_NotExists expression) {
final OpBGP opBGP = (OpBGP) expression.getGraphPattern();
final List<Triple> triples = opBGP.getPattern().getList();
if (triples.size() != 1) throw new IllegalStateException("Unhandled NOT EXISTS pattern");
@@ -109,26 +125,4 @@ class WhereTraversalBuilder {
endStep.removeLabel(label);
return __.not(traversal);
}
-
- public static int getStrLength(final E_StrLength expression){
-
- return expression.getArg().toString().length();
-
- }
-
-
- //what does <?, ?> signify? possibly <S,E>
- public static GraphTraversal<?, ?> transform(final Expr expression) {
- if (expression instanceof E_Equals) return transform((E_Equals) expression);
- if (expression instanceof E_NotEquals) return transform((E_NotEquals) expression);
- if (expression instanceof E_LessThan) return transform((E_LessThan) expression);
- if (expression instanceof E_LessThanOrEqual) return transform((E_LessThanOrEqual) expression);
- if (expression instanceof E_GreaterThan) return transform((E_GreaterThan) expression);
- if (expression instanceof E_GreaterThanOrEqual) return transform((E_GreaterThanOrEqual) expression);
- if (expression instanceof E_LogicalAnd) return transform((E_LogicalAnd) expression);
- if (expression instanceof E_LogicalOr) return transform((E_LogicalOr) expression);
- if (expression instanceof E_Exists) return transform((E_Exists) expression);
- if (expression instanceof E_NotExists) return transform((E_NotExists) expression);
- throw new IllegalStateException(String.format("Unhandled expression: %s", expression));
- }
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a8e25a84/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java
----------------------------------------------------------------------
diff --git a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java
index d74ac3e..4073ec2 100644
--- a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java
+++ b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java
@@ -18,7 +18,6 @@
*/
package org.apache.tinkerpop.gremlin.sparql.process.traversal.strategy;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
import org.apache.tinkerpop.gremlin.process.remote.traversal.strategy.decoration.RemoteStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
@@ -26,7 +25,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.ConstantStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.sparql.SparqlToGremlinCompiler;
+import org.apache.tinkerpop.gremlin.sparql.SparqlToGremlinTranspiler;
import org.apache.tinkerpop.gremlin.sparql.process.traversal.dsl.sparql.SparqlTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Vertex;
@@ -69,7 +68,7 @@ public class SparqlStrategy extends AbstractTraversalStrategy<TraversalStrategy.
final Object constant = stepWithSparql.getConstant();
if (constant instanceof String) {
final String sparql = (String) constant;
- final Traversal<Vertex, ?> sparqlTraversal = SparqlToGremlinCompiler.convertToGremlinTraversal(
+ final Traversal<Vertex, ?> sparqlTraversal = SparqlToGremlinTranspiler.transpile(
traversal.getGraph().get(), sparql);
TraversalHelper.removeAllSteps(traversal);
sparqlTraversal.asAdmin().getSteps().forEach(s -> traversal.addStep(s));