Как объединить значения из разных объектов в запросе gremlin? - PullRequest
2 голосов
/ 28 мая 2020

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

{
    "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))

И данные, которые у меня есть, это вершина служащий и вершина healthStatus , есть hasStatus край между сотрудником и 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 из вершины сотрудника

1 Ответ

2 голосов
/ 29 мая 2020

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

 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...