В моем приложении 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
Прямо сейчас единственный способ, который я нашел, - это сделать это в нескольких различных запросах.
MATCH (a:User {user_id: 'theuserid'})-[:WORKED_ON*1..4]-(collaborator:User) RETURN collaborator
, который дает мне список всех соавторов (соединения первой и второй степени). - Программным циклом проходите через каждого соавтора и СНОВА запрашивает, КАК мы к ним подключены, сначала запрашивая общие проекты, а затем обычных пользователей.
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
Конечно, есть лучший способ?Заранее спасибо за помощь.