毕设20200528 Neo4jRepository的使用,findAll方法的注意点

本文介绍了Neo4jRepository在Spring Data中的使用,特别是在使用findAll方法时需要注意的点,防止出现由于节点关联导致的StackOverflowError。通过示例展示了未加控制的findAll方法会引发无限递归,导致内存溢出。解决方案是通过限制查询深度避免此类问题。

Neo4jRepository是继承了Spring data的CrudRepository的,所以是在CrudRepository的基础上针对Neo4j做了扩展的。

初步使用的实验是,你能想到的CRUD的方法,基本不用你自己写Cypher(也就是Neo4j的SQL)。
比如要模糊查询:

MATCH (a:Artifact) WHERE a.artifactId CONTAINS 'red' return a 

那么,对应地你只要在你自己定义的Repository中继承Neo4jRepository,就可以像堆积木一样写出你的get请求对应的方法名“findAllByArtifactIdContains”,那么这个方法名就对应了上面的查询语句,且不用我们自己显式用@Query在接口方法上写出查询语句

//@Query("MATCH (a:Artifact) WHERE a.artifactId CONTAINS $artifactId RETURN a")
List<Artifact> getAllByArtifactIdContains(String artifactId);

findAll在Neo4jRepository里面有多种重载
如果你在一个图数据库里面使用不带参数的findAll()方法,那么就会报下面的错误。大概就是因为你Node之间是彼此关联的,findAll()方法执行的Cypher如下:

MATCH (n:`Organization`) WITH n RETURN n,[ [ (n)<-[r_h1:`HAS_ORG`]-(a1:`Artifact`) | [ r_h1, a1 ] ] ]

这个Cypher在数据库里面会查到Organization和Artifact两个节点和他们彼此间的关系。如下,
在这里插入图片描述
那么,这边不加上控制,就会通过a去找到g,在通过g去找到a,直接导致stackOverFlowError内存溢出了。

Swagger上面call这个findAll方法,直接返回这样一个结果
在这里插入图片描述
表示,虽然Cypher正确执行也拿到了结果,大师数据过大,Swagger无力将其转换成JSON,只能给你看个原数据。

显示的数据如下,基本就是重复数据无线循环:

can't parse JSON.  Raw result:

[{"id":5,"name":"redhat","url":"redhat-7.org","artifacts":[{"id":20,"groupId":"neo4j","artifactId":"neo4j","version":"1.2.3","availability":true,
"scope":null,"artifacts":[],"dependencies":[],"parent":null,"licenses":[],"organization":
{"id":5,"name":"redhat","url":"redhat-7.org","artifacts":
[{"id":20,"groupId":"neo4j","artifactId":"neo4j","version":"1.2.3","availability":true,
"scope":null,"artifacts":[],"dependencies":[],"parent":null,"licenses":[],"organization":
{"id":5,"name":"redhat","url":"redhat-7.org","artifacts":
[{"id":20,"groupId":"neo4j","artifactId":"neo4j","version":"1.2.3","availability":true,
"scope":null,"artifacts":[],"dependencies":[],"parent":null,"licenses":[],"organization":
{"id":5,"name":"redhat","url":"redhat-7.org","artifacts":
[{"id":20,"groupId":"neo4j","artifactId":"neo4j","version":"1.2.3","availability":true,
"scope":null,"artifacts":[],"dependencies":[],"parent":null,"licenses":[],"organization":
{"id":5,"name":"redhat","url":"redhat-7.org","artifacts":
...

解决方法:
其实就给这个findAll查询加个深度就可以了

artifactRepository.findAll(0);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值