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 浏览: 35
根据您提供的代码,我认为可以尝试以下优化:
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
```
需要注意的是,由于我无法了解您的数据模型和数据量,因此以上优化仅供参考,具体优化效果还需要根据实际情况进行测试和调整。
相关问题
MATCH p=()-[r:`包含`]->() where n.name="算法" return n neo4j中查找算法节点的包含关系怎么改正
首先,Cypher查询语句中要返回节点n,但是MATCH子句中并没有定义n,应该将其改为r。其次,WHERE子句中引用了n.name,应该将其改为r.name。最后,关系类型`包含`应该使用反引号(`)括起来,因为其中包含了中文字符。因此,正确的查询语句应该是:
```
MATCH (n)-[r:`包含`]->() WHERE r.name = "算法" RETURN n
```
这条语句会查找所有包含名为"算法"的节点的关系,然后返回这些关系的起始节点n。
MATCH p=(n:person)-[r:`关系`]-(m) where n.name=aName RETURN p" ^.; nested exception is org.neo4j.ogm.exception.CypherException: Cypher execution failed with code 'Neo.ClientError.Statement.SyntaxError': Variable
这条Cypher查询语句中的变量aName没有定义。请确保aName已经被定义并且赋值了一个合法的字符串。如果aName是一个变量,请在查询之前先定义并给它赋值。如果aName是一个字符串,请将其用引号括起来,例如:
MATCH p=(n:person)-[r:`关系`]-(m) WHERE n.name='aName' RETURN p