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 - 仅在不存在时添加顶点的主要内容,如果未能解决你的问题,请参考以下文章