2015-05-23 44 views
1

我正在使用Spring Data Neo4j 4.0.0与Neo4j 2.2.1,我试图创建两个节点之间的关系完全相同的标签。Spring Data Neo4j 4.0.0:无法创建具有相同标签的节点之间的关系

所以,我有一个NodeEntity类,我有一个与类本身类型相同的变量,并将其注释为关系。 但是,当我使用存储库对象的save()方法将对象保存到数据库时,无法创建关系。

先谢谢您,您的建议将非常感谢!

EDIT

这里是节点实体类

public class ArchitectureUnitState extends UnitState { 

    public ArchitectureUnitState() 
    { 
     super(); 
    } 

    public ArchitectureUnitState(String name, String description, String parentArchitectureUnitName) 
    { 
     super(name, description); 
     this.parentArchitectureUnitName = parentArchitectureUnitName; 
    } 

    @Relationship(type="PART_OF", direction = Relationship.OUTGOING) 
    private ArchitectureUnitState architectureUnitState; 

    @Relationship(type="STATE_OF", direction = Relationship.OUTGOING) 
    private ArchitectureUnit architectureUnit; 

    @Transient 
    private String parentArchitectureUnitName; 

    public void partOf(ArchitectureUnitState architectureUnitState) { 
     this.architectureUnitState = architectureUnitState; 
    } 

    public void stateOf(ArchitectureUnit architectureUnit) { 
     this.architectureUnit = architectureUnit; 
    } 

    public void childOf(String parentArchitectureUnitName) { 
     this.parentArchitectureUnitName = parentArchitectureUnitName; 
    } 

    public String getParentName() { 
     return parentArchitectureUnitName; 
    } 
} 

@NodeEntity 
public class UnitState { 
    @GraphId 
    protected Long id; 

    private String name; 
    private String description; 

    public UnitState() { 

    } 

    public UnitState(String name, String description) { 
     this.name = name; 
     this.description = description; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getDescription() { 
     return description; 
    } 
} 

因此,该序列为:I创建的ArchitectureUnitState目的,映射一个到另一个,然后保存与ArchitectureUnitStateRepository的保存()方法。

如果我这样做,不会创建PART_OF关系,尽管我在调试中看到这些值在那里。

我现在的解决方法是先保存所有ArchitectureUnitState节点,再从数据库中检索它们,将一个映射到另一个,然后再保存一次。这样,可以创建关系,但我需要保存两次。

+0

我们有这样一类测试:@NodeEntity(标记= “A”) \t公共静态类A延伸E { \t \t @Relationship(类型= “EDGE”,方向= Relationship.INCOMING ) \t \t A a; \t} 请发布您的实体课程和代码,以便我们可以帮助您 – Luanne

+0

@Luanne我编辑了我的帖子。谢谢! –

回答

1

这是我的测试用例,使用上面的类。

@Test 
     public void testArchitectureState() { 
      ArchitectureUnitState state1 = new ArchitectureUnitState("one","desc one","root"); 
      ArchitectureUnitState state2 = new ArchitectureUnitState("two","desc two","root"); 
      ArchitectureUnit unit1 = new ArchitectureUnit("unit1"); 
      ArchitectureUnit unit2 = new ArchitectureUnit("unit2"); 
      state1.partOf(state2); 
      state1.stateOf(unit1); 
      state2.stateOf(unit2); 
      architectureUnitStateRepository.save(state1); 

      state1 = architectureUnitStateRepository.findByName("one"); 
      assertEquals("two", state1.getArchitectureUnitState().getName()); 
      assertEquals("unit1", state1.getArchitectureUnit().getName()); 

      state2 = architectureUnitStateRepository.findByName("two"); 
      assertNull(state2.getArchitectureUnitState()); 
      assertEquals("unit2", state2.getArchitectureUnit().getName()); 

} 

它按预期方式通过,并且图中创建的节点看起来表示相同。 Relationship one way

请注意,assertNull(state2.getArchitectureUnitState());成立,因为关系的方向被指定为OUTGOING。 state2没有传出的PART_OF关系,所以没有加载。

如果我改变测试

@Test 
    public void testArchitectureBothWays() { 
     ArchitectureUnitState state1 = new ArchitectureUnitState("one","desc one","root"); 
     ArchitectureUnitState state2 = new ArchitectureUnitState("two","desc two","root"); 
     ArchitectureUnit unit1 = new ArchitectureUnit("unit1"); 
     ArchitectureUnit unit2 = new ArchitectureUnit("unit2"); 
     state1.partOf(state2); 
     state2.partOf(state1); 
     state1.stateOf(unit1); 
     state2.stateOf(unit2); 
     architectureUnitStateRepository.save(state1); 

     state1 = architectureUnitStateRepository.findByName("one"); 
     assertEquals("two", state1.getArchitectureUnitState().getName()); 
     assertEquals("unit1", state1.getArchitectureUnit().getName()); 


     state2 = architectureUnitStateRepository.findByName("two"); 
     assertEquals("one",state2.getArchitectureUnitState().getName()); 
     assertEquals("unit2", state2.getArchitectureUnit().getName()); 
    } 

那么我们在两个方向上的关系,现在状态2具有状态1的关系。 enter image description here

相关问题