graph - 在 gremlin 查询中显示子级别
问题描述
我有如下图所示的图表。这些数字表示节点的级别格式,它需要作为 gremlin 查询的输出以及节点的属性。图形结构可以更改,即可以将更多节点添加到图形中。对于其他节点,必须以类似的格式返回级别。例如,1.1.1 的子级应返回级别为 1.1.1.1,1.1.1.2 ... 以下查询但级别为连续格式 1,2,3 ...
g.withSack(0).
V().
hasLabel('A').
has('label_A','A').
emit().
repeat(sack(sum).by(constant(1)).out()).
project('depth', 'properties').
by(sack()).
by(valueMap())
A 是起始根节点。
我知道它太复杂了。如果不可能,我们至少可以使用多个 sack 变量获得子深度和深度。以下是示例:
深度:0 子深度:0 深度:1 子深度:1.1 深度:1 子深度:1.2 深度:2 子深度:2.1 深度:2 子深度:2.2 深度:2 子深度:2.3 深度: 2子深度:2.4
解决方案
做你正在寻找的一个简单的方法是利用这个index
步骤。如果我们创建一个简单的二叉树如下:
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').
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('c').to('g').iterate()
我们可以结合loops
和index
如下(我添加了unfold
以提高可读性):
gremlin> g.V().hasLabel('root').
......1> emit().
......2> repeat(group('x').by(loops()).by(values('data').fold().index()).out()).
......3> cap('x').unfold()
==>0=[[9, 0]]
==>1=[[5, 0], [11, 1]]
==>2=[[2, 0], [8, 1], [10, 2], [15, 3]]
==>3=[[1, 0], [22, 1]]
==>4=[[16, 0]]
鉴于您对可以接受的更简单形式的评论,我认为上述内容非常接近。您应该能够调整此查询以对所需的输出格式进行任何更改。
您可以更进一步,使用父顶点进行分组,如下所示。由此,您可以构建所需的最终结果的任何预测。
gremlin> g.V().hasLabel('root').
......1> repeat(outE().group('x').
......2> by(loops()).
......3> by(group().
......4> by(outV()).
......5> by(inV().values('data').fold().index())).
......6> inV()).
......7> times(4).
......8> cap('x').
......9> unfold()
==>0={v[0]=[[5, 0], [11, 1]]}
==>1={v[2]=[[2, 0], [8, 1]], v[6]=[[10, 0], [15, 1]]}
==>2={v[4]=[[1, 0]], v[8]=[[22, 0]]}
==>3={v[16]=[[16, 0]]}
推荐阅读
- python - 在 Raspberry Pi 上使用超声波测距模块控制继电器模块
- oauth-2.0 - 为什么不能在后端使用 jwt id 令牌进行身份验证?
- android - 观察本地对象更改的 LiveData 属性
- python - 如何计算第二大值并在 Pandas Python 中为其添加另一列
- azure - 为什么 Cassandra 迁移到 Cosmos 后数据量会增加?
- javascript - 使用正则表达式提取单词,除非它是给定的单词
- css - 使用 CSS 创建带有文本的圆圈、箭头和线条
- django - 用户登录不适用于 django 的默认用户身份验证
- javascript - 我是否以低效的方式使用 setTimeout?
- java - 如何测试引发异常的私有构造函数