使用gremlin查询删除父节点时,如何删除所有子节点? [英] How to delete all child nodes when parent node deleted using the gremlin query?

查看:61
本文介绍了使用gremlin查询删除父节点时,如何删除所有子节点?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要求在使用gremlin查询删除父节点时删除所有子节点。

假设

                               A
                             /   
                            B     C
                           /       
                          D    E 
                        /   
                       F     G
                            /  
                           H    I

如果我们要删除"B"顶点,那么它的子"D"、"E"、"F"、"G"、"H"和"amp;I"顶点也应该删除。请告诉我如何删除。

推荐答案

我假设"B"是名为"myid"的索引属性:

g.V().has('myId','B').
  union(__(),
        repeat(out()).emit()).
  drop()

使用union()做两件事,因为在本例中它有两个参数。第一个是__()。这只是一个身份函数。它在删除顶点的结果中包含"B"顶点。换句话说,union()接收"B"顶点作为其输入,我们除了将其包含在union()的结果中外,不对其执行任何操作。union的第二个参数获取"B"顶点,并递归遍历以查找所有子顶点。这里使用emit()很重要,因为它告诉重复返回沿途找到的所有子顶点(而不仅仅是树的叶子)。

在评论中提到,__()在其.NET客户端中不受Microsoft版本的Gremlin支持。希望他们正在努力做到这一点。我想你可以用这个丑陋的东西来解决这个问题(或者我想是类似的东西):

g.V().has('myId','B').
  union(fold().unfold(),
        repeat(out()).emit()).
  drop()

另一种方法可能是使用store()

g.V().has('myId','B').
  store('d').
  repeat(out().store('d')).
  cap('d').
  unfold().
  drop()

store方法不如前面的方法好,因为它必须在内存中构建一个List,您可以使用cap()从"d"副作用中提取该List,然后将该列表展开回要删除的迭代器。

这篇关于使用gremlin查询删除父节点时,如何删除所有子节点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆