Как посчитать входящие вершины в гремлине? - PullRequest
0 голосов
/ 15 апреля 2019

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

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

У клиентов есть идентификатор. У инцидентов есть идентификатор и свойство reportsOn. У файлов есть идентификатор и свойство fileSize, mimeType, malware. У имен файлов есть идентификатор. Содержит файл), файл имеет исходящий Edge to filename (hasName).

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

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').property('malwareSource', 'malware').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()

Я выполняю этот запрос:

g.V().has('malwareSource', 'malware').as('FILE').out('hasName').as('FILENAME').select('FILE').in('containsFile').as('INCIDENT').select('FILE').valueMap().as('FILEVALUES').select('INCIDENT').valueMap().as('INCIDENTVALUES').select('FILE', 'FILEVALUES', 'FILENAME', 'INCIDENTVALUES')

Как подсчитать, сколько входящих вершин имеет каждый файл со свойством «malware»?

1 Ответ

0 голосов
/ 17 апреля 2019

Вы действительно должны использовать project() - код гораздо более читабелен, как показано в отдельном вопросе, который у вас был здесь :

gremlin> g.V().has('malwareSource', 'malware').
......1>   project('FILE', 'FILENAME', 'FILEVALUES', 'INCIDENTVALUES').
......2>     by().
......3>     by(out('hasName')).
......4>     by(valueMap()).
......5>     by(__.in('containsFile').valueMap().fold())
==>[FILE:v[5],FILENAME:v[9],FILEVALUES:[fileSize:[432534],malwareSource:[malware],id:[100]],INCIDENTVALUES:[[reportedON:[2/15/2019 8:01:19 AM],id:[11]]]]

намного проще следовать, хотя я все еще не понимаю, зачем вам эта возвращаемая структура данных, поскольку она повторяет данные в результате для "FILE" и "FILEVALUES". Ну, кроме этого, вы можете видеть, как легко получить количество входящих ребер ... это просто добавление дополнительного ключа к project() и дополнительного модулятора by() для выполнения count():

gremlin> g.V().has('malwareSource', 'malware').
......1>   project('FILE', 'FILENAME', 'FILEVALUES', 'INCIDENTVALUES', 'COUNT').
......2>     by().
......3>     by(out('hasName')).
......4>     by(valueMap()).
......5>     by(__.in('containsFile').valueMap().fold()).
......6>     by(__.in().count())
==>[FILE:v[5],FILENAME:v[9],FILEVALUES:[fileSize:[432534],malwareSource:[malware],id:[100]],INCIDENTVALUES:[[reportedON:[2/15/2019 8:01:19 AM],id:[11]]],COUNT:1]

Возможно, вы могли бы выяснить, как сделать строки 5 и 6 один раз, чтобы избежать двойной итерации, но я бы, вероятно, попытался бы оптимизировать это как отдельную проблему и рассмотреть возможность корректировки структуры возвращаемых данных, чтобы учесть это.

...