我需要在父节点使用gremlin查询删除时删除所有子节点。
假设
A
/ \
B C
/ \
D E
/ \
F G
/ \
H I
如果我们想要丢弃'B'顶点,那么它的孩子'D','E','F','G','H'和'I'vertex也应该掉线。你能告诉我怎么放弃。
答案 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()
的副作用然后将该列表展开回要删除的迭代器。