Gremlin - 只添加一个不存在的顶点

Gremlin - only add a vertex if it doesn't exist

我有一组用户名(例如 ['abc','def','ghi'])要添加到图表中的 'user' 标签下。

现在我首先要检查用户名是否已经存在 (g.V().hasLabel('user').has('username','def')),然后只添加那些用户名 属性 与 'user' 标签下不匹配的用户名。

此外,这可以在单个 gremlin 查询或 groovy 脚本中完成吗?

我正在使用 titan 图形数据库、tinkerpop3 和 gremlin REST 服务器。

使用 "scripts",您可以随时将 multi-line/command 脚本传递给服务器进行处理,以完成您想要完成的工作。然后使用变量、if/then 语句等的正常编程技术回答这个问题:

t = g.V().has('person','name','bill')
t.hasNext() ? t.next() : g.addV('person').property('name','bill').next()

或者也许:

g.V().has('person','name','bill').tryNext().orElseGet{
    g.addV('person').property('name','bill').next()}

但这些是 groovy 脚本,最终 TinkerPop 建议避免使用脚本和闭包以支持纯遍历。在一次遍历中处理 "get or create" 的一般方法是做这样的事情:

gremlin> g.V().has('person','name','bill').fold().
......1>   coalesce(unfold(), 
......2>            addV('person').property('name','bill'))
==>v[18]

有关更新插入/"get or create" 模式的更多信息,另请参阅此

您可以直接使用:

g.V().has('user','username','def').fold().coalesce(unfold(),addV('user').property('username','def'))