Что я делаю, чтобы получить все профилей *, который имеет специфическое направленное отношение к профилю пользователя * и, если таковым имеет другой профиль * получить те в случае, пользователей альтернативный профиль * имеет отношение к нему. Мне также нужно направление отношений.Оптимизировать Neo4j Cypher запрос
Моя проблема в том, что около 10000 узлов занимает около 5 секунд, чтобы получить данные. У меня есть автоматический индекс на узлах и отношениях.
Это как мои узлы связаны:
User - [: профиль] -> ProfileA - [: связанные с] -> ProfileB < - [?: меня] -> ProfileB2 < - [?: связанные с] -ProfileA2 < - [: профиль] -User
Мой запрос выглядит следующим образом:
START User=node({source})
MATCH User-[:profile]->ProfileA-[rel:related]->ProfileB
WHERE User-->ProfileA-->ProfileB
WITH ProfileA, rel, ProfileB
MATCH ProfileB<-[?:me]->ProfileB2<-[relB?:related]-ProfileA2<-[:profile]-User
WHERE relB IS NULL OR User-->ProfileA-->ProfileB<-->ProfileB2<--ProfileA2<--User
RETURN ProfileB, COLLECT(ProfileB2), rel, relB
LIMIT 25
Любая идея, как я могу оптимизировать запрос?
- профили: ProfileB
- профиль пользователя: ProfileA
- альтернативный профиль: ProfileB2
- пользователи альтернативного профиля: ProfileA2
Проблема с вашим запросом заключается в том, что я получаю дубликаты. Между каждым узлом должен быть только один прыжок, и, насколько я понимаю, Neo4j жадный, если вы не укажете [: profile * .. 1], но это не будет работать с необязательными отношениями, поэтому мне нужно WHERE. – webjay
Отношения [: me] символизируют ваш профиль Twitter, связанный с вашим профилем GitHub. – webjay
Вот пример: http://console.neo4j.org/r/3hjktv, сделанный 'CREATE (Пользователь), (UserProfileA), (UserProfileB), (ProfileA), (ProfileB), Пользователь - [: profile] - > UserProfileA - [: follow] -> ProfileA - [: me] -> ПрофильB, ProfileA - [: follow] -> UserProfileA, Пользователь - [: profile] -> UserProfileB - [: follow] -> ProfileB- [ : me] -> ProfileA, ПрофильB - [: follow] -> UserProfileB; ' – webjay