【问题标题】:How to choose right nodes in janusgraph如何在janusgraph中选择正确的节点
【发布时间】:2021-08-25 23:22:25
【问题描述】:

我需要所有蓝色节点或树中不同节点之间 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)调用,无论中间有多少错误颜色都会显示所有蓝色但没有停止条件,这是关键。

【问题讨论】:

  • 地球上可能有几个人可以在几分钟内用 gremlin 编写您的请求。我宁愿建议您以 .path().by(__.valueMap('uuid', 'color')) gremlin 步骤结束查询。返回的列表很容易在常规 java 中过滤以获得所需的结果。
  • 非常感谢@HadoopMarc,我会尝试你的建议,但我已经有办法在 java 中管理这种情况,我正在尝试使用提供的工具找到最好的直接方法小鬼。谢谢!
  • 我找到了原因,只是不知道如何解决。问题出在.repeat(in().choose(values('color').is('blue'), identity(), in()))这部分,它不仅发出蓝色,而且也发出少量黑色,所以当时间达到最大级别时,有一些级别不是蓝色并且计数,然后当地图到达时,没有蓝色出来但并非所有级别都用蓝色填充。

标签: java gremlin graph-databases janusgraph


【解决方案1】:

问题在于,当您遇到黑色节点时,如第二张图中,您执行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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多