节点是否可以包含与同一端节点的关系集合?

时间:2013-08-23 13:14:31

标签: neo4j spring-data-neo4j

我正在使用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无济于事。

知道可能出现什么问题吗?

1 个答案:

答案 0 :(得分:1)

建议建立第二种关系的方法如下

来自reference manual

  

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

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个关系。超过两个不起作用。我在这里有一个未解决的问题:unable to create more than 2 same relations between two nodes

另一种方法

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