【问题标题】:Spring Data Neo4j ogm Session issue with loadAll by id and depthSpring Data Neo4j ogm 会话问题,loadAll by id 和 depth
【发布时间】:2017-03-18 00:11:16
【问题描述】:

我有一个类似这样的图表:

(t:Teacher)-[:TEACHES]-(s:Student)-[:ATTENDS]-(s:Subject)-[:REQUIRES]-(b:Book)

@NodeEntity 类表示。

我需要为 Id 在给定范围内的教师加载所有 @NodeEntities,并在一个查询中获取他们教授的所有学生,以及他们的学科和每个学科所需的书籍。

我试过了

int depth=3;
List<Long> ids = newArrayList(3,4,5);
session.loadAll(Teacher.class, ids, depth);

其实我开头对应的GraphRepositoryfindAll是一样的东西。

不幸的是,我得到了数据库中所有可用教师的列表,因为每个学生恰好都由所有教师教授。我还尝试运行自定义@Query,但您似乎无法指定自定义深度How to control depth on custom Spring Data Neo4j repository methods?,也无法从自定义密码查询返回多个节点。

你知道为什么我的方法是错误的吗?这似乎是对 neo4j 的简单使用,但我一直无法获取整个图表。

【问题讨论】:

  • 我使用的是spring数据neo4j 4.0.0.RELEASE。我想避免升级到 spring data neo4j 的 4.2.0.M1 版本(有帮助吗?),因为它还需要升级我的 spring boot 版本和其他依赖项。

标签: java spring neo4j spring-data-neo4j


【解决方案1】:

是的,当您使用模型调用 session.loadAll 到深度 3 时,您基本上会返回所有教师,因为没有应用于负载查询的模式匹配以将其限制为您正在谈论的节点。因此,从深度的角度考虑这一点并不能真正帮助您尝试做的事情。

有两种(尽管相似)方法可以使这项工作发挥作用。

a) 你正确地提到了使用自定义@Query。这是最简单的方法,您无需指定深度。为了使查询起作用,您必须还返回您的关系。你的签名应该是这样的:

    @Query("MATCH (t:Teacher)-[teacherRels:TEACHES]-(st:Student)-[studentRels:ATTENDS]-(su:Subject)-[subjectRels:REQUIRES]-(b:Book) WHERE ID(t) in {ids} RETURN t, teacherRels, st, studentRels, su, subjectRels, b")
    public Iterable<Teacher> findTeachersByIds(@Param("ids") List<Long> ids);

b) 你可以用session.query 做与上面相同的事情(这就是上面的方法基本上会调用的)。

如果你确实想升级,你应该使用4.2.0.RC1,它应该在 2016 年 11 月 28 日推出(如果你愿意,你可以同时使用4.2.0.BUILD-SNAPSHOT。它比4.2.0.M1 更稳定)。

【讨论】:

    猜你喜欢
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多