2017-12-11 18 views
2

私は、次のNeo4jサイファークエリの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 
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 

を持っている私は、このクエリの実行のパフォーマンスでsutisfiedていませんよ。

これはPROFILE出力されます。

Cypher version: CYPHER 3.3, planner: COST, runtime: INTERPRETED. 3296130 total db hits in 2936 ms 

enter image description here

は、このクエリのパフォーマンスを最適化するチャンスはありますか?

答えて

0

このクエリは、データセット、グラフの知識、検索対象がなくても、最適化するのは少し難しいでしょう。

公演は依存:

  1. クエリ自体
  2. スキーマ(インデックス& constrainsts)
  3. グラフモデリング
  4. のNeo4j構成
  5. ハードウェア

は大きな問題はありませんあなたの質問に、 (例えば:matchmatchの砂糖構文、matchwhere句では、anyorに置き換えても、クエリプランを変更することはできません。

クエリパラメータを必ずこのクエリで使用して、この長いクエリのクエリプランを毎回再計算しないようにしてください。

あなたの質問はほとんどの時間が(childD)-[relationshipValueRel4:HAS_VALUE_ON]-(:Characteristic) + where(1.5M * 2 dbhits)になります。 だから、解決策はそのようないくつかの関係を作成することにより、モデルを変更することができます:あなたの答えのためHAS_VALUE_ON_WITH_OPTID_1HAS_VALUE_ON_WITH_OPTID_2 ...

+0

感謝。私はクエリパラメータを使用します。また、私はこの問題がHAS_VALUE_ON関係にあると思います。 1つのアイデアは、手動インデックスhttps://neo4j-contrib.github.io/neo4j-apoc-procedures/#_using_manual_index_on_relationship_propertiesを使用しようとしています。あなたはどう思いますか?ここで助けてくれますか? – alexanoid

+0

詳細については、 'HAS_VALUE_ON_WITH_OPTID_1'、' HAS_VALUE_ON_WITH_OPTID_2'で提案された解決策を教えてください。 – alexanoid

+0

'(:Decision) - (:HAS_VALUE_ON) - (:Characteristic)'というプロパティを 'id'プロパティで作成する代わりに、このプロパティを次のような型に直接入れることができます:'(:Decision) - [:HAS_VALUE_ON_WITH_ID_X] - (:Characteristic) 'Xはあなたのプロパティの値です。これで、クエリは1.5Mのrelsを拡張せず、フィルタを作成しますが、ちょうど75Kです。グラフ自体のインデックスにすることができます^^ – logisima

関連する問題