我无法获取已经遍历的顶点数据的数据。谁能帮我?

时间:2019-06-13 13:47:47

标签: node.js gremlin janusgraph

我在两个顶点(例如v1和v2)之间有一条边(例如边)。边缘方向是从v1到v2。在我目前的情况下,我必须数数。某些条件下边缘的v2传入v2。现在,我可以计算边的数量,但是无法检索v2的数据。

     g.V().hasLabel('V2').has('type','c').as('p').project('v2Data').by(select('p').inE('edge').count().is(gt(5)).valueMap(true))

通过上述方法,我遇到了错误

java.lang.Long cannot be cast to org.apache.tinkerpop.gremlin.structure.Element

我尝试的另一种方法是

     g.V().hasLabel('v2').has('type','c').as('p').project('v2Data').by(select('p').inE('edge').count().is(gt(5)).select('p').valueMap(true))

The provided traverser does not map to a value: v[286724240]->[SelectOneStep(last,p), NoOpBarrierStep(2500), JanusGraphVertexStep(IN,[willingToPlayAt],edge), RangeGlobalStep(0,6), CountGlobalStep, IsStep(gt(5)), SelectOneStep(last,p), NoOpBarrierStep(2500), PropertyMapStep(value)]

我已经尝试过此堆栈溢出答案fold() approach

我希望我的输出为v2data = [{},{}]

参考:     g.addV('game').property('id',1).as('1'). addV('game').property('id',2).as('2'). addV('game').property('id',3).as('3'). addV('game').property('id',4).as('4'). addV('game').property('id',5).as('5'). addV('game').property('id',6).as('6'). addV('loc').property('id',p1).as('p1'). addV('loc').property('id',p2).as('p2'). addE('edge').from('1').to('p1'). addE('edge').from('2').to('p1'). addE('edge').from('3').to('p1'). addE('edge').from('4').to('p1'). addE('edge').from('5').to('p1'). addE('edge').from('6').to('p1'). addE('edge').from('1').to('p2'). addE('edge').from('2').to('p2');

查询:

g.V().hasLabel('loc').has('type','c').
  project('locData').
  by(where(inE('edge').count().is(gt(5))).valueMap(true).fold())

预期输出:

{locData=[{id=[p1],....}]}

因为gt(5)仅适用于id = p1的loc。

但是我得到的结果是

{locData=[{id=[p1],....}]}
{locData=[]}(p2 is not satisfied with my condition.)

1 个答案:

答案 0 :(得分:1)

我不确定您要做什么,但是该错误很容易解释。您正在调用count(),这是产生Long的简化步骤。然后,您尝试在产生错误的valueMap()上调用Long,因为只能在valueMap()(例如Element)上调用Vertex

因此,如果我直接处理您的查询,那么您应该执行以下操作:

g.V().hasLabel('V2').has('type','c').as('p').
  project('v2Data').
    by(select('p').where(inE('edge').count().is(gt(5))).valueMap(true).fold())

您需要fold(),以便在不满足条件的情况下,如果过滤器不返回任何值,则会得到返回值(例如,fold()将减少为空列表)。

也就是说,您的查询仍然可以使用一些工作。首先,我看不到需要“ p”,因为它的值是流中的当前遍历,所以:

g.V().hasLabel('V2').has('type','c').
  project('v2Data').
    by(where(inE('edge').count().is(gt(5))).valueMap(true).fold())

然后,我更喜欢将两个has()步骤结合起来:

g.V().has('V2','type','c').
  project('v2Data').
    by(where(inE('edge').count().is(gt(5))).valueMap(true).fold())

最后,您实际上并不需要count()来找出多于“ 5”的所有边,您只需要最多“ 6”即可,也许是这样:

g.V().has('V2','type','c').
  project('v2Data').
    by(where(inE('edge').limit(6).count().is(gt(5))).valueMap(true).fold())