Как создать визуализацию ориентированного графа в Vega? - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь визуализировать связи между взаимодействиями моего бота. Каждое взаимодействие отправляется в Elasticsearch и содержит данные об идентификаторе взаимодействия и идентификаторе предыдущего взаимодействия. Взаимодействие может иметь разные «предыдущие взаимодействия». Таким образом, после «группы по идентификатору взаимодействия» я получаю список взаимодействий, их количество и встроенный список предыдущих взаимодействий.

root иерархии - это когда в previous_Id есть пустая строка.

Как создать график, который покажет путь?

Данные выглядит так:

0:
interaction: "1751"
interaction_count: 14
previous: Array(2)
0: {key: "1552", doc_count: 9}
1: {key: "1752", doc_count: 5}

1:
interaction: "0"
interaction_count: 8
previous: Array(1)
0: {key: "", doc_count: 8}

После выполнения метода flatten данные выглядят следующим образом:

0:
interaction: "1751"
interaction_count: 14
previous_Id: "1552"
previous_count: 9
1:
interaction: "1751"
interaction_count: 14
previous_Id: "1752"
previous_count: 5
2:
interaction: "0"
interaction_count: 8
previous_Id: ""
previous_count: 8
3:
interaction: "1552"
interaction_count: 8
previous_Id: "0"
previous_count: 8
4:
interaction: "1752"
interaction_count: 6
previous_Id: "1751"
previous_count: 6

Как вы можете видеть, взаимодействие 1751 удваивается. Это потому, что у него два разных previous_Id, поэтому метод stratify не работает из-за ambiguous 1751.

Код:

{
  $schema: https://vega.github.io/schema/vega/v4.json
  description: Visualization of bot's interactions data.
  padding: 5

  data: [
    {
      name: table
      url: {
        %context%: true
        %timefield%: @timestamp
        index: bots_1152,
        body: {
          size: 10000
          aggs: {
            botdata: {
              filter: {
                term: {
                  meta.botId: "1403"
                }
              }
              aggs: {
                group_by_interaction: {
                  terms: {
                    field: data.interactionId.keyword
                  }
                  aggs: {
                    group_by_prev: {
                      terms: {
                        field: data.prevInteractionId.keyword
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
      format: {
        property: aggregations.botdata.group_by_interaction.buckets
      }
      transform: [
        {
          type: project
          fields: [
            key
            doc_count
            group_by_prev.buckets
          ]
          as: [
            interaction
            interaction_count
            previous
          ]
        }
      ]
    }
    {
      name: linked_data
      source: table
      transform: [
        {
          type: flatten
          fields: [
            previous
          ]
        }
        {
          type: project
          fields: [
            interaction
            interaction_count
            previous.key
            previous.doc_count
          ]
          as: [
            interaction
            interaction_count
            previous_Id
            previous_count
          ]
        }
      ]
    }
  ] 
}
...