我有以下Neo4j Cypher查询
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我对这个查询执行的性能不太满意。
这是配置文件输出:
Cypher version: CYPHER 3.3, planner: COST, runtime: INTERPRETED. 3296130 total db hits in 2936 ms

有没有可能优化这个查询性能?
发布于 2017-12-12 14:46:03
如果没有数据集、图的知识以及要搜索的内容,要优化这个查询将会有点困难。
性能取决于:
您的查询没有什么大问题,即使它对我来说可以写成更易读的状态(例如:一个大的match,在match中的where子句上使用clause语法,将any替换为or,等等),但是它不会改变查询计划。
请确保对此查询使用查询参数,以避免每次都重新计算此长查询的查询计划。
您的查询大部分时间都会传递到(childD)-[relationshipValueRel4:HAS_VALUE_ON]-(:Characteristic) +其上的where子句中(即。1.5M *2个数据库命中)。因此,一个解决方案可以通过创建如下关系来更改模型:HAS_VALUE_ON_WITH_OPTID_1,HAS_VALUE_ON_WITH_OPTID_2 ...
https://stackoverflow.com/questions/47748573
复制相似问题