当前位置: 首页 > 知识库问答 >
问题:

Spring Data Neo4j 4.0.0:无法在具有相同标签的节点之间创建关系

戚晨
2023-03-14
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节点,从数据库中再次检索它们,将一个节点映射到另一个节点,然后再次保存它。这样,可以创建关系,但我需要保存两次。

共有1个答案

相威
2023-03-14

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

    @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());成立,因为关系的方向被指定为传出。没有从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());
    }
 类似资料:
  • 我需要在所有具有相同属性值的节点之间创建关系。 例如,我可以使用以下查询: 但是如果我有大约200K的节点,这个脚本运行的时间相当长。 有没有其他更快的方法来建立这样的关系? 谢谢

  • 人员节点: 名字 姓氏 地址 电子邮件 电话号码 公司节点: 姓名 地址 电子邮件 电话号码 关系: 个人-[配偶]- 个人和实体: 当我为简创建一个人时,我也添加了与约翰的兄弟姐妹关系。 运行检索节点Jane和对应的同级节点John。 但是,手足关系应该是双向的。运行仅检索节点John。 这就是问题所在。我可以在约翰和简之间添加另一种兄弟姐妹关系。但是,这实际上在两者之间创建了一个无限循环。以及

  • 我正在创建一个简单的社交图,用户可以在其中创建一个帖子,标记它,并对它进行评论。我用py2neo做模型。该模型具有和作为节点。用户在上、或。在我的例子中,单个用户可以在单个上创建多个或(就像其他任何社交网络一样)。根据我的模型,这需要多个或关系,但具有不同的属性。模型是这样建立的: 我运行以下操作来构建图形: 我希望有两个关系,如下所示: 但我看到事实并非如此: 那么,我的问题是双重的。(1)可以

  • 花了好几天的时间试图弄明白为什么这不起作用。我的模型是

  • 我有以下图表: 我正在寻找一种方法来计算从a发送到b和从b发送到c/d的金额之间的差异,这取决于referenceId,但不使用特定的referenceId。 所以我在寻找像下面这样的半代码: 有人知道我该怎么做吗?

  • 使用cypher和neo4j 2.0。 给定两组节点ID(长度相等)和一组权重,我想在相应的节点之间创建一个关系,并将权重设置为属性。例如,如果我有以下三个列表: 我想创建以下表示形式 但不是,例如 我可以通过迭代我的参数,然后创建单独的查询来实现这一点。有没有一种方法来批量运行它,将我的lsits作为参数传递,并要求按顺序匹配节点和属性? 我曾一度认为以以下方式使用参数会起作用,但它会创建关系的