【问题标题】:How to load the next depth level of referenced objects with neo4j-ogm如何使用 neo4j-ogm 加载下一个深度级别的引用对象
【发布时间】:2021-01-28 02:41:02
【问题描述】:

为了熟悉 neo4j-ogm,我创建了一个非常简单的 3 人示例, 其中,A 认识人 B,B 认识 C 并且可以在数据库浏览器中验证这一点。

现在我想加载深度级别为 1 的人 A(因此知道字段已经被人 B 填充)并且在访问更深的嵌套字段时(例如通过遍历 GUI 中的数据)引用的应该加载对象。在这种情况下,当检查人员 B 的“知道”字段时,应加载人员 C。

我正在使用下面的代码加载人 A。但是人 B 根本没有被引用,我还没有找到任何关于如何加载下一级数据的信息。至少它不能通过访问它们来工作(就像在休眠中一样)。

Result result = session.query("Match (p:Person {name: \"Person A\"}) return p", Collections.EMPTY_MAP);


@NodeEntity
public class Person {
    @Id @GeneratedValue
    private Long id;

    public String name;
    public Person knows;

    public Person() {
    }
    
    public Person(String name) {
        this.name = name;
    }
}

【问题讨论】:

    标签: neo4j neo4j-ogm


    【解决方案1】:

    您的查询Match (p:Person {name: \"Person A\"}) return p 只返回相关人员,而不是任何相关人员。 您甚至没有为 KNOWS 类型的关系建模(这里仅指您问题中的措辞)。

    这个人应该有一个额外的字段:

    @Relationship("KNOWS")
    private List<Person> knownPeople;
    

    您的查询应该类似于Match (p:Person {name: \"Person A\"})-[r:KNOWS]-(op:Person) return p, collect(r), collect(op) 以获取第一级关系。 您当然可以添加更多模式并将部分返回到您的查询中以获得下一个级别等。 但最终使用 session.loadAll(Person.class) 和会话 API 的兄弟方法可能会更容易为您生成 Cypher 查询。

    【讨论】:

    • 感谢您更正@Relationship 但是如何加载层次结构中的下一个级别(延迟加载)?
    • 这就是我提到Session的API方法的原因。 Neo4j-OGM / Spring Data Neo4j 中没有延迟加载。您必须在第一次运行或(手动)后续调用中获取所需的所有数据。
    • 迈斯特迈尔,谢谢!这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多