Как получить результаты по свойствам разных вершин в гремлине? - PullRequest
0 голосов
/ 22 марта 2019

У меня есть эта база данных:

Клиенты => Инцидент => Файл => Имя файла

  • Клиенты имеют ID
  • Инциденты имеют идентификационный номер и свойство о сообщении
  • Файлы имеют идентификатор и fileSize, mimeType, свойство вредоносного ПО
  • Имена файлов имеют идентификатор

Клиент имеет исходящий Edge to Incidents (сообщается), инцидент имеет исходящий Edge to file (containsFile), файл имеет исходящий Edge to filename (hasName).

Какой запрос мне нужно выполнить в gremlin для получения идентификатора имени файла, идентификатора файла, file-fileSize и значения инцидента-о-сообщения в одном результате?

Вот пример данных:

g.addV('client').property('id','1')
  addV('incident').property('id','11').property('reportedON'2/15/2019 8:01:19 AM')
  addV('file').property('id','100').property('fileSize', '432534')
  addV('fileName').property('id','file.pdf')
  addE('reported').from('1').to('11').
  addE('containsFile').from('11').to('100').
  addE('hasName').from('100').to('file.pdf').iterate()

1 Ответ

0 голосов
/ 22 марта 2019

Обход, который вы опубликовали для создания примера данных, содержит десятки ошибок.Не переживайте, попробуйте еще раз проверить, что вы публикуете.

В любом случае, вот фиксированная версия вашего запроса:

g.addV('client').property('id','1').as('1').
  addV('incident').property('id','11').property('reportedON', '2/15/2019 8:01:19 AM').as('11').
  addV('file').property('id','100').property('fileSize', '432534').as('100').
  addV('fileName').property('id','file.pdf').as('file.pdf').
  addE('reported').from('1').to('11').
  addE('containsFile').from('11').to('100').
  addE('hasName').from('100').to('file.pdf').iterate()

получите имя файла ID, file-ID, file-fileSize и значения об инциденте-сообщении

gremlin> g.V().has('client','id','1').
......1>   out('reported').as('incident').
......2>   out('containsFile').
......3>   out('hasName').
......4>   path().
......5>     from('incident').
......6>     by(union(group().
......7>                by(label).
......8>                by('id'),
......9>              valueMap()).
.....10>     unfold().
.....11>   filter(select(keys).is(neq('id'))).
.....12>   group().
.....13>     by(keys).
.....14>     by(select(values).unfold())).
.....15>   unfold().unfold().
.....16>   group().
.....17>     by(keys).
.....18>     by(select(values).unfold())
==>[fileName:file.pdf,file:100,reportedON:2/15/2019 8:01:19 AM,fileSize:432534,incident:11]

Только получение только path().from('incident').by(valueMap()) уже даст вам все, что вам нужно.Тем не менее, я добавил немного перегруппировки, чтобы получить лучший форматированный результат.

...