Я создаю социальное приложение, в котором пользователи могут быть друзьями.
Для данного пользователя A
я хочу найти все триады пользователей, такие что A -isFriends-> B AND B -isFriends-> C AND C -isFriends-> A
.
Мой текущий подход заключается в следующем:
g.V(A).repeat(__.out('isFriends')).times(3).path().by(id).toList()
, а затем за пределами gremlin я отфильтровываю все объекты Path, где первый объект не совпадает с последним объектом. Я предпочел бы, чтобы gremlin сделал эту фильтрацию для меня, но я не уверен, как фильтровать на основе вывода path()
.
Я пробовал cyclicPath()
, но это просто возвращает плоский список Вершинных объектов, которые я не понимаю. Исходя из этого, я ожидал бы вывод, аналогичный path()
, но только с путями, в которых первая и последняя вершины включены одинаково. Дайте мне знать, если это ожидание неверно.
Я также хотел бы затем отсортировать эти пути на основе результатов суб-обхода (сколько общих друзей у этих трех вершин), но я не уверен, как выполнить обход, начиная с вершин, включенных в вывод path()
, без запуска нового запроса gremlin.
Я использую драйвер javascript -gremlin (v3.4.4) и делаю запросы к AWS Нептун, где нет лямбд.
Пожалуйста, дайте мне знать, если мой подход или понимание выключены.