【发布时间】:2019-05-28 11:56:49
【问题描述】:
我正在使用 neo4j-3.5 社区版本。并且使用 neo4j 构建了一个巨大的图表,其中包含约 2000 万个电影数据节点。我还插入了流派和关键字并构建了图表。 以下查询需要 > 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
而如果我将 OR 替换为 AND,则需要
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
类型 ID 和关键字 ID 上有索引。
'OR' 的 PROFILE 响应:
“AND”的 PROFILE 响应:
用 OR 运算符编写查询有更好的方法吗?
【问题讨论】:
-
您能否在开始时使用
PROFILE运行查询并在此处分享扩展计划? -
@Raj:我已经用 PROFILE 输出更新了问题。
-
很难说计划的哪一部分与查询的哪一部分相对应。请先展开计划的所有元素(查看查询计划时查询结果窗格右下角的双向下箭头),然后将其添加到您的问题中,替换您提供的折叠计划。
-
@InverseFalcon:我已经更新了查询计划。
标签: neo4j cypher graph-databases query-performance boolean-expression