首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Neo4j Cypher查询性能优化

Neo4j Cypher查询性能优化
EN

Stack Overflow用户
提问于 2017-12-11 16:00:13
回答 1查看 139关注 0票数 2

我有以下Neo4j Cypher查询

代码语言:javascript
复制
MATCH (dg:DecisionGroup)-[:CONTAINS]->(childD:Decision) 
WHERE dg.id = 1 
MATCH (childD)-[relationshipValueRel4:HAS_VALUE_ON]-(filterCharacteristic4:Characteristic) 
WHERE filterCharacteristic4.id = 4 
WITH relationshipValueRel4, childD, dg 
WHERE  (ANY (id IN [2,3] 
WHERE id IN relationshipValueRel4.optionIds ))  
WITH childD, dg  
OPTIONAL MATCH (childD)-[vg:HAS_VOTE_ON]->(c:Criterion) 
WHERE c.id IN [2, 3] 
WITH childD, dg, vg.avgVotesWeight as weight, vg.totalVotes as totalVotes 
WITH childD , dg , toFloat(sum(weight)) as weight, toInt(sum(totalVotes)) as totalVotes  
ORDER BY  weight DESC 
SKIP 0 LIMIT 10 
WITH * MATCH (childD)-[ru:CREATED_BY]->(u:User) OPTIONAL MATCH (childD)-[rup:UPDATED_BY]->(up:User)  
RETURN ru, u, rup, up, childD AS decision, weight, totalVotes, 
[ (dg)<-[:DEFINED_BY]-(entity)<-[:COMMENTED_ON]-(comg:CommentGroup)-[:COMMENTED_FOR]->(childD) | {entityId: toInt(entity.id),  types: labels(entity), totalComments: toInt(comg.totalComments)} ] AS commentGroups, 
[ (dg)<-[:DEFINED_BY]-(c1)<-[vg1:HAS_VOTE_ON]-(childD) | {criterionId: toInt(c1.id),  weight: vg1.avgVotesWeight, totalVotes: toInt(vg1.totalVotes)} ] AS weightedCriteria, [ (dg)<-[:DEFINED_BY]-(ch1:Characteristic)<-[v1:HAS_VALUE_ON]-(childD)  WHERE  NOT ((ch1)<-[:DEPENDS_ON]-())  | {characteristicId: toInt(ch1.id),  optionIds: v1.optionIds, valueIds: v1.valueIds, value: v1.value, available: v1.available, totalHistoryValues: v1.totalHistoryValues, totalFlags: v1.totalFlags, description: v1.description, valueType: ch1.valueType, visualMode: ch1.visualMode} ] AS valuedCharacteristics

我对这个查询执行的性能不太满意。

这是配置文件输出:

代码语言:javascript
复制
Cypher version: CYPHER 3.3, planner: COST, runtime: INTERPRETED. 3296130 total db hits in 2936 ms

有没有可能优化这个查询性能?

EN

回答 1

Stack Overflow用户

发布于 2017-12-12 14:46:03

如果没有数据集、图的知识以及要搜索的内容,要优化这个查询将会有点困难。

性能取决于:

  1. Query本身
  2. 模式(索引和约束)
  3. 图建模
  4. Neo4j configuration Schema

您的查询没有什么大问题,即使它对我来说可以写成更易读的状态(例如:一个大的match,在match中的where子句上使用clause语法,将any替换为or,等等),但是它不会改变查询计划。

请确保对此查询使用查询参数,以避免每次都重新计算此长查询的查询计划。

您的查询大部分时间都会传递到(childD)-[relationshipValueRel4:HAS_VALUE_ON]-(:Characteristic) +其上的where子句中(即。1.5M *2个数据库命中)。因此,一个解决方案可以通过创建如下关系来更改模型:HAS_VALUE_ON_WITH_OPTID_1HAS_VALUE_ON_WITH_OPTID_2 ...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47748573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档