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)