Search code examples
javacassandratitangremlintinkerpop3

Sorting in TitanDB with Gremlin


Each vertices and edges has following properties:

Request [req_id: long, submit_time:long, priority:int, status:char]  
Test_B [tb_id: long, tb_name: string]  
TestSuite [suite_id: long, Suite_Status: char]  
Edge-A [sequence_num: int]  
Edge-B [ sequence_num: int, suite_status: char] 

Relationship between vertices and edges:

Request----EdgeA----Test-B  
Request----EdgeB----TestSuite  
TestSuite----EdgeC----Test-B  

Below query is ordering(submit_time from request) in ascending order and will display the TestSuite details:

g.V().order().by("submit_time",incr).outE("Edge-B").
  has("suite_status","Q").inV().valueMap() 

Here is an example graph:

rj1=graph.addVertex(label,"request","req_id",1138,"status","S","priority",3,"submit_time",1330647978000)
rj2=graph.addVertex(label,"request","req_id",1133,"status","S","priority",2,"submit_time",1330662012000)
rj3=graph.addVertex(label,"request","req_id",1136,"status","S","priority",1,"submit_time",1330652298000)
rj4=graph.addVertex(label,"request","req_id",1135,"status","S","priority",1,"submit_time",1330666768000)

ts1=graph.addVertex(label,"test_suite","test_suite_id",8713)
ts2=graph.addVertex(label,"test_suite","test_suite_id",8718)
ts3=graph.addVertex(label,"test_suite","test_suite_id",8688)
ts4=graph.addVertex(label,"test_suite","test_suite_id",8729)

tb1=graph.addVertex(label,"test_b","tb_id",574)
tb2=graph.addVertex(label,"test_b","tb_id",573)
tb3=graph.addVertex(label,"test_b","tb_id",577)


e1=rj1.addEdge("edgeB",ts1,"sequence",1,"job_suite_status","Q")
e2=rj1.addEdge("edgeB",ts2,"sequence",2,"job_suite_status","Q")
e1=rj2.addEdge("edgeB",ts1,"sequence",1,"job_suite_status","Q")
e2=rj2.addEdge("edgeB",ts3,"sequence",2,"job_suite_status","Q")
e1=rj3.addEdge("edgeB",ts4,"sequence",1,"job_suite_status","Q")
e2=rj3.addEdge("edgeB",ts2,"sequence",2,"job_suite_status","Q")
e1=rj4.addEdge("edgeB",ts3,"sequence",1,"job_suite_status","Q")
e2=rj4.addEdge("edgeB",ts4,"sequence",2,"job_suite_status","Q")

e1=rj1.addEdge("edgeA",tb1,"sequence",1)
e2=rj1.addEdge("edgeA",tb2,"sequence",2)
e3=rj2.addEdge("edgeA",tb1,"sequence",1)
e4=rj2.addEdge("edgeA",tb1,"sequence",2)
e5=rj3.addEdge("edgeA",tb2,"sequence",1)
e6=rj3.addEdge("edgeA",tb3,"sequence",2)
e7=rj4.addEdge("edgeA",tb3,"sequence",2)
e8=rj4.addEdge("edgeA",tb1,"sequence",1)

Here, rj1, rj2, rj4 is connected to tb1(edgeA): so for each test_b (example: tb_id=574), sort request(rj1,rj2,rj4) based on submit_time and take test_suite_id and sequence.

Finally I need to print test_suite_id, sequence, and corresponding req_id. Kindly help me to resolve this. Thanks.


Solution

  • It helps to label steps with as() and then use select() to prepare the result.

    g.V().has("tb_id", 574).
      in("edgeA").dedup().as("r").
      order().by("submit_time", Order.incr).as("st").
      outE("edgeB").has("job_suite_status", "Q").as("s").
      inV().as("t").
      select("t", "s", "r", "st").
        by("test_suite_id").by("sequence").by("req_id").by("submit_time")
    

    Start from the test with tb_id 574, then traverse to its requests (label as r), order the requests by submit time (label as st), traverse to the sequences (label as s), finally traverse to the test suites (label as t).

    Use select() to prepare the result output and by() to pick the properties: test suite, sequence, request, and submit time.