Я не могу получить данные уже пройденных данных вершины. Может кто-нибудь мне помочь? - PullRequest
0 голосов
/ 13 июня 2019

У меня есть ребро (скажем, ребро) между двумя вершинами (скажем, 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 () подход

Я хочу получить вывод 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) выполняется только для loc с id = p1.

Но я получаю свой результат как

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

1 Ответ

1 голос
/ 13 июня 2019

Мне не совсем понятно, что вы пытаетесь сделать, но эту ошибку легко объяснить. вы звоните 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())
...