Gremlin - 仅在不存在时添加顶点

Posted

技术标签:

【中文标题】Gremlin - 仅在不存在时添加顶点【英文标题】:Gremlin - only add a vertex if it doesn't exist 【发布时间】:2018-02-12 02:59:32 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

使用“脚本”,您始终可以将多行/命令脚本传递给服务器进行处理,以获得您想要完成的任务。然后使用变量、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 建议避免使用脚本和闭包,以支持纯粹的遍历。在单次遍历中处理“获取或创建”的一般方法是执行以下操作:

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

另请参阅*** question,了解有关 upsert/“获取或创建”模式的更多信息。

【讨论】:

我正在从我的 nodejs 服务器对 gremlin 进行 REST 调用。那么如果我必须添加 200 个用户,那么我应该调用上述命令 200 次吗?如果我在少数情况下遇到异常或错误,如何处理它,然后我应该回滚吗?请让我知道这种情况下的正确方法。 如果您致力于 REST 并使用脚本,那么只需将我的最后一条语句转换为处理一批 200 个用户的脚本。 users.each g.V().has(..... 其中 users 是一个包含 200 个用户列表的参数。使用 REST 和批处理方法,要么整个批处理成功,要么全部失败。如果您想要其他内容,请修改脚本以在循环中包含 try/catch 以采用不同的方式进行。有了脚本,你基本上就可以做任何你需要的事情了。【参考方案2】:

您可以直接使用:

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

【讨论】:

以上是关于Gremlin - 仅在不存在时添加顶点的主要内容,如果未能解决你的问题,请参考以下文章

仅在不存在时将脚本添加到头部

Gremlin-顶点不与合并结合使用

Powershell 仅在不存在时添加到数组

仅在不存在时添加到域列表

如果 gremlin 中存在边,则获取布尔值

Mongodb如何仅在不存在时插入(如果存在则不更新)?