2017-06-12 10 views
1

値:のNeo4jサイファークエリおよびノー​​ドのパラメータの代わりに、関係私が次のエンティティを持っている私のNeo4j、SDN4プロジェクトで

DecisionCriterionVote

すべての意思決定は、さまざまな基準に投票を持つことができます。

今私はDecisionsを平均で並べ替えるために次のCypherクエリを使用します。選択基準の投票重み({criteriaIds}パラメータはCriterionSet<Long>表しID)を:

MATCH (parentD)-[:CONTAINS]->(childD:Decision) 
WHERE id(parentD) = {decisionId} 
OPTIONAL MATCH (childD)-[vg:HAS_VOTE_ON]->(c) 
WHERE id(c) IN {criteriaIds} 
WITH c, childD, (vg.avgVotesWeight * (CASE WHEN c IS NOT NULL THEN coalesce({criteriaCoefficients}[toString(id(c))], 1.0) ELSE 1.0 END)) as weight, vg.totalVotes as totalVotes 
WITH * MATCH (childD)-[ru:CREATED_BY]->(u:User) 
RETURN ru, u, childD AS decision, toFloat(sum(weight)) as weight, toInt(sum(totalVotes)) as totalVotes 
ORDER BY weight DESC, childD.name ASC 
SKIP 0 LIMIT 10 

今、私はこのクエリのパフォーマンスに満足していないので、私は、クエリの実行中にデータのカーディナリティを削減したいです。これを行うために

、代わりに私はDecisionノード自体のプロパティとしてこの値を格納する予定DecisionCriterionとの間の関係の性質として、すべてのavgVotesWeightを記憶します。例えば

私は次のノードがあります。

Decision1(uid = 1) 

Criterion1(uid = 1) 
Criterion2(uid = 2) 
Criterion3(uid = 3) 

Decision1は基準に関する次avgVotesWeightを持っている:

Decision1 for Criterion1 = 4.3 
Decision2 for Criterion1 = 2.1 
Decision3 for Criterion1 = 1.8 

ので、私はDecision1ノードで次のプロパティを作成するつもりです:

Decision1(CAVW1=4.3, CAVW2=2.1, CAVW3=1.8) 

ここで、CAVWは私のSDN4 Custom Type ConverterDecisionプロパティの残りの部分からこれらのプロパティを区別するために1または2または3サフィックスが

Criterion uid(私は {criteriaIds}パラメータの私のサイファークエリにこれら uidを渡している)されている平野 String接頭辞です

私の質問は - 一般的には良い考えですか?もしそうなら、あなたは以下の旧サイファーのクエリの代わりにこれらのプロパティを使用するためには、上記のクエリを書き直すために私を助けてください可能性があります。ここで、vg.totalVotes値を保つためにも

WHERE id(c) IN {criteriaIds} 
WITH c, childD, (vg.avgVotesWeight * (CASE WHEN c IS NOT NULL THEN coalesce({criteriaCoefficients}[toString(id(c))], 1.0) ELSE 1.0 END)) as weight, vg.totalVotes as totalVotes 

は、私が今知っていないこと現在もDecisionCriterionの間に同じ関係で格納されています。お知らせ下さい。たぶん、私はavgVotesWeightのために実装したいのと同じアプローチで保存する必要がありますか?たとえば、TV1=34のような追加のDecisionプロパティを導入できます。いいアイデアですか?

答えて

0

同様のソリューションに興味がある可能性があり誰に、これは私の新しい作業クエリです:

MATCH (parentD)-[:CONTAINS]->(childD:Decision) 
WHERE id(parentD) = {decisionId} 
UNWIND {criteriaIds} AS cid 
WITH childD, (properties(childD)['CAVW' + cid] * (CASE WHEN cid IS NOT NULL THEN coalesce({criteriaCoefficients}[toString(cid)], 1.0) ELSE 1.0 END)) AS weight, properties(childD)['CTV' + cid] AS totalVotes 
WITH * MATCH (childD)-[ru:CREATED_BY]->(u:User) 
RETURN ru, u, childD AS decision, toFloat(sum(weight)) as weight, toInt(sum(totalVotes)) as totalVotes 
ORDER BY weight 
DESC SKIP 0 LIMIT 2