2017-06-12 83 views
1

在我的Neo4j,SDN4項目,我有以下實體:Neo4j的暗號查詢及節點參數,而不是與他人的關係

DecisionCriterionVote

每一個決定都會對不同的標準進行表決。

現在,我使用以下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 

現在我不滿意這個查詢的性能,所以我想在查詢執行過程中減少數據基數。

爲了做到這一點,而不是每avgVotesWeight存儲爲關係DecisionCriterion之間的財產我打算這個值存儲爲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一個123後綴是Criterionuid(我傳遞這些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值是目前也存儲在DecisionCriterion之間的相同關係。請指教。也許它應該也存儲與我想實現avgVotesWeight相同的方法?例如,我可以引入之類的屬性,如TV1=34。這是個好主意嗎 ?

回答

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 
相關問題