使用 spring 数据 neo4j 时如何通过相关对象 ID 获取实体?
how to get an entity By a related object id when using spring data neo4j?
@NodeEntity
public class Person {
@GraphId private Long nodeId;
private String name;
private String addr;
private int age;
@Relationship(type="WATCH")
private Set<Movie> movies;
}
@NodeEntity
public class Movie{
@GraphId private Long nodeId;
private String title;
private int released;
@Relationship(type="WATCH" ,direction = Relationship.INCOMING)
private Person person;
public Movie(){}
}
@RequestMapping(value = "/movieTest", method = RequestMethod.GET)
public Movie movieTest(){
Movie movie =movieRepository.findOne(5078L,1);
return movie;
}
public interface MovieRepository extends GraphRepository<Movie> {
}
我创建了一个人物 class 和一个电影 class,人物 "WATCH" 电影,人物有 属性 "movies",电影有 属性 "person",我的目的是通过电影id获取Person,但是在调用/movieTest API时出现"java.lang.WhosebugError"异常,因为findOne()执行后,结果对象movie有一个子对象person,person有一个子对象movies,然后进入死循环,
所以我想知道如何处理这种情况,或者当我需要通过电影 ID 获取人物时我应该怎么做?
首先我们需要仔细检查模型。在 Cypher 中,你说的是 (:Person)-[:WATCH]->(:Movie)
。在您的 java 代码中,您说的是:
- 一个人可以看很多部电影:
- 一部电影可以一个人看。
一般来说一部电影可以被很多人看吧?如果是这样的话,电影 class 应该包含一群人(具有相同的映射)。
如果它是某种电影预览应用程序,正好有 0..1
Person
人可以观看电影,并且一旦观看就没有其他人可以观看(或者它得到更新,所以最后一个观看的人watched it is the person) 那么你有几种选择:
您可以向存储库添加自定义查询:
public interface PersonRepository extends GraphRepository<Person> {
@Query("MATCH (n:Person)-[r]->(m:Movie) WHERE ID(m) = {movieId} RETURN r")
Person findByMovieId(@Param("movieId) Long id);
}
返回关系意味着你的人物对象应该被观看的电影补充水分。
只需使用 findOne
方法检索电影,然后从中获取人物:movie.getPerson()
@NodeEntity
public class Person {
@GraphId private Long nodeId;
private String name;
private String addr;
private int age;
@Relationship(type="WATCH")
private Set<Movie> movies;
}
@NodeEntity
public class Movie{
@GraphId private Long nodeId;
private String title;
private int released;
@Relationship(type="WATCH" ,direction = Relationship.INCOMING)
private Person person;
public Movie(){}
}
@RequestMapping(value = "/movieTest", method = RequestMethod.GET)
public Movie movieTest(){
Movie movie =movieRepository.findOne(5078L,1);
return movie;
}
public interface MovieRepository extends GraphRepository<Movie> {
}
我创建了一个人物 class 和一个电影 class,人物 "WATCH" 电影,人物有 属性 "movies",电影有 属性 "person",我的目的是通过电影id获取Person,但是在调用/movieTest API时出现"java.lang.WhosebugError"异常,因为findOne()执行后,结果对象movie有一个子对象person,person有一个子对象movies,然后进入死循环, 所以我想知道如何处理这种情况,或者当我需要通过电影 ID 获取人物时我应该怎么做?
首先我们需要仔细检查模型。在 Cypher 中,你说的是 (:Person)-[:WATCH]->(:Movie)
。在您的 java 代码中,您说的是:
- 一个人可以看很多部电影:
- 一部电影可以一个人看。
一般来说一部电影可以被很多人看吧?如果是这样的话,电影 class 应该包含一群人(具有相同的映射)。
如果它是某种电影预览应用程序,正好有 0..1
Person
人可以观看电影,并且一旦观看就没有其他人可以观看(或者它得到更新,所以最后一个观看的人watched it is the person) 那么你有几种选择:
您可以向存储库添加自定义查询:
public interface PersonRepository extends GraphRepository<Person> { @Query("MATCH (n:Person)-[r]->(m:Movie) WHERE ID(m) = {movieId} RETURN r") Person findByMovieId(@Param("movieId) Long id); }
返回关系意味着你的人物对象应该被观看的电影补充水分。
只需使用
findOne
方法检索电影,然后从中获取人物:movie.getPerson()