neo4j - производительность запроса для сопоставления узлов с общими отношениями - PullRequest
0 голосов
/ 27 февраля 2020

Я создал базу данных из данных Twitter и имею отношения между пользователями и местами, например:

(:User)-[:WAS_AT]-> (p:Place)

Существует 610,464 отношений этого типа, между 59,257 пользователями и 823 местами.

Я хочу получить всех пользователей, которые были в одном и том же месте:

MATCH q=(u1:User)-[:WAS_AT]->(:Place)<-[:WAS_AT]-(u2:User)
RETURN q

Этот запрос не завершился через два с лишним часа, что я делаю не так?

Я пытался добавить индекс для пользователей, но это не улучшило эффективность.

Заранее спасибо,

1 Ответ

1 голос
/ 28 февраля 2020

Ваш запрос пытается получить каждую отдельную пару посещений одного и того же Place. Таким образом, если было N посещений Place, вы пытаетесь получить N*(N-1) путей. И вы пытаетесь сделать это для каждого Place.

. То, что вы на самом деле хотите, это получить список отдельных Users, посетивших тот же Place (который будет не более N по размеру). Вот как вы можете это сделать:

MATCH (u:User)-[:WAS_AT]->(place:Place)
RETURN place, COLLECT(DISTINCT u) AS users

Опция DISTINCT необходима, только если User может иметь несколько WAS_AT отношений с одним и тем же Place.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...