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'))
我有一组用户名(例如 ['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'))