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);

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

1504

被折叠的 条评论
为什么被折叠?



