【问题标题】:I am not able to get the data of an already traversed vertex data. Can anyone help me?我无法获取已经遍历的顶点数据的数据。谁能帮我?
【发布时间】:2019-06-13 13:47:47
【问题描述】:

我在两个顶点(比如 v1 和 v2)之间有一条边(比如边)。边缘方向是从 v1 到 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.)

【问题讨论】:

    标签: node.js gremlin janusgraph


    【解决方案1】:

    我并不完全清楚您要做什么,但该错误很容易解释。您正在调用count(),这是一个减少步骤,会产生Long。然后,您尝试在 Long 上调用 valueMap(),这会产生错误,因为 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())
    

    【讨论】:

    • ,我已经尝试过这种方法g.V().hasLabel('V2').has('type','c').project('v2Data').by(where(inE('edge').count().is(gt(5))).valueMap(true).fold())。由于 fold() 我的输出为 ==>{v2Data[{id:id1,name:name1}]} ==>{v2Data=[]}==>{v2Data=[]}
    • 如果我的条件为真,我会得到一些没问题的数据。但是当条件失败时,我不想得到空数组。那么你能推荐一些除了 fold() 之外的东西吗?
    • 好吧,你想要什么而不是一个空数组?还是您不是最初那个顶点所代表的?我认为,如果您想要更准确的答案,您应该编辑您的问题以包含示例数据,如下所示:stackoverflow.com/questions/51388315/…,然后是一些预期的输出。
    猜你喜欢
    • 2018-12-04
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多