Neo4j按查询顺序排列的性能不佳
我有一个复杂的密码,当我不使用“orderby”时,我会得到一个相当快的响应,但当我使用“orderby”时,它会非常慢。我的order属性(电影的分数,即PageRank算法分数)上有一个b树索引。我加了密码Neo4j按查询顺序排列的性能不佳,neo4j,spring-data-neo4j,neo4j-apoc,Neo4j,Spring Data Neo4j,Neo4j Apoc,我有一个复杂的密码,当我不使用“orderby”时,我会得到一个相当快的响应,但当我使用“orderby”时,它会非常慢。我的order属性(电影的分数,即PageRank算法分数)上有一个b树索引。我加了密码 MATCH (m:Movie) WHERE m.release > '0' AND m.imdbVoteAverage > 0 AND CASE WHEN NOT [] = [] THEN any(title in [] WHERE toLower(m.title) CONT
MATCH (m:Movie)
WHERE m.release > '0' AND m.imdbVoteAverage > 0 AND
CASE WHEN NOT [] = [] THEN any(title in [] WHERE toLower(m.title) CONTAINS title OR toLower(m.originalTitle) CONTAINS title) ELSE TRUE END
WITH m AS m
MATCH (m)-[:HAS_GENRE]->(genre: Genre)
WHERE CASE WHEN NOT ['komedi'] = [] THEN any(genreName in ['komedi'] WHERE toLower(genre.name) CONTAINS genreName) ELSE TRUE END
MATCH (m)<-[acted:ACTED_IN]-(actor: Person)
WHERE CASE WHEN NOT [] = [] THEN any(actorName in [] WHERE toLower(actor.name) CONTAINS actorName) ELSE TRUE END AND
CASE WHEN NOT [] = [] THEN any(characterName in [] WHERE any(cname in acted.characterNames WHERE toLower(cname) CONTAINS characterName)) ELSE TRUE END
MATCH (m) -[:HAS_KEYWORDS]->(keyword: Keyword)
WHERE CASE WHEN NOT [] = [] THEN any(keywordName in [] WHERE toLower(keyword.name) CONTAINS keywordName) ELSE TRUE END
MATCH (m)<-[:PRODUCED]-(producer: Person)
WHERE CASE WHEN NOT [] = [] THEN any(producerName in [] WHERE toLower(producer.name) CONTAINS producerName) ELSE TRUE END
MATCH (m)<-[:DIRECTED]-(director: Person)
WHERE CASE WHEN NOT [] = [] THEN any(directorName in [] WHERE toLower(director.name) CONTAINS directorName) ELSE TRUE END
MATCH (m)<-[:WRITTEN]-(writer: Person)
WHERE CASE WHEN NOT [] = [] THEN any(writerName in [] WHERE toLower(writer.name) CONTAINS writerName) ELSE TRUE END
MATCH (m)<-[:PRODUCED_COMPANY]-(productionCompany: ProductionCompany)
WHERE CASE WHEN NOT [] = [] THEN any(producedCompanyName in [] WHERE toLower(productionCompany.name) CONTAINS producedCompanyName) ELSE TRUE END
RETURN DISTINCT m ORDER BY m.score DESC LIMIT 10
匹配(m:电影)
其中m.release>0和m.imdbVoteAverage>0和
如果不是[]=[]则任何(在[]中的标题,其中toLower(m.title)包含标题或toLower(m.originaltle)包含标题)否则为真结束
以m为m
匹配(m)-[:具有类型]->(类型:类型)
如果CASE WHEN NOT['komedi']=[]那么任何(在['komedi']中的genreName),其中toLower(genre.name)包含genreName),否则为TRUE END
匹配(m)(关键字:关键字)
其中CASE WHEN NOT[]=[]则any(关键字名称在[]中,其中toLower(keyword.name)包含关键字名称)ELSE TRUE结束
匹配(m)您需要向计划者表明您的m.score字段是数字字段,因此从索引中提取该字段。即其中m.score>0
您应该在查询计划中看到它
您的查询看起来也非常复杂,而且是生成的。但实际上没有考虑到总是“false”的表达式可以从查询部分中删除,例如,WHERE not[]=[]
它解决了问题,谢谢。