Найдите пути на графике, а затем подсчитайте, сколько раз путь встречается в Azure Cosmos DB с помощью Gremlin.

Я сохраняю события потока кликов в базе данных графиков, используя следующую структуру:  введите описание изображения здесь

Пользователь выполняет несколько событий, и каждое событие имеет преимущество перед предыдущим:

  • Вершины - это пользователь и событие.
  • Края бывают "исполненными" и "предыдущими"

У каждого события есть свойство с именем referer. Например, если пользователь просматривает страницу www.foobar.com/aaa, тогда будет событие просмотра страницы, и у него будет ссылка: www.foobar.com/aaa.

Теперь я хочу найти возможные пути с домашней страницы с их количеством

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

g.V().hasLabel('event').has('referer','https://www.foobar.com/').in('previous').in('previous').path().by('referer')

Выход:

 [
      {
        "labels": [
          [],
          [],
          []
        ],
        "objects": [
          "https://www.foobar.com/",
          "https://www.foobar.com/aaa",
          "https://www.foobar.com/bbb"
        ]
      },
      {
        "labels": [
          [],
          [],
          []
        ],
        "objects": [
          "https://www.foobar.com/",
          "https://www.foobar.com/aaa",
          "https://www.foobar.com/bbb"
        ]
      },
      {
        "labels": [
          [],
          [],
          []
        ],
        "objects": [
          "https://www.foobar.com/",
          "https://www.foobar.com/ccc",
          "https://www.foobar.com/ddd"
        ]
      }
    ]

Я хочу получить такой результат:

[[
  "https://www.foobar.com/",
  "https://www.foobar.com/aaa",
  "https://www.foobar.com/bbb"
]:2,
[
  "https://www.foobar.com/",
  "https://www.foobar.com/ccc",
  "https://www.foobar.com/ddd"
]:1]

Поскольку я использую azure cosmos graph db, доступны только эти операторы gremlin https://docs.microsoft.com/en-us/azure/cosmos-db/gremlin-support
Спасибо


person taher chhabrawala    schedule 25.05.2018    source источник
comment
Вы можете применить groupCount к пути, используя такой синтаксис: groupCount().by(path().by('referer'))   -  person Kelvin Lawrence    schedule 25.05.2018


Ответы (1)


Вы можете применить groupCount к path, используя такой синтаксис:

groupCount().by(path().by('referer'))

Итак, вы можете переписать свой запрос как:

g.V().hasLabel('event').
      has('referer','https://www.foobar.com/').
      in('previous').
      in('previous').
      groupCount().by(path().by('referer'))

Надеюсь это поможет,

Ура Кельвин

person Kelvin Lawrence    schedule 25.05.2018
comment
Спасибо @Kelvin. Он дает «Невозможно преобразовать объект в примитивное значение». исключение. думаю, что он не может группироваться по массиву, поскольку path (). by ('referer') дает массив. Может быть, потребуется объединение строк рефереров, а затем их группировка. Вы знаете, как это сделать? Благодарность - person taher chhabrawala; 26.05.2018
comment
Я протестировал запрос как локально с помощью TinkerGraph, так и удаленно на GremlinServer, подключенном к JanusGraph, с помощью моего графика воздушных маршрутов, и он работал нормально. Поэтому я думаю, что общий синтаксис / шаблон запроса в порядке. Возможно, мне чего-то не хватает, или, может быть, какой-то аспект Cosmos вызывает его сбой. - person Kelvin Lawrence; 26.05.2018
comment
Я также пробовал с TInkerGraph, и он работает, может быть проблема с реализацией гремлина космоса. Пока я оставляю этот вопрос открытым. Если я не получу другого решения, я отмечу его как ответ. Благодарность - person taher chhabrawala; 27.05.2018