neo4j 优化这段代码 match (begin:custom) where begin.number = '222' optional match p = (begin)-[*..6]-(end) where ALL( n1 in nodes(p) where size([n2 in nodes(p) where id(n1) = id(n2)])=1 ) //遍历nodes, 每得到一个node就在nodes中找一下他自己有几个,如果不等于1就不要了 UNWIND nodes(p) as pn with distinct pn match (m1)-[r1]->(pn) where labels(pn) = ["custom"] with pn,m1,case when 2023-toInteger( m1.bornyear) >=60 then 1 else 0 end as judge with distinct judge // return case collect( judge) when >=1 then "家中是否有老人(是)" else "家中是否有老人(否)" end as 家中是否有老人 return collect( judge) 返回结果将进行判断,若结果中含1,则返回结果“是有老人”,否则返回无
时间: 2024-02-07 12:02:24 浏览: 180
根据您提供的代码,我认为可以尝试以下优化:
1. 尽可能使用标签和关系类型过滤节点和关系,以提高匹配效率。
2. 将遍历过程中的节点去重操作移动到遍历完成后进行,以减少遍历次数。
3. 将匹配条件中的表达式尽可能提前计算,以避免在匹配过程中重复计算。
优化后的代码如下:
```
MATCH (begin:custom {number: '222'})
OPTIONAL MATCH p = (begin)-[*..6]-()
WHERE ALL(n IN nodes(p) WHERE size([m IN nodes(p) WHERE m = n]) = 1)
WITH COLLECT(DISTINCT nodes(p)) AS nodes
UNWIND nodes AS pn
MATCH (m1)-[r1]->(pn:custom)
WHERE toInteger(m1.bornyear) <= 1983
WITH COLLECT(DISTINCT CASE WHEN 2023 - toInteger(m1.bornyear) >= 60 THEN 1 ELSE 0 END) AS judge
RETURN CASE WHEN 1 IN judge THEN "家中是否有老人(是)" ELSE "家中是否有老人(否)" END AS result
```
需要注意的是,由于我无法了解您的数据模型和数据量,因此以上优化仅供参考,具体优化效果还需要根据实际情况进行测试和调整。
阅读全文