2016-02-01 2 views
1

Я пытаюсь выяснить, как оптимизировать запрос cypher на очень большом наборе данных. Я пытаюсь найти друзей 2-й или 3-й степени в одном городе. Мой текущий высчитывать запрос, который занимает более 1 минуты, чтобы запустить:Оптимизация запроса nep4j cypher с очень большим набором данных

match (n:User {id: 123})-[:LIVES_IN]->()<-[:LIVES_IN]-(u:User), (n)-[:FRIENDS_WITH*2..3]-(u) WHERE u.age >= 20 AND u.age <= 36 return u limit 100 

Есть около 500K узлов пользователей и 500M FRIENDS_WITH отношения. У меня уже есть индексы по свойствам id и age. Запрос, похоже, задыхается от требования FRIENDS_WITH. Есть ли способ думать об этом по-другому или оптимизировать шифр, чтобы сделать его в режиме реального времени (т. Е. Максимальное время 1-2 секунды)?

Вот профиль запроса:

Imgur

Спасибо.

+0

У вас есть тестовая база данных, которую вы можете экспортировать для запуска запросов cypher? – manonthemat

ответ

0

Создание индекса на свойства идентификатора для этикеточной пользователя:

CREATE INDEX ON :User(id) 

См документации для индексов схемы для получения дополнительной информации http://neo4j.com/docs/stable/query-schema-index.html

Если это не поможет добавить результат в PROFILE запроса, и мы могли бы чтобы помочь вам больше

PROFILE MATCH ... rest of your query 

Также это может быть стоит попробовать переписать запрос на следующий путь:

MATCH (n:User {id: 123})-[:LIVES_IN]->()<-[:LIVES_IN]-(u:User), 
(n)-[:FRIENDS_WITH*2..3]-(u) 
WHERE u.age >= 20 AND u.age <= 36 
return u limit 100 
+0

Спасибо @ frant.hartm. Я обновил исходный вопрос с помощью профиля. У меня уже есть индексы appopriate. Благодаря! – Jonathan

Смежные вопросы