2017-12-12 5 views
1

私は次のクエリがあります。このクエリののNeo4jサイファーパフォーマンスのクエリの最適化

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 
RETURN childD LIMIT 10 

プロフィール情報:

サイファーバージョン:CYPHER 3.3、プランナー:COST、ランタイム:INTERPRETEDを。 2773 4ミリ

enter image description here

で 総デシベルヒットしかし、私は照会するための1つの以上の行を追加します。WITH childD , dg , toFloat(sum(weight)) as weight, toInt(sum(totalVotes)) as totalVotes

をし、クエリは次のようになります。

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 
RETURN childD LIMIT 10 

プロフィールinfoは次のとおりです。

Cypherバージョン:CYPHER 3.3、プランナー:COST、ランタイム:INTERPRETED。それは、この追加のサイファーとそう長く働いているのはなぜ6747ミリ

enter image description here

4ミリ - 6747ミリ秒

差の 7818908総デシベルヒットは非常に巨大ですどのように最適化するのですか?

+0

他のクエリのPROFILEプランを追加できますか? – InverseFalcon

+0

@InverseFalcon最初のクエリのPROFILE計画があります – alexanoid

答えて

1

これはsum()操作と関係があり、EagerAggregationをプランに追加すると考えられます。

sum()操作がなければ、LIMITが10になります。結果は、最初の完全なレコードが取得されるとすぐにストリーミングが開始され、10回目にヒットすると停止します。プランナは、レコードを返すことができるときと、10番目のレコードが見つかった後で停止できるときの両方で、すべての結果を見つける必要はなく、その後10の最初のスライスを得ることができます。

しかし、sum()collect()と同じ)などの積極的な集約がある場合は、そのようにすることはできません。どうして?単にchildD、dg、およびvgを持つ単一のレコードを持つだけでは十分ではないためです。合計は、同じchildD、dg、およびvg変数を使用して得られたすべての単一の他のレコードを持つことに依存します。したがって、重みおよび合計投票は、これらすべてのレコードにわたって合計することができます。そして、合計が正確であるために必要なすべてのレコードを持っていることを知る唯一の方法は、すべての結果を最初に得ることです。そして、集計が完了すると、最初の10レコードが取られ、残りはキャストされます。