我使用以下 Cypher 查询:
MATCH (v:Value)-[:CONTAINS]->(hv:HistoryValue)
WHERE v.id = {valueId}
OPTIONAL MATCH (hv)-[:CREATED_BY]->(u:User)
WHERE {fetchCreateUsers}
WITH u, hv
ORDER BY hv.createDate DESC
WITH count(hv) as count, ceil(toFloat(count(hv)) / {maxResults}) as step, COLLECT({userId: u.id, historyValueId: hv.id, historyValue: hv.originalValue, historyValueCreateDate: hv.createDate}) AS data
RETURN REDUCE(s = [], i IN RANGE(0, count - 1, CASE step WHEN 0 THEN 1 ELSE step END) | s + data[i]) AS result, step, count
这个查询工作正常并且完全符合我的需要。
现在,从性能的角度和 Cypher 的最佳实践来看,我担心这个查询中可能存在的两个问题。
首先,正如您所看到的 - 我两次使用相同的count(hv)
功能。从性能的角度来看,它会在执行过程中导致问题还是Cypher和Neo4j足够聪明来优化它?如果不是,请说明如何修复它。
第二位是CASE
range() 函数内的语句?这里有同样的问题 -CASE
在我的范围内的每次迭代中,这个语句是只执行一次还是每次执行?如果需要,请说明如何修复它。
更新
我试图为计数做一个分隔符,但查询不返回结果(返回空结果)
MATCH (v:Value)-[:CONTAINS]->(hv:HistoryValue)
WHERE v.id = {valueId}
OPTIONAL MATCH (hv)-[:CREATED_BY]->(u:User)
WHERE {fetchCreateUsers}
WITH u, hv ORDER BY hv.createDate DESC
WITH u, hv, count(hv) as count
WITH u, hv, count, ceil(toFloat(count) / {maxResults}) as step, COLLECT({userId: u.id, historyValueId: hv.id, historyValue: hv.originalValue, historyValueCreateDate: hv.createDate}) AS data
RETURN REDUCE(s = [], i IN RANGE(0, count - 1, CASE step WHEN 0 THEN 1 ELSE step END) | s + data[i]) AS result, step, count
1 MATCH (v:Value)-[:CONTAINS]->(hv:HistoryValue)
2 WHERE v.id = {valueId}
3 OPTIONAL MATCH (hv)-[:CREATED_BY]->(u:User)
4 WHERE {fetchCreateUsers}
5 WITH u, hv
6 ORDER BY hv.createDate DESC
7 WITH count(hv) as count, ceil(toFloat(count(hv)) / {maxResults}) as step, COLLECT({userId: u.id, historyValueId: hv.id, historyValue: hv.originalValue, historyValueCreateDate: hv.createDate}) AS data
8 RETURN REDUCE(s = [], i IN RANGE(0, count - 1, CASE step WHEN 0 THEN 1 ELSE step END) | s + data[i]) AS result, step, count
(1) 您需要传入hv
第 5 行,因为它的值是在第 7 行收集的。也就是说,您仍然可以执行以下操作:
5 WITH u, collect(hv) AS hvs, count(hv) as count
UNWIND hvs AS hv
然而,这不是很优雅,可能不值得做。
(2) 可以计算第CASE
7 行中的表达式:
7 WITH count, data, step, CASE step WHEN 0 THEN 1 ELSE step END AS stepFlag
8 RETURN REDUCE(s = [], i IN RANGE(0, count - 1, stepFlag) | s + data[i]) AS result, step, count
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句