在gremlin查询中显示子级别

问题描述 投票:0回答:1

我具有如下图所示的图形。数字表示作为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是起始根节点。

我知道它太复杂了。如果不可能,我们至少可以使用多个麻袋变量获得子深度和深度。以下是示例:

depth:0次深度:0深度:1次深度:1.1深度:1次深度:1.2深度:2次深度:2.1深度:2次深度:2.2深度:2次深度:2.3深度:2次深度:2.4enter image description here

graph gremlin tinkerpop janusgraph tinkerpop3
1个回答
0
投票

一种简单的方法就是利用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()    

我们可以如下组合loopsindex(我添加了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]]

鉴于您对可接受的更简单形式的评论,我认为以上内容已经接近。您应该能够调整此查询以对所需的输出格式进行任何更改。

© www.soinside.com 2019 - 2024. All rights reserved.