如何在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
相关文章