【问题标题】:How to delete all child nodes when parent node deleted using the gremlin query?使用 gremlin 查询删除父节点时如何删除所有子节点?
【发布时间】:2017-07-21 16:17:23
【问题描述】:

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

假设

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

如果我们想删除 'B' 顶点,那么它的子节点 'D','E','F','G','H' &'I'vertex 也应该被删除。你能告诉我怎么放下吗?

【问题讨论】:

    标签: azure-cosmosdb gremlin tinkerpop3


    【解决方案1】:

    我假设“B”是一个名为“myId”的索引属性:

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

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

    在 cmets 中提到 __() 在其 .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,然后将该列表展开回要删除的迭代器。

    【讨论】:

    • 嗨,斯蒂芬,谢谢你的重播,我是小精灵的新手,联合方法中的__是什么意思,我有一个例外“当前上下文中不存在名称‘__’ “。你能告诉我吗
    • 感谢您的描述,我试过像 "g.V().has('id','thomas1').union(g.V('thomas1'),repeat(out()).emit ().drop()" 因为我通过 .net 在联合内部通过异常使用身份函数。所以我已经尝试过像上面那样但它只删除了 thomas1 边缘而不是 thomas1 子项。
    • __() 太糟糕了。我有点惊讶不支持。这是最容易实现的步骤,虽然它本质上只是一个传递函数,但您可以看到它的用途。无论如何,更新了我的答案...希望这两种附加方法中的一种对您有用。
    • 我真的很感谢你,你的回应方式非常感谢斯蒂芬。我确实尝试了您更新后的查询。
    • 我刚遇到这个并试了一下,结果出现了这个错误:删除了 id 为 12345 的顶点。
    猜你喜欢
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2021-04-30
    • 2021-05-10
    相关资源
    最近更新 更多