使用spring数据neo4j时,如何通过相关对象id获取实体? @NodeEntity 公共阶层人士{ @GraphId private Long nodeId; 私有字符串名称; 私有字符串地址; 私人互联网; @关系(type=“WATCH”) 私人电影; } @节点性 公映{ @GraphId private Long nodeId; 私有字符串标题; 释放私人int; @关系(type=“WATCH”,direction=Relationship.INCOMING) 私人; 公共电影(){} } @RequestMapping(value=“/movieTest”,method=RequestMethod.GET) 公共电影{ Movie-Movie=movieRepository.findOne(5078L,1); 回归电影; } 公共接口MovieRepository扩展了graphrespository{ }

使用spring数据neo4j时,如何通过相关对象id获取实体? @NodeEntity 公共阶层人士{ @GraphId private Long nodeId; 私有字符串名称; 私有字符串地址; 私人互联网; @关系(type=“WATCH”) 私人电影; } @节点性 公映{ @GraphId private Long nodeId; 私有字符串标题; 释放私人int; @关系(type=“WATCH”,direction=Relationship.INCOMING) 私人; 公共电影(){} } @RequestMapping(value=“/movieTest”,method=RequestMethod.GET) 公共电影{ Movie-Movie=movieRepository.findOne(5078L,1); 回归电影; } 公共接口MovieRepository扩展了graphrespository{ },neo4j,spring-data-neo4j,spring-data-neo4j-4,Neo4j,Spring Data Neo4j,Spring Data Neo4j 4,我创建了一个Person类和一个Movie类,Person“WATCH”Movie,Person有属性“movies”,Movie有属性“Person”,我的目的是通过电影id获取Person,但是调用/movieTest API时发生了“java.lang.StackOverflowerr”异常,因为执行findOne()后,结果对象Movie有一个子对象Person,人有一个子物体,然后进入一个无休止的循环, 所以我想知道的是如何处理这种情况,或者当我需要通过电影id获取人物时,我应该怎么做

我创建了一个Person类和一个Movie类,Person“WATCH”Movie,Person有属性“movies”,Movie有属性“Person”,我的目的是通过电影id获取Person,但是调用/movieTest API时发生了“java.lang.StackOverflowerr”异常,因为执行findOne()后,结果对象Movie有一个子对象Person,人有一个子物体,然后进入一个无休止的循环,
所以我想知道的是如何处理这种情况,或者当我需要通过电影id获取人物时,我应该怎么做?

首先,我们需要仔细检查模型。在Cypher中,你说的是
(:Person)-[:WATCH]->(:Movie)
。在java代码中,您说:

  • 一个人可以看很多电影:
  • 一部电影可以由一个人看
  • 一般来说,一部电影可以被很多人观看,对吗?如果是这种情况,电影类应该包含一组人(具有相同的映射)

    如果它是某种电影预览应用程序,其中确切的
    0..1
    Person
    s可以观看一部电影,并且观看后没有其他人可以观看(或者它被更新,因此最后观看的人就是该人),那么您有几个选项:

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

    @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> {
    }
    
    公共接口PersonRepository扩展了GraphRespository{
    @查询(“匹配(n:Person)-[r]->(m:Movie)其中ID(m)={movieId}返回r”)
    Person findByMovieId(@Param(“movieId”)Long id);
    }
    
    回归关系意味着你的人与物应该在看电影时得到滋润

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

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