2013-08-23 129 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,看看是否有效。 –

相關問題