Search code examples
gremlintinkerpopdatastax-enterprise-graph

Simple outer-join like gremlin query not returning any results


I wrote the simple query below to traversal between Person to Country but it’s not returning any results.

g.V().hasLabel("Person").as("p").out("from").hasLabel("Country").as("c").select("p", "c")

In the actual data, only Person vertices exists and no Country vertices or from edges exist. I expected to at least return p - basically I want to do a left outer join. However, if I have Country and from data as well, the query returns results.

I tried another query using match as well but still no results unless there are actual data:

g.V().hasLabel("Person").has("name","bob").match(__.as("p").out("from").hasLabel("Country").as("c")).select("p", "c")

I'm running these queries against Datastax Enterpise Graph.

Any idea why it’s returning no results?


Solution

  • The result you are getting is expected. If there are no "from" edges then the traverser essentially dies and does not proceed any further. Perhaps you could consider using project():

    g.V().hasLabel("Person").
      project('name','country').
        by('name')
        by(out('from').hasLabel('Country').values('name').fold())
    

    With the "modern" toy graph in TinkerPop, the output looks like this:

    gremlin> g.V().hasLabel('person').project('name','knows').by().by(out('knows').values('name').fold())
    ==>[name:v[1],knows:[vadas,josh]]
    ==>[name:v[2],knows:[]]
    ==>[name:v[4],knows:[]]
    ==>[name:v[6],knows:[]]
    

    In the future, when you submit questions about Gremlin, please include a Gremlin script that can be pasted into a Gremlin Console which makes it easier to try to more directly answer your specific question.