Neo4j插入内存溢出
0
默认使用如下查询:
PortNode findByPortId(Long portId);
但是录入一定数量就开始内存溢出了,开始找了很久没有找到原因。
后来看了debug
日志才发现,原来这个查询会级联查询所有关系,成环的关系就会导致内存溢出。
旧版的API
存在@Depth
注解可以指定查询的深度,但是新版的没有这个注解了,所以只能改成下面这样:
@Query(
"MATCH (a:PortNode{portId:$portId})-[r:PortRelationship]-(z:PortNode) RETURN a, COLLECT(r), COLLECT(z)"
)
PortNode findByPortId(Long portId);
然后这里还有一个问题,就是save
的时候,后面的节点关系会丢失,所以最后我改成了使用语句插入关系:
@Query(
"MATCH (a:PortNode{portId:$aPortId}) WITH a " +
"MATCH (z:PortNode{portId:$zPortId}) " +
"CREATE (a)-[r:PortRelationship]->(z)"
)
如果不要WITH
直接MATCH
后面两个节点会有下面的警告:
2022-07-27 08:29:03,046 [http-nio-8585-exec-1] WARN [org.springframework.data.neo4j.cypher] LogAccessor.java:157 - Neo.ClientNotification.Statement.CartesianProductWarning: This query builds a cartesian product between disconnected patterns.
MATCH (a:PortNode{portId:$aPortId}), (z:PortNode{portId:$zPortId}) CREATE (a)-[r:PortRelationship]->(z)