0

我正在使用 Spring Data Neo4j 2.2.2,并且在使用相同的开始和结束节点保持多个关系时遇到问题。

假设一个人可以与一个公司有多个合同。我将此建模为

@NodeEntity
public class Company {...}

@NodeEntity
public class Person {

    @RelatedToVia 
    private Set<Contract> contracts;
    ...
}

@RelationshipEntity
public class Contract {

    @StartNode
    private Person person;

    @EndNode
    private Company company;
    ...
}

要将合同添加到一个人,我正在编写类似的代码

Contract contract = new Contract();
contract.setPerson(person);
contract.setCompany(company);
// set other contract properties
person.getContracts().add(contract);
personDao.save(person)

哪里personDaoGraphRepository<Person>

在我的测试中,如果该人还没有同一公司的合同,我可以向该人添加新合同。但是,如果我尝试将新合同添加到与现有合同具有相同公司端节点的人员,则不会保存。

equals()并且hashCode()是针对 实现的@GraphId,并且Set当我调用save. 我也尝试过Collection而不是Set无济于事。

知道有什么问题吗?

4

1 回答 1

1

创建第二个关系的建议方法如下

来自参考手册

注意 Spring Data Neo4j 默认确保在任何两个给定实体之间只有一个给定类型的关系。这可以通过在存储库或实体上使用带有 allowDuplicates 参数的 createRelationshipBetween() 方法来规避。

Contract createContractRelation(Company c, Person p)
{
    //last argument "true" indicates that a duplicate relationship should be created
    Contract contract = template.createRelationshipBetween(c, p, Contract.class, "Contract", true);

    contract.setPerson(person);
    contract.setCompany(company);

    template.save(contract);

    return contract;
}

然而,我最多只能创建 2 个关系。超过两个不起作用。我在这里有一个悬而未决的问题:无法在两个节点之间创建超过 2 个相同的关系

另一种方法

我意识到你(和我)所拥有的是 Hypergraph 的情况。Neo4j 仅支持属性图,但有一种方法可以使用 Neo4j 来表示这一点,如本食谱中所建议的那样。

于 2013-08-23T13:38:42.400 回答