Graph Spring Neo4j@Query在调用后续.findOne之前不会填充相关实体

Graph Spring Neo4j@Query在调用后续.findOne之前不会填充相关实体,graph,neo4j,spring-data-neo4j,Graph,Neo4j,Spring Data Neo4j,我有以下密码,它在Neo4j浏览器中正常工作,并按预期返回所有相关实体: MATCH (cmp:Competition)-[:COMPETITION_COUNTRY]-(cc:Country) WHERE ID(cmp)=16860 MATCH (cmp)-[:COMPETITION]-(s:Season)<-[:SEASON]-(f:Fixture) WHERE s.yearStart=2019 MATCH (f)-[:HOME_TEAM]-(ht:Team)-[:TEAM_COUN

我有以下密码,它在Neo4j浏览器中正常工作,并按预期返回所有相关实体:

MATCH (cmp:Competition)-[:COMPETITION_COUNTRY]-(cc:Country)
WHERE ID(cmp)=16860

MATCH (cmp)-[:COMPETITION]-(s:Season)<-[:SEASON]-(f:Fixture)
WHERE s.yearStart=2019

MATCH (f)-[:HOME_TEAM]-(ht:Team)-[:TEAM_COUNTRY]-(htc:Country)
MATCH (f)-[:HOME_TEAM]-(at:Team)-[:TEAM_COUNTRY]-(atc:Country)

RETURN cmp, s, f, ht, at, htc, atc
ORDER BY f.matchDate DESC, ht.name DESC
我将此方法称为:

@Query("MATCH (cmp:Competition)-[:COMPETITION_COUNTRY]-(cc:Country)\n" +
        "WHERE ID(cmp)={0}\n" +
        "\n" +
        "MATCH (cmp)-[:COMPETITION]-(s:Season)<-[:SEASON]-(f:Fixture)\n" +
        "WHERE s.yearStart={1}\n" +
        "\n" +
        "MATCH (f)-[:HOME_TEAM]-(ht:Team)-[:TEAM_COUNTRY]-(htc:Country)\n" +
        "MATCH (f)-[:HOME_TEAM]-(at:Team)-[:TEAM_COUNTRY]-(atc:Country)\n" +
        "\n" +
        "RETURN cmp, s, f, ht, at, htc, atc\n" +
        "ORDER BY f.matchDate DESC, ht.name DESC"
)
List<Fixture> getCompetitionYearFixtures(
         Long competitionId, Integer yearStart
);
List<Fixture> fixtures =
        fixtureRepository
                .getCompetitionYearFixtures(
                        competitionId, year);
因此:

所以我的问题是,有没有一种方法可以在第一次访问数据库之后返回包含所有相关实体的fixture,而不必返回

我特别检索了我在密码中需要的所有内容,而在findOne中使用深度3的想法让我有点不舒服,因为将来我可能会添加新的关系,我不一定希望使查询膨胀

编辑 解决方案,感谢František Hartman:

MATCH r1=(cmp:Competition)-[cmp_c:COMPETITION_COUNTRY]-(cmpc:Country)
WHERE ID(cmp)=16860
MATCH r2=(cmp)-[cmp_s:COMPETITION]-(s:Season)<-[s_f:SEASON]-(f:Fixture)
WHERE s.yearStart=2019
MATCH r3=(f)-[f_ht:HOME_TEAM]-(ht:Team)-[ht_c:TEAM_COUNTRY]-(htc:Country)
MATCH r4=(f)-[f_at:AWAY_TEAM]-(at:Team)-[at_c:TEAM_COUNTRY]-(atc:Country)
RETURN r1,r2,r3,r4
ORDER BY f.matchDate DESC,ht.name DESC

您需要返回所有要映射的内容,在您的情况下,您希望映射关系,即使您没有关系实体,关系表示,例如,赛程和主队是相关的

要查看Neo4j浏览器中确切返回的内容,请转到浏览器设置cog图标左下->取消选中“连接结果节点”

通过查询关系,您可能会找到比r1-r7更好的名称:

MATCH (cmp:Competition)-[r1:COMPETITION_COUNTRY]-(cc:Country)
WHERE ID(cmp)=16860

MATCH (cmp)-[r2:COMPETITION]-(s:Season)<-[r3:SEASON]-(f:Fixture)
WHERE s.yearStart=2019

MATCH (f)-[r4:HOME_TEAM]-(ht:Team)-[r5:TEAM_COUNTRY]-(htc:Country)
MATCH (f)-[r6:HOME_TEAM]-(at:Team)-[r7:TEAM_COUNTRY]-(atc:Country)

RETURN cmp, s, f, ht, at, htc, atc, r1, r2, r3, r4, r5, r6, r7
ORDER BY f.matchDate DESC, ht.name DESC

深度参数为3的findOne方法加载所有内容,包括多达3个步骤的关系,这些关系将填充到数据的缓存实例中。

非常感谢,它工作得非常好。现在你已经解释过了,这看起来很明显,但是Neo4j浏览器填充关系确实让我困惑,所以我很高兴我现在知道了这个复选框。
MATCH (cmp:Competition)-[r1:COMPETITION_COUNTRY]-(cc:Country)
WHERE ID(cmp)=16860

MATCH (cmp)-[r2:COMPETITION]-(s:Season)<-[r3:SEASON]-(f:Fixture)
WHERE s.yearStart=2019

MATCH (f)-[r4:HOME_TEAM]-(ht:Team)-[r5:TEAM_COUNTRY]-(htc:Country)
MATCH (f)-[r6:HOME_TEAM]-(at:Team)-[r7:TEAM_COUNTRY]-(atc:Country)

RETURN cmp, s, f, ht, at, htc, atc, r1, r2, r3, r4, r5, r6, r7
ORDER BY f.matchDate DESC, ht.name DESC