Advertisement
Guest User

Untitled

a guest
Dec 1st, 2016
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.22 KB | None | 0 0
  1. package unit;
  2.  
  3. import org.apache.commons.configuration.BaseConfiguration;
  4. import org.apache.commons.configuration.Configuration;
  5. import org.apache.tinkerpop.gremlin.process.traversal.Operator;
  6. import org.apache.tinkerpop.gremlin.process.traversal.P;
  7. import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
  8. import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
  9. import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
  10. import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
  11. import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
  12. import org.apache.tinkerpop.gremlin.structure.*;
  13. import org.apache.tinkerpop.gremlin.structure.util.GraphFactory;
  14. import org.junit.Assert;
  15. import org.junit.Ignore;
  16. import org.junit.Test;
  17. import org.slf4j.Logger;
  18. import org.slf4j.LoggerFactory;
  19. import org.umlg.sqlg.structure.SqlgGraph;
  20.  
  21. import java.util.Map;
  22. import java.util.function.Function;
  23. import java.util.function.Predicate;
  24.  
  25. import static org.apache.tinkerpop.gremlin.process.traversal.Pop.last;
  26. import static org.apache.tinkerpop.gremlin.process.traversal.Scope.local;
  27.  
  28. // * Find All Paths with max length 20
  29. // * only follow edges with the same speed values
  30. // * if there are multiple edges to the same vertex, pick the one with the smallest difference between departure time (from outV) and arrival time (from inV)
  31. // * ignore negative differences
  32. // * Ej->Vj->Ej+1 - condition Ej.arrTime <= Ej+1.depTime and (Ej+1.depTime - Ej.arrTime) is smallest value
  33. // * there two version of query
  34. public class SqlgTest {
  35. private static final Logger LOG = LoggerFactory.getLogger(SqlgTest.class);
  36.  
  37. @Test
  38. public void sqlgTest() {
  39. Configuration config = new BaseConfiguration();
  40. config.setProperty("jdbc.url", "jdbc:postgresql://localhost:5432/sqlg_test");
  41. config.setProperty("jdbc.username", "user");
  42. config.setProperty("jdbc.password", "password");
  43. SqlgGraph graph = SqlgGraph.open(config);
  44. GraphTraversalSource g = graph.traversal();
  45. graph.tx().open();
  46. loadData(graph);
  47. graph.tx().commit();
  48. GraphTraversal gp = query1(g);
  49. checkResult(gp);
  50. gp = query2(g);
  51. checkResult(gp);
  52. }
  53.  
  54. @Test
  55. public void tinkerGraphTest() {
  56. Configuration config = new BaseConfiguration();
  57. config.setProperty("gremlin.graph", "org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph");
  58. Graph graph = GraphFactory.open(config);
  59. GraphTraversalSource g = graph.traversal();
  60. loadData(graph);
  61. GraphTraversal gp = query1(g);
  62. checkResult(gp);
  63. gp = query2(g);
  64. checkResult(gp);
  65. }
  66.  
  67.  
  68. private void checkResult(GraphTraversal gp) {
  69. int count = 0;
  70. while (gp.hasNext()) {
  71. LOG.info(gp.next().toString());
  72. count++;
  73. }
  74. Assert.assertEquals(8, count);
  75. }
  76.  
  77. private void loadData(Graph graph) {
  78. Vertex v0 = graph.addVertex("code", "0");
  79. Vertex v1 = graph.addVertex("code", "1");
  80. Vertex v2 = graph.addVertex("code", "2");
  81. Vertex v3 = graph.addVertex("code", "3");
  82.  
  83. v0.addEdge("tsw", v1, "speed", "1", "arrTime", 10l, "depTime", 5l);
  84. v1.addEdge("tsw", v2, "speed", "1", "arrTime", 15l, "depTime", 9l); //must be ignored in longest path
  85. v1.addEdge("tsw", v2, "speed", "1", "arrTime", 20l, "depTime", 17l); //must be used in longest path
  86. v2.addEdge("tsw", v3, "speed", "1", "arrTime", 30l, "depTime", 25l);
  87. }
  88.  
  89. private GraphTraversal query1(GraphTraversalSource g) {
  90. Function timeAtWarehouse = new Function() {
  91. @Override
  92. public Long apply(Object o) {
  93. Map m = (Map) o;
  94. Long dt = ((Edge) (m.get("curr"))).value("depTime");
  95. Long at = ((Edge) (m.get("prev"))).value("arrTime");
  96. return (dt - at) >= 0 ? (dt - at) : Long.MAX_VALUE;
  97. }
  98. };
  99.  
  100. Predicate checkNegativeTime = new Predicate() {
  101. @Override
  102. public boolean test(Object o) {
  103. Map m = (Map) (((Traverser) o).get());
  104. Long dt = ((Edge) (m.get("curr"))).value("depTime");
  105. Long at = ((Edge) (m.get("prev"))).value("arrTime");
  106. return (dt - at) >= 0;
  107. }
  108. };
  109.  
  110. return g.V().outE("tsw").as("e").inV().emit().repeat(
  111. __.flatMap(
  112. __.outE("tsw").filter(__.as("edge").select(last, "e").where(P.eq("edge")).by("speed")).
  113. group().by(__.inV()).by(__.project("curr", "prev").by().by(__.select(last, "e")).fold()).select(Column.values).unfold().
  114. order(local).by(timeAtWarehouse).
  115. limit(local, 1).
  116. filter(checkNegativeTime).
  117. select("curr")
  118. ).as("e").inV().simplePath()
  119. ).times(20).map(__.union((Traversal) __.select(last, "e").by("speed"), (Traversal) __.path().by(T.id).by(__.valueMap("arrTime", "depTime"))).fold());
  120. }
  121.  
  122. private GraphTraversal query2(GraphTraversalSource g) {
  123. return g.withSack(0).V().outE("tsw").as("e").inV().emit().repeat(
  124. __.flatMap(
  125. __.outE("tsw").filter(__.as("edge").select(last, "e").where(P.eq("edge")).by("speed")).
  126. group().by(__.inV()).
  127. by(__.project("curr", "time").by().
  128. by(__.sack(Operator.assign).by("depTime").select(last, "e").sack(Operator.minus).by("arrTime").sack()).
  129. filter(__.select("time").is(P.gte(0))).fold()).
  130. select(Column.values).unfold().order(local).by(__.select("time")).limit(local, 1).select("curr")
  131. ).as("e").inV().simplePath()
  132. ).times(20).map(__.union((Traversal) __.select(last, "e").by("speed"), (Traversal) __.path().by(T.id).by(__.valueMap("arrTime", "depTime"))).fold());
  133. }
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement