7

I've been looking at the Gremlin graph language, and it appears very powerful. However, whilst running through what it can do to evaluate it against requirements, I came across a case that I can't seem to complete.

Assuming Gremlin is started, and using its example database:

gremlin> g = TinkerGraphFactory.createTinkerGraph()
...
gremlin> g.V.out('knows')
==>v[2]
==>v[4]

So this shows vertices that have an edge of 'knows'.

However, I want to find vertices that do not have edges of 'knows'. Something like:

gremlin> g.V.outNot('knows')
==>v[3]
==>v[5]
==>v[6]

How do I find these vertices?

(Edited to make the output correct)

4 Answers4

6

I interpret this question several ways, but perhaps this is what you are after. One way would be to do:

gremlin> g = TinkerGraphFactory.createTinkerGraph()    
==>tinkergraph[vertices:6 edges:6]
gremlin> g.V.outE.hasNot('label','knows')
==>e[9][1-created->3]
==>e[12][6-created->3]
==>e[10][4-created->5]
==>e[11][4-created->3]
gremlin> g.V.outE.hasNot('label','knows').inV
==>v[3]
==>v[3]
==>v[5]
==>v[3]

Note that label and id are both recognized as properties:

gremlin> g.V.has('id',"1")
==>v[1]
gremlin> g.E.map("label","id")
==>{id=10, label=created}
==>{id=7, label=knows}
==>{id=9, label=created}
==>{id=8, label=knows}
==>{id=11, label=created}
==>{id=12, label=created}

Another way to consider this question would be to find a list of vertices that don't have a "knows" edge:

gremlin> g.V.filter{!it.bothE('knows').hasNext()}    
==>v[3]
==>v[6]
==>v[5]
stephen mallette
  • 45,298
  • 5
  • 67
  • 135
  • Thank you, the lesson here is that the "properties" on edges are "labels", so it can be used with hasNot() and so on. But that doesn't quite get back to which vertices have no edges labelled "knows", i.e. an expression that returns vertices 1, 3, 5 and 6... – Jeroen van den Oever Apr 03 '14 at 14:10
  • Yes, basically an edge label is recognized as a property and can thus work properly with has()/hasNot operations. the same can be said of the element id. Included other examples in my answer to demonstrate. – stephen mallette Apr 03 '14 at 14:15
  • 1
    Ok - but that still doesn't address the problem - let me rephrase. The solution you have filters the relationships (edges) that exist. The 'hasNot(...)' returns vertices (or edges) that are not 'knows'. But what I want is the absence of edges, as opposed to filtering existing edges. So I want "notOut()" - does that make sense? – Jeroen van den Oever Apr 03 '14 at 15:01
  • sorry if i'm still not following. Are you saying you want to find vertices that don't have a "knows" edge? If so, see my updated answer. btw, i think your example in your question is off because v[1] has a "knows" edge. – stephen mallette Apr 03 '14 at 15:14
  • You are right - my mistake. Yes, that's now what I'm after, thanks! – Jeroen van den Oever Apr 03 '14 at 16:12
  • The later version of Gremlin does not seem to have `hasNot` function with 2 arguments. Is there another way to check this? – Samuel Konat Nov 21 '19 at 15:19
  • 1
    You can do `outE().not(hasLabel('knows'))` – stephen mallette Nov 21 '19 at 19:18
3

If you are looking for the Groovy syntax (which can be used by AWS Neptune with their notebooks for example). You can build your query like this

g.V().not(outE('filtered_relationship'))
Andries
  • 1,104
  • 9
  • 12
0

i am using gremlin over orientdb and this is working for me; just prefix edge label with 'out_'

g.V.hasNot('out_knows');
DrAhmedJava
  • 731
  • 8
  • 16
0
g.V().
hasLabel('nodel_label').
not(filter(__.in('edge_label')))