Получить первый элемент массива как объект в запросе TinkerPop3 Gremlin и JanusGraph - PullRequest
0 голосов
/ 19 сентября 2018

Я столкнулся с этой проблемой во время миграции запросов gremlin с v2 на v3.

V2-way : inE().has(some condition).outV().map().toList()[0] вернет объект.Это обернуто в transform{label: it./etc/} шаг.

V3-way , все еще WIP: inE().has(some condition).outV().fold() вернет массив.Это обернуто в project(...).by(...) шаг.

V3 работает нормально, мне просто нужно развернуть элемент из массива вручную.Интересно, есть ли более вменяемый подход (во всяком случае, это похоже на шаг без графов).

Среда: JanusGraph, TinkerPop3 +.Для v2: дБ Titan graph и TinkerPop2 +.

Обновление: Пример запроса V3

inE('edge1').
  has('cond1').outV(). // one vertex left
  project('items', 'count'). // pagination
    by(
      order().
        by('field1', decr).
          project('vertex_itself', 'vertex2', 'vertices3').
            by(identity()).
            by(outE('edge2').has('type', 'type1').limit(1).inV().fold()). // now this is empty array or single-element array, can we return element itself?
            by(inE('edge2').has('type', 'type2').outV().fold()).
          fold()).
    by(count())

Желаемая форма результата:

[{
  items: [
    {vertex_itself: Object, vertex2: Object/null/empty, veroces3: Array},
    {}...
  ],
  cont: Number,
}]

Проблема: vertex2 свойство всегда является массивом, пустым или одноэлементным.
Ожидается: vertex2 будет объектом или нулем / пустым.

Обновление 2: оказывается, что мой запрос еще не завершен, он возвращает много объектов, если в шаге has('cond1').outV() нет ни одного элемента, например, [{items, count}, {items, count}...]

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

похоже, ваша главная проблема - получение одного элемента из обхода.

вы можете сделать это с помощью next(), который будет извлекать следующий элемент в текущей итерации обхода:

inE().has(some condition).outV().next()

структура итерируемого, я думаю, зависит от конкретной реализации.например, в javascript вы можете получить доступ к элементу с помощью свойства value:

const result = await inE().has(some condition).outV().next();
const item = result.value;
0 голосов
/ 19 сентября 2018

Возможно, я не совсем понимаю, но это звучит так:

inE().has(some condition).outV().fold()

вы хотите просто захватить первую встреченную вами вершину.Если это так, то есть ли вообще причина для fold()?может просто сделать:

inE().has(some condition).outV().limit(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...