Я использую версию сообщества neo4j-3.5. И построил огромный график, используя neo4j, содержащий ~ 20 миллионов узлов данных фильма. Я также вставил жанры и ключевые слова и построил график.
Следующий запрос занимает> 5 секунд
MATCH
(p:`Program`),
(p:Program)-[genre:of_genre]->(g:Genre),
(p:Program)-[key_rel:associated_keyword]->(k:Keyword)
WHERE
((g.id IN [1010]) OR (k.id IN ['keyword_121'])) AND
((p.show_type IN ['movie'])) AND
(p.imdb_score > 0)
RETURN distinct p.id, p.imdb_score
ORDER BY p.imdb_score desc
LIMIT 50
, тогда как, если я заменяю ИЛИ на И, это займет <100 мс. </p>
MATCH
(p:`Program`),
(p:Program)-[genre:of_genre]->(g:Genre),
(p:Program)-[key_rel:associated_keyword]->(k:Keyword)
WHERE
((g.id IN [1010]) AND (k.id IN ['keyword_121'])) AND
((p.show_type IN ['movie'])) AND
(p.imdb_score > 0)
RETURN distinct p.id, p.imdb_score
ORDER BY p.imdb_score desc
LIMIT 50
Имеются индексы для идентификатора жанра и ключевого слова.
Ответ PROFILE для «ИЛИ»:
ПРОФИЛЬ ответ для 'И':
Есть ли лучший способ написать запрос с оператором OR?