Reputation: 384
In the above graph, I have users, Clients, Sites and Jobs. User is connected to Client (manages) and client (have) --> Sites (have) ---> Jobs. I'm trying to get all clients which have active jobs.
g.V().hasLabel('user').
has('id', '338d219c-3457-4ad8-8172-37a7d897c0df').
outE('manages').
inV().
hasLabel('client').
outE('have').
inV().
hasLabel('site').
outE('have').
inV().
hasLabel('job').
has('status', 'In Progress')
The above query gets all jobs, but I'm interested in knowing Client, Site and Job. I was wondering how can I achieve that?
Upvotes: 1
Views: 624
Reputation: 46206
There are few ways that you might do this, but first let's simplify your existing Gremlin since you say it does what you want:
g.V().has('user','id','338d219c-3457-4ad8-8172-37a7d897c0df').
out('manages').
hasLabel('client').
out('have').
hasLabel('site').
out('have').
has('job','status', 'In Progress')
Note that outE().inV()
combinations like that are essentially just out()
. In fact, if you write them as outE().inV()
Gremlin will go through the trouble of re-writing the traversal to just out()
when strategies are applied. See the explain()
of the following two traversals:
gremlin> g.V().outE().inV().outE().inV().explain()
==>Traversal Explanation
=============================================================================================================================================================
Original Traversal [GraphStep(vertex,[]), VertexStep(OUT,edge), EdgeVertexStep(IN), VertexStep(OUT,edge), EdgeVertexStep(IN)]
ConnectiveStrategy [D] [GraphStep(vertex,[]), VertexStep(OUT,edge), EdgeVertexStep(IN), VertexStep(OUT,edge), EdgeVertexStep(IN)]
MatchPredicateStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,edge), EdgeVertexStep(IN), VertexStep(OUT,edge), EdgeVertexStep(IN)]
FilterRankingStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,edge), EdgeVertexStep(IN), VertexStep(OUT,edge), EdgeVertexStep(IN)]
InlineFilterStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,edge), EdgeVertexStep(IN), VertexStep(OUT,edge), EdgeVertexStep(IN)]
IncidentToAdjacentStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)]
AdjacentToIncidentStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)]
RangeByIsCountStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)]
RepeatUnrollStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)]
PathRetractionStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)]
LazyBarrierStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,vertex), NoOpBarrierStep(2500), VertexStep(OUT,vertex), NoOpBarrierStep(2500)]
TinkerGraphCountStrategy [P] [GraphStep(vertex,[]), VertexStep(OUT,vertex), NoOpBarrierStep(2500), VertexStep(OUT,vertex), NoOpBarrierStep(2500)]
TinkerGraphStepStrategy [P] [TinkerGraphStep(vertex,[]), VertexStep(OUT,vertex), NoOpBarrierStep(2500), VertexStep(OUT,vertex), NoOpBarrierStep(2500)]
ProfileStrategy [F] [TinkerGraphStep(vertex,[]), VertexStep(OUT,vertex), NoOpBarrierStep(2500), VertexStep(OUT,vertex), NoOpBarrierStep(2500)]
StandardVerificationStrategy [V] [TinkerGraphStep(vertex,[]), VertexStep(OUT,vertex), NoOpBarrierStep(2500), VertexStep(OUT,vertex), NoOpBarrierStep(2500)]
Final Traversal [TinkerGraphStep(vertex,[]), VertexStep(OUT,vertex), NoOpBarrierStep(2500), VertexStep(OUT,vertex), NoOpBarrierStep(2500)]
gremlin> g.V().out().out().explain()
==>Traversal Explanation
=============================================================================================================================================================
Original Traversal [GraphStep(vertex,[]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)]
ConnectiveStrategy [D] [GraphStep(vertex,[]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)]
MatchPredicateStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)]
FilterRankingStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)]
InlineFilterStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)]
IncidentToAdjacentStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)]
AdjacentToIncidentStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)]
RangeByIsCountStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)]
RepeatUnrollStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)]
PathRetractionStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,vertex), VertexStep(OUT,vertex)]
LazyBarrierStrategy [O] [GraphStep(vertex,[]), VertexStep(OUT,vertex), NoOpBarrierStep(2500), VertexStep(OUT,vertex), NoOpBarrierStep(2500)]
TinkerGraphCountStrategy [P] [GraphStep(vertex,[]), VertexStep(OUT,vertex), NoOpBarrierStep(2500), VertexStep(OUT,vertex), NoOpBarrierStep(2500)]
TinkerGraphStepStrategy [P] [TinkerGraphStep(vertex,[]), VertexStep(OUT,vertex), NoOpBarrierStep(2500), VertexStep(OUT,vertex), NoOpBarrierStep(2500)]
ProfileStrategy [F] [TinkerGraphStep(vertex,[]), VertexStep(OUT,vertex), NoOpBarrierStep(2500), VertexStep(OUT,vertex), NoOpBarrierStep(2500)]
StandardVerificationStrategy [V] [TinkerGraphStep(vertex,[]), VertexStep(OUT,vertex), NoOpBarrierStep(2500), VertexStep(OUT,vertex), NoOpBarrierStep(2500)]
Final Traversal [TinkerGraphStep(vertex,[]), VertexStep(OUT,vertex), NoOpBarrierStep(2500), VertexStep(OUT,vertex), NoOpBarrierStep(2500)]
See how the final lines are identical? The IncidentToAdjacentStrategy
applies that change, so ultimately both traversals compile to the same thing.
In answer to your original question, if you need to have the client, site and the job then use select()
:
g.V().has('user','id','338d219c-3457-4ad8-8172-37a7d897c0df').
out('manages').
hasLabel('client').as('c').
out('have').
hasLabel('site').as('s').
out('have').
has('job','status', 'In Progress').as('j').
select('c','s','j')
Upvotes: 6