春季数据Neo4j的4.0.0:不能用相同的标签创建节点之间的关系(Spring Data Neo4

2019-10-23 04:56发布

我使用Spring数据Neo4j的4.0.0与2.2.1的Neo4j,我试图创建具有完全相同的标签,两个节点之间的关系。

所以,我有一个NodeEntity类,我有内部与同类型的类本身的变量,并注释它作为关系。 但是,当我的对象保存到使用库对象的save()方法的数据库,不能创建关系。

预先感谢您和您的建议将非常感激!

编辑

这里是节点实体类

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节点首先,从数据库中再次检索它们,映射另一个人,然后再保存它。 通过这种方式,可以建立关系,但我需要保存两次。

Answer 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());

} 

它通过预期,并且在图中创建的节点似乎显示相同。

需要注意的是assertNull(state2.getArchitectureUnitState()); 因为关系的方向被指定为OUTGOING成立。 有一个从状态2没有传出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的关系。



文章来源: Spring Data Neo4j 4.0.0: Can't Create Relationship Between Nodes with the Same Label