gpt4 book ai didi

gremlin - 如何使用 gremlin QL 递归获取所有子顶点及其边(两者的属性)?

转载 作者:行者123 更新时间:2023-12-04 10:01:35 24 4
gpt4 key购买 nike

我发现下面的查询非常适合获取给定单个顶点的所有子顶点和边以及它们的属性

g.V().has("name","gremlin").outE().as('e').inV().as('v').select('e','v').by(valueMap())

但是,我如何递归地执行上述操作,即对于给定的顶点,它将遍历其所有子节点并返回每个(顶点)及其输出边及其所有属性(顶点和边)......即类似上面的东西,但在它找到的每个子顶点的循环中......有没有办法使用gremlin做到这一点?

最佳答案

Gremlin 有一个 repeat()您可以使用的步骤。您可以重复...直到并重复....多次。该文档有很好的例子。
位于此处:https://tinkerpop.apache.org/docs/current/reference/#repeat-step

例如

g.V().has("name","gremlin").
repeat(outE().inV()).times(2).
path().
by(valueMap())

请注意,使用 valueMap 返回所有属性有点像做 SELECT *在 SQL 中,一般来说,如果结果集很大,最好只返回您真正需要的内容。

如果你想找回一棵树而不是一套 path结果你可以使用 tree步。下面是一个使用 TinkerGraph 和一个简单的二叉树图的例子。
graph=TinkerGraph.open()
g=graph.traversal()

g.addV('root').property('data',9).as('root').
addV('node').property('data',5).as('b').
addV('node').property('data',2).as('c').
addV('node').property('data',11).as('d').
addV('node').property('data',15).as('e').
addV('node').property('data',10).as('f').
addV('node').property('data',1).as('g').
addV('node').property('data',8).as('h').
addV('node').property('data',22).as('i').
addV('node').property('data',16).as('j').
addV('node').property('data',7).as('k').
addV('node').property('data',51).as('l').
addV('node').property('data',13).as('m').
addV('node').property('data',4).as('n').
addE('left').from('root').to('b').
addE('left').from('b').to('c').
addE('right').from('root').to('d').
addE('right').from('d').to('e').
addE('right').from('e').to('i').
addE('left').from('i').to('j').
addE('left').from('d').to('f').
addE('right').from('b').to('h').
addE('left').from('h').to('k').
addE('right').from('i').to('l').
addE('left').from('e').to('m').
addE('right').from('c').to('n').
addE('left').from('c').to('g').iterate()

gremlin> g.V().hasLabel('root').repeat(outE().inV()).times(2).tree()

==>[v[0]:[e[28][0-left->2]:[v[2]:[e[35][2-right->14]:[v[14]:[]],e[29][2-left->4]:[v[4]:[]]]],e[30][0-right->6]:[v[6]:[e[3
4][6-left->10]:[v[10]:[]],e[31][6-right->8]:[v[8]:[]]]]]]

gremlin> g.V().hasLabel('root').repeat(outE().inV()).times(2).
tree().by(valueMap())

==>[[data:[9]]:[[]:[[data:[5]]:[[]:[[data:[8]]:[],[data:[2]]:[]]],[data:[11]]:[[]:[[data:[15]]:[],[data:[10]]:[]]]]]]

gremlin> g.V().hasLabel('root').repeat(outE().inV()).times(2).
tree().by(valueMap().with(WithOptions.tokens))

==>[[id:0,label:root,data:[9]]:[[id:28,label:left]:[[id:2,label:node,data:[5]]:[[id:35,label:right]:[[id:14,label:node,da
ta:[8]]:[]],[id:29,label:left]:[[id:4,label:node,data:[2]]:[]]]],[id:30,label:right]:[[id:6,label:node,data:[11]]:[[id:34
,label:left]:[[id:10,label:node,data:[10]]:[]],[id:31,label:right]:[[id:8,label:node,data:[15]]:[]]]]]]

关于gremlin - 如何使用 gremlin QL 递归获取所有子顶点及其边(两者的属性)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61800307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com