我有一个用户名数组(例如['abc','def','ghi'])要添加到图中的“user”标签下。现在,我首先要检查用户名是否已经存在(g.V().hasLabel('user').has('username','def')),然后只将那些用户名属性不匹配的用户添加到“user”标签下。另外,这可以在单个gremlin查询或groovy脚本中完成吗?我正在使用泰坦图形数据库,tinkerpop3和gremlin REST服务器。
['abc','def','ghi']
g.V().hasLabel('user').has('username','def')
knsnq2tg1#
通过“脚本”,你可以将一个多行/命令脚本传递给服务器进行处理,然后用变量、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或create”的一般方法是这样的:
gremlin> g.V().has('person','name','bill').fold(). ......1> coalesce(unfold(), ......2> addV('person').property('name','bill')) ==>v[18]
有关upsert/“get or create”模式的更多信息,请参见此StackOverflow question。
s3fp2yjn2#
您可以使用以下命令直接执行此操作:
g.V().has('user','username','def').fold().coalesce(unfold(),addV('user').property('username','def'))
svmlkihl3#
只是添加到这个答案中。最好使用下面的幂等查询。Coalesce的工作原理类似于if-else语句。有关详细信息,请参阅https://spin.atomicobject.com/2021/08/10/idempotent-queries-in-gremlin/。另外,如果您注意到条目没有被保存,请确保使用.next()提交更改。
.next()
g.V().hasLabel('user').has('username','def') .fold() .coalesce( __.unfold(), __.addV('user').property('username','def') ) .next()
3条答案
按热度按时间knsnq2tg1#
通过“脚本”,你可以将一个多行/命令脚本传递给服务器进行处理,然后用变量、if/then语句等常规编程技术来回答这个问题:
或者也许:
但这些都是groovy脚本,最终TinkerPop建议避免使用脚本和闭包,而使用纯遍历。在一次遍历中处理“get或create”的一般方法是这样的:
有关upsert/“get or create”模式的更多信息,请参见此StackOverflow question。
s3fp2yjn2#
您可以使用以下命令直接执行此操作:
svmlkihl3#
只是添加到这个答案中。最好使用下面的幂等查询。Coalesce的工作原理类似于if-else语句。有关详细信息,请参阅https://spin.atomicobject.com/2021/08/10/idempotent-queries-in-gremlin/。另外,如果您注意到条目没有被保存,请确保使用
.next()
提交更改。