nebula rank过滤使用

你好, server作为node节点, 边表示从server1到server2的访问, 5分钟聚合成一条数据写入, 也就是在server1到server2每5分钟会多一条访问数据, 我想问一下这种情况只能通过rank实现吗,如果通过rank实现了, 我想查询一下某个时间范围之内server1到server2的访问, rank可以做时间过滤吗, 麻烦帮忙解答一下, 谢谢

请问你的查询语句是用GO还是LOOKUP?

可以啊, rank值可以设置成插入数据时的timestamp, 查询时可以用go from server1 over like where like._dst == server2 and like._rank > 1

rank 的数据类型是int64的,在应用层可以使用timestemp作为rank的值,在GO查询中就可以通过rank来根据时间范围查询了。
如果是用的LOOKUP语句,同样可以通过pipe模式进行范围过滤,但是这样的话可能性能不好,因为lookup查询会导致返回给graph层一个数据集,然后graph层再进行一遍过滤。也可以在edge中加一个timestamp的属性值,用于时间范围过滤。

我的需求可能比上面要复杂很多, 刚才说server1到server2每5分钟聚合,但是还是要区分类型, 比如说阻断的流量我要聚成一条, 放行的聚成一条,聚成一条的情况下要在这条记录上记录访问次数。
如果只以时间戳作为rank, 因为同一个5分钟会有阻断和放行两个边, 这样就写不进去了;
如果把时间戳和流量类型hash之后作为rank,又没办法根据时间戳进行过滤了。
麻烦帮忙解答一下, 这种问题应该怎么处理, 谢谢

把阻断和放行做成边的一个属性可以吗? 这样的过滤的时候就是where like._rank > 2 and like.zuduan == true

你好, nebula 不是不能存在多条边吗,如果有多条边,需要通过rank做区分。
我之前试过,如果在两个节点之间写入多条边的话, 后写入的会把第一次写入的覆盖,
这种问题您遇到过吗, 还是说我的方向直接错了,请指示, 谢谢

你说的是对的。我意思是你可以把rank用来记录timestamp, 然后给边上加一个属性字段liuliang_type, 用来记录流量类型, 这样liuliang_type+rank不就可以唯一标示一条边了吗?然后过滤的时候用liuliang_type和rank来过滤

您好:您指的是把liuliang_type作为一个边类型,还是边的一个属性? 如果是作为属性的话,应该不可以吧, 因为起点、边类型、权重、终点确定一条边,刚才说的两条边者四个都是一样的,唯一不一样的是liuliang_type的属性值,这样写入的时候会覆盖吧。
如果是把两种边类型,我觉得倒是可以。我不知道我是不是理解您的意思了

哦, 我说错了。 是应该做成两种边类型。 再用上rank, 这样每条边就唯一了。

rank设置为timestemp和0在查询上有效率区别么?

这个要看你做什么查询了。
如果你不用rank字段,那设置成0从使用上来说简单点。这样去遍历的时候,你知道点、边、type、rank(0),查询会更快。否则你得去记住timestamp;