使用 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 代码中,您说的是:

  1. 一个人可以看很多部电影:
  2. 一部电影可以一个人看。

一般来说一部电影可以被很多人看吧?如果是这样的话,电影 class 应该包含一群人(具有相同的映射)。

如果它是某种电影预览应用程序,正好有 0..1 Person 人可以观看电影,并且一旦观看就没有其他人可以观看(或者它得到更新,所以最后一个观看的人watched it is the person) 那么你有几种选择:

  1. 您可以向存储库添加自定义查询:

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

    返回关系意味着你的人物对象应该被观看的电影补充水分。

  2. 只需使用 findOne 方法检索电影,然后从中获取人物:movie.getPerson()