Determine if node is Leaf node or not in Gremlin

47 views Asked by At

I am looking for a ways to find out the all the nodes coming out of a root node are either leaf node or intermediate node.

I have added the a sample graph.

g.addV('company').property(id,'TESTNX01').property('name','Alphabet').next()
g.addV('company').property(id,'TESTNX02').property('name','Google').next()
g.addV('company').property(id,'TESTNX03').property('name','Youtube').next()
g.addV('company').property(id,'TESTNX05').property('name','YoutubeKids').next()
g.addV('person').property(id,'TESTNX01_1900-01-01_1_1').property('bu_id', 'TESTNX01_1900-01-01_1_1').property('name', 'W Karl David Laxton').next()
g.addV('person').property(id,'TESTNX02_1900-01-01_1_1').property('bu_id', 'TESTNX02_1900-01-01_1_1').property('name', 'Steven H Strong').next()
g.addV('person').property(id,'TESTNX02_1900-01-01_1_2').property('bu_id', 'TESTNX02_1900-01-01_1_2').property('name', 'Adrian Matthew Paul Rowe').next()
g.addV('person').property(id,'TESTNX02_1900-01-01_1_3').property('bu_id', 'TESTNX02_1900-01-01_1_3').property('name', 'Steven Henry Strong').next()
g.addV('person').property(id,'TESTNX02_1900-01-01_1_4').property('bu_id', 'TESTNX02_1900-01-01_1_4').property('name', 'Dom Robinson').next()
g.addV('person').property(id,'TESTNX03_1900-01-01_1_3').property('bu_id', 'TESTNX03_1900-01-01_1_3').property('name', 'Dominic Nesbitt Robinson').next()
g.addV('person').property(id,'TESTNX03_1900-01-01_1_4').property('bu_id', 'TESTNX03_1900-01-01_1_4').property('name', 'Adrian Matthew Paul Rowe').next()
g.addV('person').property(id,'TESTNX03_1900-01-01_1_5').property('bu_id', 'TESTNX03_1900-01-01_1_5').property('name', 'William Laxton').next()
g.addV('person').property(id,'TESTNX03_1900-01-01_1_6').property('bu_id', 'TESTNX03_1900-01-01_1_6').property('name', 'Will Laxton').next()


g.addE('HAS_SHRHLDING_PC_TO').from(__.V('TESTNX01')).to(__.V('TESTNX01_1900-01-01_1_1')).property(id,'TESTNX01_HAS_SHRHLDING_PC_TO_TESTNX01_1900-01-01_1_1').property('perc_value', 25).next()
g.addE('HAS_VOTING_PC_TO').from(__.V('TESTNX01')).to(__.V('TESTNX01_1900-01-01_1_1')).property(id,'TESTNX01_HAS_VOTING_PC_TO_TESTNX01_1900-01-01_1_1').property('perc_value', 50).next()
g.addE('HAS_SHRHLDING_PC_TO').from(__.V('TESTNX01')).to(__.V('TESTNX02')).property(id,'TESTNX01_HAS_SHRHLDING_PC_TO_TESTNX02').property('perc_value', 75).next()
g.addE('HAS_VOTING_PC_TO').from(__.V('TESTNX01')).to(__.V('TESTNX02')).property(id,'TESTNX01_HAS_VOTING_PC_TO_TESTNX02').property('perc_value', 50).next()
g.addE('HAS_SHRHLDING_PC_TO').from(__.V('TESTNX02')).to(__.V('TESTNX02_1900-01-01_1_1')).property(id,'TESTNX02_HAS_SHRHLDING_PC_TO_TESTNX02_1900-01-01_1_1').property('perc_value', 25).next()
g.addE('HAS_VOTING_PC_TO').from(__.V('TESTNX02')).to(__.V('TESTNX02_1900-01-01_1_1')).property(id,'TESTNX02_HAS_VOTING_PC_TO_TESTNX02_1900-01-01_1_1').property('perc_value', 25).next()
g.addE('HAS_SHRHLDING_PC_TO').from(__.V('TESTNX02')).to(__.V('TESTNX02_1900-01-01_1_2')).property(id,'TESTNX02_HAS_SHRHLDING_PC_TO_TESTNX02_1900-01-01_1_2').property('perc_value', 25).next()
g.addE('HAS_VOTING_PC_TO').from(__.V('TESTNX02')).to(__.V('TESTNX02_1900-01-01_1_2')).property(id,'TESTNX02_HAS_VOTING_PC_TO_TESTNX02_1900-01-01_1_2').property('perc_value', 25).next()
g.addE('HAS_SHRHLDING_PC_TO').from(__.V('TESTNX02')).to(__.V('TESTNX02_1900-01-01_1_3')).property(id,'TESTNX02_HAS_SHRHLDING_PC_TO_TESTNX02_1900-01-01_1_3').property('perc_value', 10).next()
g.addE('HAS_VOTING_PC_TO').from(__.V('TESTNX02')).to(__.V('TESTNX02_1900-01-01_1_3')).property(id,'TESTNX02_HAS_VOTING_PC_TO_TESTNX02_1900-01-01_1_3').property('perc_value', 5).next()
g.addE('HAS_SHRHLDING_PC_TO').from(__.V('TESTNX02')).to(__.V('TESTNX02_1900-01-01_1_4')).property(id,'TESTNX02_HAS_SHRHLDING_PC_TO_TESTNX02_1900-01-01_1_4').property('perc_value', 10).next()
g.addE('HAS_VOTING_PC_TO').from(__.V('TESTNX02')).to(__.V('TESTNX02_1900-01-01_1_4')).property(id,'TESTNX02_HAS_VOTING_PC_TO_TESTNX02_1900-01-01_1_4').property('perc_value', 5).next()
g.addE('HAS_SHRHLDING_PC_TO').from(__.V('TESTNX02')).to(__.V('TESTNX03')).property(id,'TESTNX02_HAS_SHRHLDING_PC_TO_TESTNX03').property('perc_value', 30).next()
g.addE('HAS_VOTING_PC_TO').from(__.V('TESTNX02')).to(__.V('TESTNX03')).property(id,'TESTNX02_HAS_VOTING_PC_TO_TESTNX03').property('perc_value', 50).next()
g.addE('HAS_SHRHLDING_PC_TO').from(__.V('TESTNX03')).to(__.V('TESTNX03_1900-01-01_1_3')).property(id,'TESTNX03_HAS_SHRHLDING_PC_TO_TESTNX03_1900-01-01_1_3').property('perc_value', 20).next()
g.addE('HAS_VOTING_PC_TO').from(__.V('TESTNX03')).to(__.V('TESTNX03_1900-01-01_1_3')).property(id,'TESTNX03_HAS_VOTING_PC_TO_TESTNX03_1900-01-01_1_3').property('perc_value', 15).next()
g.addE('HAS_SHRHLDING_PC_TO').from(__.V('TESTNX03')).to(__.V('TESTNX03_1900-01-01_1_4')).property(id,'TESTNX03_HAS_SHRHLDING_PC_TO_TESTNX03_1900-01-01_1_4').property('perc_value', 20).next()
g.addE('HAS_VOTING_PC_TO').from(__.V('TESTNX03')).to(__.V('TESTNX03_1900-01-01_1_4')).property(id,'TESTNX03_HAS_VOTING_PC_TO_TESTNX03_1900-01-01_1_4').property('perc_value', 25).next()
g.addE('HAS_SHRHLDING_PC_TO').from(__.V('TESTNX03')).to(__.V('TESTNX03_1900-01-01_1_5')).property(id,'TESTNX03_HAS_SHRHLDING_PC_TO_TESTNX03_1900-01-01_1_5').property('perc_value', 10).next()
g.addE('HAS_VOTING_PC_TO').from(__.V('TESTNX03')).to(__.V('TESTNX03_1900-01-01_1_5')).property(id,'TESTNX03_HAS_VOTING_PC_TO_TESTNX03_1900-01-01_1_5').property('perc_value', 5).next()
g.addE('HAS_SHRHLDING_PC_TO').from(__.V('TESTNX03')).to(__.V('TESTNX03_1900-01-01_1_6')).property(id,'TESTNX03_HAS_SHRHLDING_PC_TO_TESTNX03_1900-01-01_1_6').property('perc_value', 20).next()
g.addE('HAS_VOTING_PC_TO').from(__.V('TESTNX03')).to(__.V('TESTNX03_1900-01-01_1_6')).property(id,'TESTNX03_HAS_VOTING_PC_TO_TESTNX03_1900-01-01_1_6').property('perc_value', 10).next()
g.addE('HAS_SHRHLDING_PC_TO').from(__.V('TESTNX03')).to(__.V('TESTNX05')).property(id,'TESTNX03_HAS_SHRHLDING_PC_TO_TESTNX05').property('perc_value', 20).next()
g.addE('HAS_VOTING_PC_TO').from(__.V('TESTNX03')).to(__.V('TESTNX05')).property(id,'TESTNX03_HAS_VOTING_PC_TO_TESTNX05').property('perc_value', 20).next()

I am trying to get the all possible nodes of the root node and see if they are leaf or not. The 'leaf' nodes are assigned value Y, while the intermediate nodes get N.

Sample output:

{'root_company' : 'TESTNX01', 'Shareholder': 'TESTNX03', 'leaf': 'N'}
{'root_company' : 'TESTNX01', 'Shareholder': 'TESTNX02_1900-01-01_1_1', 'leaf': 'Y'}
.
.
.
{'root_company' : 'TESTNX01', 'Shareholder': 'TESTNX05', 'leaf': 'Y'}

Any leads would be deeply appreciated. Thank you.

1

There are 1 answers

5
stephen mallette On

You just need to test for edges on each vertex and return "Y" or "N". Most simply this can be done with choose():

gremlin> g.V('TESTNX01').out().choose(outE(),constant('N'),constant('Y'))
==>N
==>Y
==>Y
==>N

More specific to your request for traversing the entire tree, you might do something like:

gremlin> g.V('TESTNX01').repeat(out()).emit().dedup().project('v','leaf').by(valueMap()).by(choose(outE(),constant('N'),constant('Y')))
==>[v:[name:[Google]],leaf:N]
==>[v:[name:[W Karl David Laxton],bu_id:[TESTNX01_1900-01-01_1_1]],leaf:Y]
==>[v:[name:[Dom Robinson],bu_id:[TESTNX02_1900-01-01_1_4]],leaf:Y]
==>[v:[name:[Steven Henry Strong],bu_id:[TESTNX02_1900-01-01_1_3]],leaf:Y]
==>[v:[name:[Adrian Matthew Paul Rowe],bu_id:[TESTNX02_1900-01-01_1_2]],leaf:Y]
==>[v:[name:[Steven H Strong],bu_id:[TESTNX02_1900-01-01_1_1]],leaf:Y]
==>[v:[name:[Youtube]],leaf:N]
==>[v:[name:[Adrian Matthew Paul Rowe],bu_id:[TESTNX03_1900-01-01_1_4]],leaf:Y]
==>[v:[name:[William Laxton],bu_id:[TESTNX03_1900-01-01_1_5]],leaf:Y]
==>[v:[name:[Dominic Nesbitt Robinson],bu_id:[TESTNX03_1900-01-01_1_3]],leaf:Y]
==>[v:[name:[YoutubeKids]],leaf:Y]
==>[v:[name:[Will Laxton],bu_id:[TESTNX03_1900-01-01_1_6]],leaf:Y]