如何在使用gremlin查询删除父节点时删除所有子节点?

时间:2017-07-21 16:17:23

标签: azure-cosmosdb gremlin tinkerpop3

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

假设

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

如果我们想要丢弃'B'顶点,那么它的孩子'D','E','F','G','H'和'I'vertex也应该掉线。你能告诉我怎么放弃。

1 个答案:

答案 0 :(得分:6)

我认为" B"是一个名为" myId":

的索引属性
g.V().has('myId','B').
  union(__(),
        repeat(out()).emit()).
  drop()

使用union()会做两件事,因为在这种情况下它有两个参数。第一个是__()。这只是一个身份功能。它包括" B"删除顶点的结果中的顶点。换句话说,union()接收" B"顶点作为它的输入,除了在union()的结果中包含它之外我们什么都不做。 union的第二个参数采用" B"顶点并递归遍历以查找所有子顶点。在这里使用emit()很重要,因为它告诉repeat返回它沿途找到的所有子顶点(而不仅仅是树的叶子)。

在评论中提到微软的.NET客户端版本的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,您可以从" d"使用cap()的副作用然后将该列表展开回要删除的迭代器。