Neo4j - 父母 - 儿童heirarchy +春天

时间:2016-03-02 17:06:33

标签: neo4j cypher spring-data-neo4j-4 neo4j-ogm

我们有一个结构,其中父可以有多个具有嵌套结构的子。

1: Parent p1
    child c1
          c1.1       
          c1.2
   child  c2
          c2.1
          c2.3

现在使用一个密码查询,我需要使用Spring + Neo 4j来获取整个结构。

型号:

人:

@Relationship( direction = Relationship.OUTGOING, type = "PARENT")
private Person parent;

@Relationship( direction = Relationship.INCOMING, type = "PARENT")
private List<Person> child;

Cypher查询: -

MATCH (p:Person {name:"john"})<-[pr:PARENT*..2]-(p1:Person) return c1

只给我一个孩子而不是他们的下一个孩子

MATCH (p:Person {name:"john"})<-[pr:PARENT*..2]-(p1:Person) return pr

给我一​​个递归的嵌套结构,没用。

方法: - repository.findOne(personId,2);

我遇到了与扩展子结构时相同的问题,它有一个父对象的引用

例如: -

父p1子c1 - &gt;三个对象

  1: child-p1 --- it would have a reference to Parent Object p1
  2: c1.1 ---  
       child --it would reference to Child C1 since its parent    

  3: c1.2
       child --it would reference to Child C1 since its parent

理想情况下,它不应包含子列表中Parent的任何引用,从而导致堆栈溢出问题。

我正在使用SDN 4.0.release

1 个答案:

答案 0 :(得分:0)

实现此目的的一种方法是使用自定义深度加载实体,如下所示 -

repository.findOne(personId, 2);

其中2是深度。

如果您使用的是SDN 4.0,那么您的Cypher查询在这种情况下不会有太大用处,实体不会从查询结果中映射。

如果您使用SDN 4.1,那么您可以从路径返回所有节点和关系,并且您的域实体将被正确映射。 例如:

MATCH path=(p:Person {name:"john"})<-[pr:PARENT*..2]-(p1:Person) return p as person, nodes(path),rels(path)

如果您使用Neo4jTemplate.query执行此操作,则会收到一个org.neo4j.ogm.model.Result,其中包含此人,并根据您匹配的路径提供关系。