我正在使用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)
其中personDao
是GraphRepository<Person>
。
在我的测试中,如果该人员尚未与同一公司签订合同,我可以向该人员添加新合同。但是,如果我尝试向具有与现有合同相同的公司终端节点的人员添加新合同,则不会保存该合同。
equals()
和hashCode()
是针对@GraphId
实施的,当我致电Set
时,我已确认所有对象都在合同save
中。我也试过Collection
代替Set
无济于事。
知道可能出现什么问题吗?
答案 0 :(得分:1)
建议建立第二种关系的方法如下
注意弹簧数据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中所述。