値:のNeo4jサイファークエリおよびノードのパラメータの代わりに、関係私が次のエンティティを持っている私のNeo4j、SDN4プロジェクトで
Decision
、Criterion
、Vote
すべての意思決定は、さまざまな基準に投票を持つことができます。
今私はDecisionsを平均で並べ替えるために次のCypherクエリを使用します。選択基準の投票重み({criteriaIds}
パラメータはCriterion
のSet<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
ノード自体のプロパティとしてこの値を格納する予定Decision
とCriterion
との間の関係の性質として、すべての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 ConverterでDecision
プロパティの残りの部分からこれらのプロパティを区別するために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
は、私が今知っていないこと現在もDecision
とCriterion
の間に同じ関係で格納されています。お知らせ下さい。たぶん、私はavgVotesWeight
のために実装したいのと同じアプローチで保存する必要がありますか?たとえば、TV1=34
のような追加のDecision
プロパティを導入できます。いいアイデアですか?