Friday, 15 May 2026

Outgoing Vertex Traversal (outV()): Moving from an Edge to Its Source Vertex

  

So far, traversal steps have moved in two broad directions:

 

·      Vertex: Edge using outE(), inE(), and bothE()

·      Edge: Vertex using inV(), outV(), and bothV()

 

This chapter focuses on outV(), a step that is used only when the traversal is currently positioned on edges. Understanding outV() requires a clear grasp of what an out-vertex is.

 

What Is an Outgoing Vertex?

For a directed edge:

a  --->  b

 

·      a is the out-vertex

·      b is the in-vertex

 

The edge originates from a and points to b. The outV() step always returns the vertex from which the edge starts.

 

Relationship to Other Steps

Step

Meaning

outE()

Vertex → outgoing edges    

inE()

Vertex → incoming edges    

bothE()

Vertex → all incident edges

outV()

Edge → source vertex       

inV()

Edge → target vertex       

bothV()

Edge → both endpoints      

 

Example: An E-Commerce Graph

To make the discussion concrete, consider an e-commerce domain modeled as a property graph. The graph contains:

 

Vertex Types

·      city: Bengaluru, Hyderabad, Chennai, Pune

·      category: Electronics, Books, Clothing

·      product: Laptop, Smartphone, Java Programming Book, T-Shirt

·      customer: Amit Sharma, Priya Iyer, Rohit Verma

·      order: O9001 to O9005

 

Edge Types

·      belongsTo: product → category

·      placed: customer → order

·      contains: order → product

·      deliveredTo: order → city

 

Each edge has a clear semantic direction that aligns with real-world meaning.

 

Gremlin Statements to build the Graph

graph = TinkerGraph.open()
g = graph.traversal()

blr = g.addV('city').property('name', 'Bengaluru').next()
hyd = g.addV('city').property('name', 'Hyderabad').next()
chn = g.addV('city').property('name', 'Chennai').next()
pne = g.addV('city').property('name', 'Pune').next()

catElectronics = g.addV('category').property('name', 'Electronics').next()
catBooks       = g.addV('category').property('name', 'Books').next()
catClothing    = g.addV('category').property('name', 'Clothing').next()

p1 = g.addV('product').property('sku', 'P1001').property('name', 'Laptop').next()
p2 = g.addV('product').property('sku', 'P1002').property('name', 'Smartphone').next()
p3 = g.addV('product').property('sku', 'P2001').property('name', 'Java Programming Book').next()
p4 = g.addV('product').property('sku', 'P3001').property('name', 'T-Shirt').next()

g.V(p1).addE('belongsTo').to(catElectronics).next()
g.V(p2).addE('belongsTo').to(catElectronics).next()
g.V(p3).addE('belongsTo').to(catBooks).next()
g.V(p4).addE('belongsTo').to(catClothing).next()


c1 = g.addV('customer').property('customerId', 'C101').property('name', 'Amit Sharma').next()
c2 = g.addV('customer').property('customerId', 'C102').property('name', 'Priya Iyer').next()
c3 = g.addV('customer').property('customerId', 'C103').property('name', 'Rohit Verma').next()

o1 = g.addV('order').property('orderId', 'O9001').next()
o2 = g.addV('order').property('orderId', 'O9002').next()
o3 = g.addV('order').property('orderId', 'O9003').next()
o4 = g.addV('order').property('orderId', 'O9004').next()
o5 = g.addV('order').property('orderId', 'O9005').next()

g.V(c1).addE('placed').to(o1).next()
g.V(c1).addE('placed').to(o2).next()

g.V(c2).addE('placed').to(o3).next()

g.V(c3).addE('placed').to(o4).next()
g.V(c3).addE('placed').to(o5).next()


g.V(o1).addE('contains').to(p1).next()
g.V(o1).addE('contains').to(p3).next()

g.V(o2).addE('contains').to(p2).next()

g.V(o3).addE('contains').to(p4).next()

g.V(o4).addE('contains').to(p1).next()
g.V(o4).addE('contains').to(p4).next()

g.V(o5).addE('contains').to(p3).next()


g.V(o1).addE('deliveredTo').to(blr).next()
g.V(o2).addE('deliveredTo').to(blr).next()

g.V(o3).addE('deliveredTo').to(hyd).next()

g.V(o4).addE('deliveredTo').to(chn).next()

g.V(o5).addE('deliveredTo').to(pne).next()

From the established domain model:

 

·      order ──contains──▶ product

·      customer ──placed──▶ order

·      order ──deliveredTo──▶ city

·      product ──belongsTo──▶ category

 

This implies:

·      Products have incoming contains edges

·      Orders have incoming placed edges

·      Cities have incoming deliveredTo edges

·      Categories have incoming belongsTo edges

 

Example 1: Who Placed an Order?

To identify the customer who placed order O9003.

g.V().
  has('order', 'orderId', 'O9003').
  inE('placed').
  outV().
  valueMap(true)

   

inE('placed').outV() can be replaced using in('placed') step as well.

 

in('placed')  = inE('placed').outV()

 

g.V().
  has('order', 'orderId', 'O9003').
  in('placed').
  valueMap(true)

gremlin> g.V().
......1>   has('order', 'orderId', 'O9003').
......2>   inE('placed').
......3>   outV().
......4>   valueMap(true)
==>[id:33,label:customer,customerId:[C102],name:[Priya Iyer]]
gremlin> 
gremlin> g.V().
......1>   has('order', 'orderId', 'O9003').
......2>   in('placed').
......3>   valueMap(true)
==>[id:33,label:customer,customerId:[C102],name:[Priya Iyer]]

Example 2: Orders That Reference a Product (Source Perspective)

To find which orders include the product Laptop.

g.V().
  has('product', 'name', 'Laptop').
  inE('contains').
  outV().
  valueMap(true)

gremlin> g.V().
......1>   has('product', 'name', 'Laptop').
......2>   inE('contains').
......3>   outV().
......4>   valueMap(true)
==>[id:39,label:order,orderId:[O9001]]
==>[id:45,label:order,orderId:[O9004]]

   

outV() vs inV()

Question

Step

Who initiated this relationship?

outV()

Who received this relationship? 

inV()

 

In summary,

 

·      outV() moves from an edge to its source vertex

·      It returns the out-vertex of the edge

·      Can only be used when traversing edges

·      Naturally pairs with inE() and outE()

·      Essential for understanding causality and ownership in graphs

 

Mastering outV() completes one half of the edge-to-vertex traversal model, enabling precise, readable Gremlin queries that reason explicitly about where relationships originate.


 

  

Previous                                                    Next                                                    Home

No comments:

Post a Comment