График /Gremlin для использования в социальных сетях

Рассмотрим сценарий подачи Instagram. Я хочу, чтобы все публикации были опубликованы людьми, на которых я подписан. Для каждого из этих постов я хочу знать, понравилось мне это или нет, а также узнать, кому из других людей, за которыми я подписан, это понравилось (если есть). Как лучше всего получить это в гремлине (возможно, избегая дублирования)?

Изображение для наглядности

Следующее просто дает сообщения, "опубликованные" пользователем 2. Как получить другую информацию в том же запросе?

g.V().has('ID','USER 2').out('posted')

1 ответ

Решение

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

g.addV('user').property('id',1).as('1').
  addV('user').property('id',2).as('2').
  addV('user').property('id',3).as('3').
  addV('user').property('id',4).as('4').
  addV('post').property('postId','post1').as('p1').
  addV('post').property('postId','post2').as('p2').
  addE('follow').from('1').to('2').
  addE('follow').from('1').to('3').
  addE('follow').from('1').to('4').
  addE('posted').from('2').to('p1').
  addE('posted').from('2').to('p2').
  addE('liked').from('1').to('p2').
  addE('liked').from('3').to('p2').
  addE('liked').from('4').to('p2').iterate()

Что касается ответа, я бы, вероятно, сделал что-то вроде этого:

gremlin> g.V().has('id',1).as('me').
......1>   out('follow').
......2>   aggregate('followers').
......3>   out('posted').
......4>   group().
......5>     by('postId').
......6>     by(project('likedBySelf','likedByFollowing').
......7>          by(__.in('liked').where(eq('me')).count()).
......8>          by(__.in('liked').where(within('followers')).values('id').fold()))
==>[post2:[likedBySelf:1,likedByFollowing:[3,4]],post1:[likedBySelf:0,likedByFollowing:[]]]

Вы находите пользователя и получаете его подписчиков, содержащих их в списке с aggregate(), Тогда вы найдете их сообщения с out('posted'), Чтобы получить ваш Map Структура для вашего выхода вы можете group() на этих "постах". Второй by() модулятор использует project() построить свой внутренний Map и в основном делает два обхода, где первый использует ноль или единицу для представления вашего логического значения, выполнив count() а второй возвращается к списку "подписчиков", который мы агрегировали ранее для фильтрации по ним. Обратите внимание на важное использование fold() в конце, чтобы свести результат этого внутреннего обхода к списку.

Другие вопросы по тегам