Как объединить значения из разных объектов в запросе gremlin?

У меня есть запрос, который возвращает результат в следующем формате:

{
    "Key": [
      "Value1",
      "Value2"
    ],
    "Count": [
      {
        "Count1": 28,
        "Count2": 28
      },
      {
        "Count3": 16,
        "Count4": 16
      }
    ]
  }

Я хочу отобразить его в следующем формате

[
  {
     "Key" : "Value1",
     "Count1": 28,
     "Count2": 28
  },
  {
     "Key" : "Value2",
     "Count3": 16,
     "Count4": 16
  }
]

Является ли это возможным?

Гремлин, производящий аналогичный результат


g.V().
has('organizationId', 'b121672e-8049-40cc-9f28-c62dff4cc2d9').
hasLabel('employee').

group(). 
by('officeId').
by(project('Id', 'Status').
    by(choose(has('officeId'), constant('Total'), constant(''))).
    by(coalesce(out('hasStatus').
                or(
                        has('release', is(false)),                          
                        has('autoRelease', is(true)).
                        has('release', is(true)).
                        has('endDate', gte(637250976000000000))
                 ), values('status'), constant('Green'))).
    select(values).
    unfold().
    groupCount()).

    project('Id', 'Count').
    by(select(keys)).
    by(select(values))

И данные, которые у меня есть, - это вершина employee и вершина healthStatus, есть граница hasStatus между employee и healthStatus

Свойства в вершине сотрудника: id, organization, officeId, Name, createdOn

Свойства в вершине healthStatus: id, status, startDate, endDate, release, autoRelease, createdOn.

Образец данных

 g.addV('employee').
       property('id',1).
       property('organizationId',1).
       property('officeId',1).
       property('name','A').
       property('createdOn', 637263231140000000).as('1').
    addV('employee').
       property('id',2).
       property('organizationId',1).
       property('officeId',2).
       property('name','B').
       property('createdOn', 637263231140000000).as('2').
   addV('employee').
       property('id',5).
       property('organizationId',1).
       property('officeId',3).
       property('name','C').
       property('createdOn', 637263231140000000).as('5').
    addV('healthStatus').
       property('id',3).
       property('status','Red').
       property('startDate',637262367140000000).
       property('endDate',637264095140000000).
       property('release',false).
       property('createdOn',637262367140000000)as('3').
    addV('healthStatus').
       property('id',4).
       property('status','Yellow').
       property('startDate',637262367140000000).
       property('endDate',637264095140000000).
       property('release',false).
       property('createdOn',637262367140000000)as('4').
    addE('hasStatus').from('1').to('3').
    addE('hasStatus').from('4').to('4')

Выход:

[
  {
    "Id" : [
        1,
        2,
        3
      ]
  },
  {
    "Count": [
      {
         "Red" : 1
      },
      {
         "Yellow" : 1
      },
      {
         "Green" : 1
      }
    ]  
  }

Ожидаемый результат

[
  {
     "Id" : 1,
     "Red" : 1
  },
  {
     "Id" : 2,
     "Yellow" : 1
  },
  {
     "Id" : 3,
     "Green" : 1
  }
]

Примечание. Этот идентификатор в проекции - officeId из вершины сотрудника.


person Kajal Patel    schedule 28.05.2020    source источник
comment
Хотя возможно получить эти данные в нужную вам форму, я часто обнаруживаю, что, если мой Gremlin превращается в большой объем интенсивного кода преобразования данных, возможно, я структурировал остальную часть моего запроса таким образом, чтобы поместите меня в это место, и мне нужно переосмыслить эту часть запроса. Не могли бы вы поделиться Gremlin, который производит этот вывод (и некоторые образцы данных - пример: stackoverflow.com/questions/51388315/), чтобы я мог увидеть, есть ли способ реструктурировать эту часть для получения желаемого результата?   -  person stephen mallette    schedule 28.05.2020
comment
@stephenmallette Я добавил запрос   -  person Kajal Patel    schedule 28.05.2020
comment
Ваше описание данных / схемы хорошее, но реальный сценарий, который можно было бы выполнить для генерации данных, был бы лучше. возможно, вы могли бы также упростить фильтрацию, поскольку это не является сутью вашего вопроса, что упростит сборку примера сценария данных, а сам запрос более сфокусирован на проблеме. Пока он сидит, я не уверен, что ваш обход вообще выполняется - не могли бы вы его просмотреть, пожалуйста, чтобы убедиться, что вы вставили правильный код? возможно, мне что-то не хватает, но скобки, похоже, не совпадают так, как я ожидал, а coalesce() имеет только один аргумент.   -  person stephen mallette    schedule 28.05.2020
comment
@stephenmallette Надеюсь, это поможет.   -  person Kajal Patel    schedule 29.05.2020


Ответы (1)


Думаю, я уловил то, что вы хотели. В вашем примере сценария данных было несколько ошибок, и мне нужны были дополнительные данные, чтобы убедиться, что подсчеты имеют смысл, поэтому я добавил немного:

 g = TinkerGraph.open().traversal()
 g.addV('employee').
       property('id',1).
       property('organizationId',1).
       property('officeId',1).
       property('name','A').
       property('createdOn', 637263231140000000).as('1').
    addV('employee').
       property('id',2).
       property('organizationId',1).
       property('officeId',2).
       property('name','B').
       property('createdOn', 637263231140000000).as('2').
   addV('employee').
       property('id',5).
       property('organizationId',1).
       property('officeId',3).
       property('name','C').
       property('createdOn', 637263231140000000).as('5').
   addV('employee').
       property('id',6).
       property('organizationId',1).
       property('officeId',3).
       property('name','D').
       property('createdOn', 637263231140000000).as('6').
    addV('healthStatus').
       property('id',3).
       property('status','Red').
       property('startDate',637262367140000000).
       property('endDate',637264095140000000).
       property('release',false).
       property('createdOn',637262367140000000).as('3').
    addV('healthStatus').
       property('id',4).
       property('status','Yellow').
       property('startDate',637262367140000000).
       property('endDate',637264095140000000).
       property('release',false).
       property('createdOn',637262367140000000).as('4').
    addE('hasStatus').from('1').to('3').
    addE('hasStatus').from('2').to('4').
    addE('hasStatus').from('6').to('4')

Я немного переписал ваш обход, чтобы предоставить другой подход, который, как мне кажется, обеспечивает ожидаемые данные, но в несколько другой форме:

gremlin> g.V().has('employee','organizationId', 1).
......1>   project('Id', 'Status').
......2>     by('officeId').
......3>     by(coalesce(out('hasStatus').
......4>                 or(has('release', false),                          
......5>                    has('autoRelease', true).has('release', true).has('endDate', gte(637250976000000000))). 
......6>                 values('status'), 
......7>                 constant('Green'))).
......8>   group().
......9>     by(select('Id')).
.....10>     by(groupCount().
.....11>          by('Status'))
==>[1:[Red:1],2:[Yellow:1],3:[Yellow:1,Green:1]]

Я предпочитаю эту форму немного, но, возможно, вам потребуется исходный формат, о котором вы спрашивали, и в этом случае вам понадобится еще один раунд манипуляций с коллекцией:

gremlin> g.V().has('employee','organizationId', 1).
......1>   project('Id', 'Status').
......2>     by('officeId').
......3>     by(coalesce(out('hasStatus').
......4>                 or(has('release', false),                          
......5>                    has('autoRelease', true).has('release', true).has('endDate', gte(637250976000000000))). 
......6>                 values('status'), 
......7>                 constant('Green'))).
......8>   group().
......9>     by(select('Id')).
.....10>     by(groupCount().
.....11>          by('Status')).
.....12>   unfold().
.....13>   map(union(project('Id').by(select(keys)),
.....14>             select(values)).
.....15>       unfold().
.....16>       group().by(keys).by(select(values)))
==>[Red:1,Id:1]
==>[Yellow:1,Id:2]
==>[Yellow:1,Id:3,Green:1]
person stephen mallette    schedule 29.05.2020