【问题标题】:Gremlin Drop Multiple VerticesGremlin 删除多个顶点
【发布时间】:2019-01-03 23:45:31
【问题描述】:

我正在尝试删除给定 Gremlin 查询返回的所有顶点。目标是删除作为特定顶点的子节点的所有子顶点。

这是一个例子:

gremlin> g.V('dcb26be6-8d39-ae81-6ef2-6f60d06bce10').emit().repeat(out())
==>v[dcb26be6-8d39-ae81-6ef2-6f60d06bce10]
==>v[16b26be6-8d37-e882-38c6-a56f39ee4259]
==>v[9cb26be6-8d3c-d61e-4ab4-6c6993e8be7a]
==>v[82b26be6-8d3a-c01a-3771-085c94d1780a]
==>v[00b26be6-8d3c-68d9-6871-702a1247a692]
==>v[d4b26be6-8d38-81ea-b75d-25bbf563f81e]
==>v[cab26be6-8d39-3611-76fa-f369eab9d50e]

此查询返回所有具有向外边连接到父dcb26be6-8d39-ae81-6ef2-6f60d06bce10 顶点的顶点。有没有一种简单的方法可以删除此查询返回的所有顶点?

谢谢

编辑:

@stephan 得到了很好的回应,但是如果孩子们的边缘指向彼此,gremlin 会生我的气。看看这个:

gremlin>  g.V('2ab26c9e-1bbb-73f6-4ee8-6cecc7e21ee1').emit().repeat(out()).fold().unfold()
==>v[2ab26c9e-1bbb-73f6-4ee8-6cecc7e21ee1]
==>v[0eb26c9e-1bbc-12f3-e074-d7328ee4984e]
**==>v[92b26c9e-1bbd-b59f-0b5f-d4c985b176b6]**
==>v[18b26c9e-1bbf-a96c-90d3-e50e61fe7267]
==>v[12b26c9e-1bc1-40ee-292d-2bc7b08dcb9e]
==>v[ccb26c9e-1bbc-a82a-532f-7fbdea87deb1]
==>v[42b26c9e-1bbd-5f1f-f3ad-6f6670ab16ee]
==>v[7ab26c9e-1bc1-e773-6995-18159d610b77]
==>v[3ab26c9e-1bbe-add8-2ab2-948d7c9c0021]
**==>v[2eb26c9e-1bbf-1657-e212-98d1dfff33cd]**
**==>v[92b26c9e-1bbd-b59f-0b5f-d4c985b176b6]**
==>v[8cb26c9e-1bc2-500b-ae27-370a0cc4d392]
==>v[42b26c9e-1bc0-b4b0-4d54-fc7f20ca71d4]
==>v[7ab26c9e-1bc1-e773-6995-18159d610b77]
==>v[3ab26c9e-1bbe-add8-2ab2-948d7c9c0021]
**==>v[2eb26c9e-1bbf-1657-e212-98d1dfff33cd]**

正如您所见,顶点 92b26c9e-1bbd-b59f-0b5f-d4c985b176b6 作为对该查询的响应出现了两次。所以当我尝试做g.V('2ab26c9e-1bbb-73f6-4ee8-6cecc7e21ee1'). emit(). repeat(out()). fold(). unfold()

这是我得到的回复

gremlin>  g.V('2ab26c9e-1bbb-73f6-4ee8-6cecc7e21ee1'). emit(). repeat(out()). fold(). unfold().drop()
{"requestId":"2def0086-d71f-42e4-9c5f-c692d07cc96a","detailedMessage":"The 
vertex does not exist 92b26c9e-1bbd-b59f-0b5f- 
d4c985b176b6","code":"ConstraintViolationException"}

有没有办法从初始查询中删除重复项?

【问题讨论】:

    标签: graph-databases gremlin amazon-neptune


    【解决方案1】:

    也许这只是一天结束,我的大脑被炸了,但是怎么样:

    g.V('dcb26be6-8d39-ae81-6ef2-6f60d06bce10').
      store('a').
      repeat(out().store('a')).
      cap('a').
      unfold().
      drop()
    

    或者 imo 的可读性可能稍差:

    g.V('dcb26be6-8d39-ae81-6ef2-6f60d06bce10').
      emit().
      repeat(out()).
      fold().
      unfold().
      drop()
    

    您可能会得到更好的答案 - 甚至可能来自我 :)

    【讨论】:

    • @stephan 请查看我的最新编辑,您遇到过这种情况吗?
    • 当然,只需在unfold() 之后和drop() 之前添加dedup() 即可删除重复项
    【解决方案2】:

    您需要一个屏障步骤,foldcap 都是 - 但是两者都会产生副作用(它们会消耗内存/处理能力)。 barrier 步骤似乎更适合此:

    g.V('dcb26be6-8d39-ae81-6ef2-6f60d06bce10')
      .emit()
      .repeat(out())
      .barrier()
      .drop()
    

    【讨论】:

      猜你喜欢
      • 2016-12-30
      • 2015-07-06
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 2019-02-14
      相关资源
      最近更新 更多