首页 > 解决方案 > Spring Data neo4j 双方访问关系

问题描述

在我的 neo4j 数据库中,我有这个

(:Song)-[:APPEARS_ON {song_nr: x}]->(:Release)

从我的 Spring Boot 应用程序中,我想从歌曲端以及发布端访问这种关系,同时访问歌曲编号。

歌曲.java

@Node
public class Song {

    @Id @GeneratedValue
    private Long id;
    private String name;
    private OffsetTime length;

    @Relationship(type="APPEARS_ON", direction = Relationship.Direction.OUTGOING)
    private final List<AppearsOn> releases;

    private Song(String name, OffsetTime length, List<AppearsOn> releases) {
        this.name = name;
        this.length = length;
        this.releases = releases;
    }

    public Long getId() { return id; }

    public String getName() { return name; }

    public OffsetTime getLength() { return length; }

    public List<AppearsOn> getReleases() { return releases; }

}

AppearsOn.java

@RelationshipProperties
public class AppearsOn {

    @Id @GeneratedValue
    private Long id;
    @Property("song_nr")
    private Integer songNr;

    @TargetNode
    private Release release;

    public Long getId() {
        return id;
    }


    public Integer getSongNr() { return songNr; }

    public Release getRelease() { return release; }
}

发布.java

@Node
public class Release {

    @Id @GeneratedValue
    private Long Id;
    private String name;
    private Integer year;

    @Relationship(type = "APPEARS_ON", direction = Relationship.Direction.INCOMING)
    private final List<AppearsOnReverse> songs;

    public Release(String name, Integer year, List<AppearsOnReverse> songs) {
        this.name = name;
        this.year = year;
        this.songs = songs;
    }

    public Long getId() {
        return Id;
    }

    public String getName() {
        return name;
    }

    public Integer getYear() {
        return year;
    }

    public List<AppearsOnReverse> getSongs() { return songs; }

}

AppearsOnReverse.java

@RelationshipProperties
public class AppearsOnReverse {

    @Id @GeneratedValue
    private Long id;
    @Property("song_nr")
    private Integer songNr;

    @TargetNode
    private Song song;

    public Long getId() {
        return id;
    }


    public Integer getSongNr() {
        return songNr;
    }

    public Song getSong() {
        return song;
    }
}

当我尝试查询某些内容时,例如List<Release> allReleases = releaseRepository.findAll();

我得到一个这样的例外:

org.neo4j.driver.exceptions.DatabaseException: Expected 
RegularSinglePlannerQuery(QueryGraph {Nodes: ['  rootNodeIds@7'], .......


Instead, got: 
RegularSinglePlannerQuery(QueryGraph {Nodes: ['  rootNodeIds@7'], .......

是否有可能从双方访问关系,或者这会破坏 SDN?

org.neo4j.driver v4.2.7
spring-boot-starter-data-neo4j v2.5.6
spring-data-neo4j v6.1.6

标签: springspring-bootneo4jspring-data-neo4j

解决方案


您的映射/模型没有问题 问题出在您使用的 Neo4j 版本中。它有一个查询计划程序错误。我不知道它何时出现,但它已通过 4.3.3 / 4.2.10 及更高版本解决。

这与 SDN 6.1.6 中一些必要的查询改进相结合,导致了现在有问题的星座。如果您无法升级数据库,我建议手动将 Spring Data Neo4j 版本设置为 6.1.5 。


推荐阅读