[英]How to implement a bidirectional relationship in Spring Data Neo4j?
我正在使用Spring Data Neo4j建模一個非常簡單的用例:我希望擁有通過友誼關系連接的人員。 這是我的代碼(這里省略了getter和setter):
@NodeEntity
public class Person {
@GraphId
private Long id;
private String name;
private String password;
@RelatedTo(type = "FRIEND_OF", direction = Direction.BOTH)
private Set<Person> friends = new HashSet<Person>();
public Person() {};
public Person(String name, String password) {
this.name = name;
this.password = password;
}
public void befriend(Person person) {
this.friends.add(person);
}
最后,我使用以下方法來使用我的人:
@Transactional
private void populateTwoPersons() {
Person person1 = new Person("Alice", "pw1");
Person person2 = new Person("Bob", "pw2");
List<Person> persons = Arrays.asList(person1, person2);
personRepository.save(persons);
person1.befriend(person2);
personRepository.save(persons);
}
根據我的理解,友誼關系應該是雙向的,這就是我將其方向設置為(direction = Direction.BOTH)的原因。 現在,當執行populateTwoPersons()方法時,它會導致創建兩個人節點,但不會在它們之間的邊緣中創建。
我嘗試過的想法正在改變befriend() - 函數
public void befriend(Person person) {
this.friends.add(person);
person.getFriends().add(this);
}
或者將關系的方向設置為direction = Direction.OUTGOING。 然而,這會產生一個有針對性的邊緣 ,這不是我想要的。
為什么我不能在第一種情況下獲得優勢呢? 有任何想法嗎? :)
提前謝謝,Manu
必須指向所有Neo4j邊緣,它們不能是雙向的。 您可以單向創建友誼並在沒有方向的情況下查詢它。 或者您可以在兩個朋友之間創建兩個單獨的邊。 我認為后者更靈活,因為一個人可能認為另一個人是朋友但反之亦然。
如果您不關心方向,則可以指定direction=Relationship.UNDIRECTED
,這將保證兩個節點實體之間的路徑可從任一側導航。
例如,考慮兩家公司之間的PARTNER_OF
關系,其中
(A)-[:PARTNER_OF]→(B) implies (B)-[:PARTNER_OF]→(A)
關系的方向無關緊要; 只有這兩家公司之間存在PARTNER_OF
關系的事實才是重要的。 因此, UNDIRECTED
關系是正確的選擇,確保兩個伙伴之間只有這種類型的關系,並且可以從任一實體在它們之間進行導航。
來源:良好的關系: Spring Data Neo4j指南 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.