使用neo4J OGM和cypher将自引用节点作为父子返回

时间:2015-11-13 04:25:57

标签: neo4j cypher neo4j-ogm

在Neo4J数据库中,我有一个实体' Person'可以作为PARENT_OF或CHILD_OF关系与其他人相关

例如,密码查询

Match (p:Person) - [:PARENT_OF] -> (c:Person) where id(p) = {p_id} return p, c

将返回包含id p_id 的父记录p和一组子记录c

在Java中,我有一个基类Person

public class Person {
    @GraphId private Long id;
    @Property @NonNull private String profile;
    @Relationship(type="RELATED_TO", direction="OUTGOING") Experience experience;
    @Relationship(type="RELATED_TO", direction="OUTGOING") Activity activity;
}

和2个子课程

@NodeEntity (label="Person")
public class Parent extends Person {
    @Relationship(type="PARENT_OF", direction="OUTGOING") private List<Child> child;
}

@NodeEntity (label="Person")
public class Parent extends Person {
    @Relationship(type="PARENT_OF", direction="OUTGOING") private List<Child> children;
}

假设合适的getter和setter

我想在Java中使用Neo4J-OGM并获得一个父亲的id。这个父母应该有一个预装儿童的列表

这样的查询案例:

    final Iterable<Parent> parents = session.query(Parent.class, "MATCH (parent:Person) - [:PARENT_OF] -> (child:Person) where id(parent) = {personId} return parent --> child", ImmutableMap.of("personId", 15L));
    System.out.println (parent.get(0));

我希望父对象加载其所有子对象(应该填充List属性)。

我该怎么做呢?我需要使用Cypher。

1 个答案:

答案 0 :(得分:2)

最简单的事情是

import {Component, ViewChild, ContentChild, Host, Inject, forwardRef} from 'angular2/angular2' @Component({ selector: 'a-cmp' /* ... */ }) class A { greet = 'Hello, I\'m A!!!' } @Component({ selector: 'b-cmp' /* ... */ }) class B { greet = 'Hello, I\'m B!!!' } @Component({ selector: 'c-cmp', directives: [A], template: '<a-cmp></a-cmp><ng-content></ng-content><div>c-template</div>' }) class C { @ViewChild(A) a: A; @ContentChild(B) b: B; constructor(@Host() @Inject(forwardRef(() => App)) app: App) { console.log(app.greet); } afterViewInit() { console.log(this.a.greet); } afterContentInit() { console.log(this.b.greet); } } @Component({ selector: 'my-app', directives: [B, C], template: '<c-cmp><b-cmp></b-cmp></c-cmp>' }) export class App { greet = 'Hello, I\'m App!!!' } 默认加载深度为1,因此它将加载子项。如果您愿意,可以自定义此深度。

不确定为什么需要使用Cypher但是如果您愿意,那么接受Person parent = session.load(Person.class, parentId);的{​​{1}}上的loadAll方法应该有效。

以下是https://github.com/neo4j/neo4j-ogm/blob/master/src/test/java/org/neo4j/ogm/domain/tree/Entity.java

的示例

用于测试https://github.com/neo4j/neo4j-ogm/blob/master/src/test/java/org/neo4j/ogm/integration/tree/TreeIntegrationTest.java