I have an array of usernames (eg. ['abc','def','ghi']
) to be added under 'user' label in the graph.
Now I first want to check if the username already exists (g.V().hasLabel('user').has('username','def')
) and then add only those for which the username property doesn't match under 'user' label.
Also, can this be done in a single gremlin query or groovy script?
I am using titan graph database, tinkerpop3 and gremlin REST server.
With "scripts" you can always pass a multi-line/command script to the server for processing to get what you want done. This question is then answered with normal programming techniques using variables, if/then statements, etc:
or perhaps:
But these are groovy scripts and ultimately TinkerPop recommends avoiding scripts and closures in favor of a pure traversal. The general way to handle a "get or create" in a single traversal is to do something like this:
Also see this StackOverflow question for more information on upsert/"get or create" patterns.
UPDATE: As of TinkerPop 3.6.0, the
fold()/coalesce()/unfold()
pattern has been largely replaced by the new steps ofmergeV()
andmergeE()
which greatly simplify the Gremlin required to do an upsert-like operation. Under 3.6.0 and newer versions, you would write: