Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 弹簧数据Neo4j 4.0.0:Can';t在具有相同标签的节点之间创建关系_Java_Neo4j_Nodes_Relationship_Spring Data Neo4j 4 - Fatal编程技术网

Java 弹簧数据Neo4j 4.0.0:Can';t在具有相同标签的节点之间创建关系

Java 弹簧数据Neo4j 4.0.0:Can';t在具有相同标签的节点之间创建关系,java,neo4j,nodes,relationship,spring-data-neo4j-4,Java,Neo4j,Nodes,Relationship,Spring Data Neo4j 4,我将Spring数据Neo4j 4.0.0与Neo4j 2.2.1一起使用,并尝试在具有完全相同标签的两个节点之间创建关系 所以,我有一个NodeEntity类,里面有一个与类本身类型相同的变量,并将其注释为Relationship。 但是,当我使用repository对象的save()方法将对象保存到数据库时,无法创建关系 提前感谢您,我们将非常感谢您的建议 编辑 下面是节点实体类 public class ArchitectureUnitState extends UnitState {

我将Spring数据Neo4j 4.0.0与Neo4j 2.2.1一起使用,并尝试在具有完全相同标签的两个节点之间创建关系

所以,我有一个NodeEntity类,里面有一个与类本身类型相同的变量,并将其注释为Relationship。 但是,当我使用repository对象的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;
    }
}
因此,顺序是:我创建了ArchitectureUnitState对象,相互映射,然后使用ArchitectureUnitStateRepository的save()方法保存

如果我这样做,则不会创建关系的部分,尽管我在调试中看到值在那里


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

这是我使用上述类的测试用例

    @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())
保持为true,因为关系的方向被指定为传出。state2中没有关系的传出部分,因此不会加载任何部分

如果我把测试改为

@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());
    }
然后我们在两个方向上都有一个关系,现在state2与state1有一个关系。

我们对这样的类进行了测试:@NodeEntity(label=“a”)公共静态类a扩展了E{@Relationship(type=“EDGE”,direction=Relationship.INCOMING)a;}请发布您的实体类和代码,以便我们提供帮助you@Luanne我已经编辑了我的帖子。谢谢