Проекция двудольного графа с помощью запроса Cypher Neo4j

#database #graph #neo4j #cypher #bipartite

Вопрос:

Я новичок в neo4j и пытаюсь сделать проекцию двудольного графика пользователей и фильмов, которые они оценили. Вот информация, которой я располагаю:

введите описание изображения здесь

Я создаю график в Neo4j, и вот что у меня получилось:

введите описание изображения здесь

Я пытаюсь сделать проекцию, чтобы подключить пользователей, которые оценили фильмы с одинаковым рейтингом, но мне это не удалось. Это код, который у меня есть для проекции:

 MATCH (u:User)-[r:RATED_MOVIE]->(m:Movie) 
WITH m, collect(u) as users, collect(r) as raitings, count(r) as weights
UNWIND users as u1
UNWIND users as u2
UNWIND raitings as r1
UNWIND raitings as r2
WITH  u1, u2, r1, r2
WHERE u1.UserId < u2.UserId and r1.rating = r2.rating
CREATE (u1)-[:CONNECTED{common_movies_rated:weights}]->(u2)
RETURN u1, u2
 

Ожидаемый результат — это график, подобный этому:

введите описание изображения здесь

Ответ №1:

Хорошее описание, спасибо за указание желаемого результата.

То, что вы ищете, — это пути, в которых два человека дают одинаковую оценку одному и тому же фильму, а затем подсчитывают эти события между двумя людьми, чтобы получить вес, чтобы вы могли создать отношения между ними.

Мы можем использовать более простой запрос, чтобы получить нужные вам результаты.

 MATCH (u1:User)-[r:RATED_MOVIE]->(m:Movie)<-[r2:RATED_MOVIE]-(u2)
WHERE id(u1) < id(u2) AND r.rating = r2.rating
WITH u1, u2, count(m) as weight
CREATE (u1)-[:CONNECTED {common_movies_rated:weight}]->(u2)
RETURN u1, u2