2015-11-01 82 views
1

我想在neo4j中創建一個關係,其中一個人有一個朋友列表。我可以用兩種方式使用彈簧數據來做到這一點。使用Spring-Data在Neo4J中創建關係

a)創建一個具有列表重複列表的人類,並用@Relationship對其進行註釋。

@NodeEntity(label="Person") 
public class Person { 

    @GraphId 
    private Long id; 
    private String firstName; 
    private String lastName; 
    private String email; 
    @Relationship(type = "FRIEND_WITH") 
    List<Person> friends; 
} 

b)無任何列表創建Person對象,並創建 「FRIEND_WITH」 與Cypher支架一樣

@Query "CREATE (a)-[FRIEND_WITH]->(b)" 

的關係,什麼都該方法的優點/ disadvanages?

回答

2

只要有可能,您應該使用代碼管理域模型中的實體和關係,而不是查詢。在代碼中使用它的優點是您的域對象和圖形將保持同步。 SDN使用的底層Object Graph Mapper不理解您的查詢正在執行什麼操作,因此無法爲您的域模型進行任何更改。這意味着每次使用查詢來變更數據庫時,都可能需要重新加載所有對象。

+0

Neo4J支持單向和雙向關係。因此,如果希望玩弄指導,同時保持java類數據結構的固定,那麼必須使用自定義查詢。我感覺,最好從類結構中分離出關係,並在需要時通過密碼來動態創建或刪除它們。我只是想知道你的決定。 – Soumya

+0

嚴格地說,Neo4j支持雙向遍歷:一個關係總是用一個方向來定義,但是你可以從任何一端來遍歷它。 我不確定'玩弄方向'是什麼意思,但SDN 4支持INCOMING,OUTGOING和UNDIRECTED邊緣方向。當兩個節點之間存在語義自反關係時,UNDIRECTED非常有用 - 例如, (人) - [:FRIENDS_WITH] - >(人)。在這裏你不關心方向,你只是想確保兩個朋友在你的域中相互連接。 你覺得被迫使用查詢的用例是什麼? – Vince

+0

假設我有一個人A跟隨着社交網絡中的其他人。所以在Person對象A中有一個「List 」,其中包含他/她所關注的人員列表。這是一個即將離任的關係。爲了得到A所關注的人,我只需要遍歷列表。現在,其他人也可能跟隨A.因此,要獲得所有那些跟隨A的人,我需要寫一個自定義查詢,因爲之前的列表只會給我A以下的人 – Soumya

0

我添加了第二個答案,因爲我無法在註釋中格式化代碼,但類似這樣的東西可以開箱即用,並且不需要任何查詢。

public class Person { 

    private Long id; 
    private String name; 

    @Relationship(type="FOLLOWS", direction = "OUTGOING") 
    private Set<Person> followees = new HashSet<>(); 

    @Relationship(type="FOLLOWS", direction = "INCOMING") 
    private Set<Person> followers = new HashSet<>(); 

    public void follow(Person p) { 
     this.followees.add(p); 
     p.followers.add(this); 
    } 

    public void unfollow(Person p) { 
     this.followees.remove(p); 
     p.followers.remove(this); 
    } 
} 
+0

Vince,我很感謝您幫幫我。這並不是說我故意不同意你的觀點,但我真的想學習如何處理Neo4J。在上面的例子中,每當有「追隨」關係時,我必須更新兩個對象,Person對象代表「Follower」,而另一個代表「Followee」,因爲他們都是追隨者名單或追隨者名單將改變。同樣,它也會發生在取消關注的情況下。而如果我們通過密碼創建關係,則不需要更新對象,也不需要維護兩個列表。 – Soumya

+0

Souma,您問了一個關於使用Cypher查詢來改變SDN 4/OGM環境中的圖形的優缺點的問題,我回答說,給出了準確的答案以及原因。然後,你在隨後的評論中又提出了另一個具體問題,我給了第二個答覆,這也是準確的。我不知道我還能做些什麼來幫助這裏,也許閱讀SDN文檔可以幫助您決定使用OGM是否真的是您想要做的。 http://docs.spring.io/spring-data/neo4j/docs/current/reference/html/ – Vince