如何在janusgraph中选择正确的节点

2022-05-12 00:00:00 gremlin java graph-databases janusgraph

我需要所有蓝色节点或id匹配的节点在树中的不同节点之间,基于最大级别。我有此代码

 GraphTraversal<Vertex, Map<String, List>> values = graphDbConnection.getGraphTraversalSource().V()
                .hasLabel('uuid').has('uuid', uuid).emit()
                .repeat(in().choose(values('color').is('blue'), identity(), in()))
                .times(levels)
                .map(or(has('color', 'blue'),
                        has('uuid', uuid)))
                .valueMap('uuid', 'color');

如果一个蓝色节点和另一个蓝色节点之间的错误节点超过3个或4个,则算法将忽略最后一个可能的节点。

例如,使用该代码,如果我请求uuid=1中四级以上的所有蓝调包括一级,它将返回1,2,3,而不会返回4,因为3和4之间是3黑色。

但对于本例,它将返回1,2,3,4,因为3和4之间只有一个或两个错误的节点

注意:这里有一个细节,如果我移除times(levels)调用,无论中间有多少错误的颜色,都会显示所有蓝色,但没有停止条件,这是关键。


解决方案

问题是,当您遇到黑色节点时,如第二张图所示,您将执行in,但在每次重复开始时,您将执行另一个in。因此,如果蓝色节点之后的节点是黑色的,它现在也将被发射。解决此问题的一种可能方法是沿emit(has('color','blue'))的线条更改emit,以便只保留蓝色的节点。

这里有一个简单的例子,希望能清楚地显示emit的这种用法。

g.addV('blue').as('b1').
  addV('red').as('r1').
  addV('blue').as('b2').
  addV('red').as('r2').
  addV('blue').as('b3').
  addE('link').from('b1').to('r1').
  addE('link').from('r1').to('b2').
  addE('link').from('b2').to('r2').
  addE('link').from('r2').to('b3')     

使用这种方法最有可能简化您的查询。

gremlin> g.V()
==>v[42762]
==>v[42763]
==>v[42764]
==>v[42765]
==>v[42766]

gremlin> g.V(42762).emit(hasLabel('blue')).repeat(out()).times(4).label()
==>blue
==>blue
==>blue

gremlin> g.V(42762).emit().repeat(out()).times(4).label()
==>blue
==>red
==>blue
==>red
==>blue

最后是添加了choose步骤的相同示例。

gremlin> g.V(42762).emit(hasLabel('blue')).repeat(out().choose(hasLabel('blue'),identity(),out())).times(2).label()
==>blue
==>blue
==>blue 

相关文章