簡體   English   中英

如何在Spring Data Neo4j中實現雙向關系?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM