Возвращение к первому и второму порядку «друзей» - PullRequest
0 голосов
/ 08 июня 2018

В моем приложении Users связаны с Projects, с которым они работают вместе.Моя схема выглядит как (Пользователь) - [: WORKED_ON] -> (Проект) с несколькими пользователями на проект и несколькими проектами на пользователя.Я хотел бы иметь возможность показать кому-то свою сеть не только с кем они работали, но также и с их «друзьями друзей», с которыми они могут захотеть связаться.

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

Визуально:

  • Общий проект: (me: User)-[:WORKED_ON]->(:Project)<-[:WORKED_ON]-(collaborator:User)

  • Общий соавтор: (me: User)-[:WORKED_ON]->(:Project)<-[:WORKED_ON]-(common_collaborator:User)-[:WORKED_ON]->(:Project)<-[:WORKED_ON]-(collaborator:User)

Таким образом, конечным результатом будет список, похожий на: Jane Doe: You and jane worked on X project John Doe: You and John have both worked with Jane

Прямо сейчас единственный способ, который я нашел, - это сделать это в нескольких различных запросах.

  1. MATCH (a:User {user_id: 'theuserid'})-[:WORKED_ON*1..4]-(collaborator:User) RETURN collaborator, который дает мне список всех соавторов (соединения первой и второй степени).
  2. Программным циклом проходите через каждого соавтора и СНОВА запрашивает, КАК мы к ним подключены, сначала запрашивая общие проекты, а затем обычных пользователей. MATCH (user:User {user_id: 'theuserid'}), (other_user: User {user_id: 'otheruserid'}), (user)-[:WORKED_ON]->(common_project:Project)<-[:WORKED_ON]-(other_user) RETURN common_project MATCH (user:User {user_id: 'theuserid'}), (other_user: User {user_id: 'otheruserid'}), (user)-[:WORKED_ON*2]-(common_collaborator:User)-[:WORKED_ON*2]-(other_user) RETURN common_collaborator

Конечно, есть лучший способ?Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 08 июня 2018

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

MATCH (a:User {user_id: 'theuserid'})-[:WORKED_ON*2..4]-(collaborator:User)
RETURN collaborator;

Кроме того, вы должны убедиться, что у вас есть индекс on :User(user_id).

[ОБНОВЛЕНИЕ]

Вот запрос, который вернет строки, содержащие user и данные о проекте / соавторе или common_collaborator / соавторе,Это должно быть то, что вы хотели.

MATCH p=(user:User {user_id: 'theuserid'})-[:WORKED_ON*2..4]-(col:User)
RETURN user,
  CASE WHEN LENGTH(p) = 2
    THEN {project: NODES(p)[1], collaborator: col}
    ELSE {common_collaborator: NODES(p)[2], collaborator: col} END AS data;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...