Cypher Neo4j 查询优化

类二烯类

我使用以下 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足够聪明来优化它?如果不是,请说明如何修复它。

第二位是CASErange() 函数内语句?这里有同样的问题 -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) 可以计算第CASE7 行中表达式:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

优化此Neo4J Cypher查询

来自分类Dev

优化此Neo4J Cypher查询

来自分类Dev

Neo4J和Cypher查询

来自分类Dev

Neo4J / Cypher查询协助

来自分类Dev

Neo4j Cypher查询错误

来自分类Dev

Neo4j Cypher查询的传递闭合性能较差

来自分类Dev

Neo4j Bolt无法持续处理Cypher查询

来自分类Dev

Neo4j空间-执行Cypher查询时失败

来自分类Dev

java neo4j cypher查询以匹配节点

来自分类Dev

Neo4j Cypher查询具有层次关系

来自分类Dev

Neo4j Cypher查询可处理多重关系

来自分类Dev

使用jQuery在Neo4j上执行Cypher查询

来自分类Dev

Neo4j Cypher查询中的常量值

来自分类Dev

neo4j cypher:如何查询链表

来自分类Dev

neo4j cypher:查询结果中的“堆叠”节点

来自分类Dev

使用jQuery在Neo4j上执行Cypher查询

来自分类Dev

Neo4J Cypher查询-空关系

来自分类Dev

java neo4j cypher查询来匹配节点

来自分类Dev

将方法代码移至Neo4j Cypher查询

来自分类Dev

Neo4j cypher查询已知路径

来自分类Dev

使用原始Cypher在Symfony中查询Neo4j

来自分类Dev

Neo4j Cypher查询和复杂排序

来自分类Dev

Neo4j Cypher 查询多对多关系

来自分类Dev

neo4j CYPHER - 关系查询未完成

来自分类Dev

用 C# 编写 Neo4J Cypher 查询

来自分类Dev

如何优化具有多个节点匹配项的Neo4j Cypher查询(笛卡尔积)

来自分类Dev

Spring Data Neo4j中的Cypher查询与Cypher DSL

来自分类Dev

Neo4j查询优化

来自分类Dev

Neo4j Cypher查询有关找到志趣相投的人的查询