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

6qftjkof  于 2022-11-01  发布在  其他
关注(0)|答案(3)|浏览(119)

我有一个用户名数组(例如['abc','def','ghi'])要添加到图中的“user”标签下。
现在,我首先要检查用户名是否已经存在(g.V().hasLabel('user').has('username','def')),然后只将那些用户名属性不匹配的用户添加到“user”标签下。
另外,这可以在单个gremlin查询或groovy脚本中完成吗?
我正在使用泰坦图形数据库,tinkerpop3和gremlin REST服务器。

knsnq2tg

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

s3fp2yjn

s3fp2yjn2#

您可以使用以下命令直接执行此操作:

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

svmlkihl3#

只是添加到这个答案中。最好使用下面的幂等查询。Coalesce的工作原理类似于if-else语句。有关详细信息,请参阅https://spin.atomicobject.com/2021/08/10/idempotent-queries-in-gremlin/。另外,如果您注意到条目没有被保存,请确保使用.next()提交更改。

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

相关问题