在我的Neo4j,SDN4項目,我有以下實體:Neo4j的暗號查詢及節點參數,而不是與他人的關係
Decision
,Criterion
,Vote
每一個決定都會對不同的標準進行表決。
現在,我使用以下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
現在我不滿意這個查詢的性能,所以我想在查詢執行過程中減少數據基數。
爲了做到這一點,而不是每avgVotesWeight
存儲爲關係Decision
和Criterion
之間的財產我打算這個值存儲爲Decision
節點本身的屬性。
例如我有以下節點:
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
是一個純String
前綴,以便在我SDN4以區分Decision
屬性的其餘部分這些性質Custom Type Converter一個1
或2
或3
後綴是Criterion
uid
(我傳遞這些uid
到我的Cypher支架的查詢在{criteriaIds}
參數)
所以我的問題是 - 一般來說這是個好主意嗎?如果是這樣,請你幫我,以代替使用下面的舊的Cypher查詢這些屬性來重寫上面提到的查詢:
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
另外,我不知道現在在哪裏保持vg.totalVotes
值是目前也存儲在Decision
和Criterion
之間的相同關係。請指教。也許它應該也存儲與我想實現avgVotesWeight
相同的方法?例如,我可以引入之類的屬性,如TV1=34
。這是個好主意嗎 ?