2013-08-23 57 views
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) 

其中personDao是一个GraphRepository<Person>

在我的测试中,如果该人尚未拥有同一公司的合同,我可以向该人添加新合同。但是,如果我尝试将新合同添加到具有与现有合同相同的公司结尾节点的人员,它不会被保存。

equals()hashCode()是针对@GraphId实现,我已经证实,所有的对象都在合同Set当我打电话save。我也试过Collection而不是Set无济于事。

任何想法可能是错误的?

+0

我想这是一个愚蠢的http://stackoverflow.com/questions/15002288/cannot-add-more-than-one-relationship-between-nodes-in-neo4j。但就我而言,将它们作为单独的集合是没有意义的,并且规避Spring Data直接使用模板是件怪事。我想我最终会让他们成为节点而不是关系。叹。 –

回答

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

另一种方法

我认识你(我)有什么是超图的情况。 Neo4j仅支持属性图,但有一种方法可以使用Neo4j来表示,如this cookbook中所建议的。

+0

我的情况不是超图。当一条边连接两个以上的顶点时,会发生超边或n元关系。但合同不是两个以上节点之间的边,它们恰好位于两个节点之间,并且应该在SDN和Neo4j的能力中间出现问题。我会尝试使用createRelationShipBetween,看看是否有效。 –

相关问题