2013-04-25 111 views
1

我正在用neo4j開發一種社交網絡,並且我想讓我的Node對象更符合我自己的需求。它是否考慮包裝neo4j Node對象或從中繼承對象? 當使用內置Lucene引擎對節點對象進行索引時,出現了包裝方法的問題。例如,如果我將「Profile」類(使用「addFriend」,「setFirstName」等方法)包裝我的Node對象,我將獲得什麼收益,但另一方面,只要我將運行對我的索引查詢我會回到原始Node對象,而不是我包裝的對象?我可以通過在我的節點屬性中保存對包裝對象的引用來爲這種情況制定一些骯髒的解決方案,但對於我來說這樣做看起來很奇怪。 在這種情況下,你會推薦做什麼,以獲得乾淨和設計良好的代碼?Neo4j - 包裝/繼承節點對象

謝謝。

回答

3

我發現包裝節點不會導致非常可維護的代碼/設計。正如你所提到的,你需要關心的一件事是不返回一個節點,而是將它轉換爲你的域對象。

如果你的對象主要是getX方法,那麼你可以執行Cypher查詢,組成你的域對象並返回它們。在這種情況下,甚至不需要包裝節點 - 您只需要一些可用於查找節點的屬性。

如果你有setX方法,那麼你可以通過Cypher語句更新Node,或者通過更新所有屬性或每個setX的保存(不是很好,因爲你會經常更新setX方法現在意味着持久性) 。這兩種方法中的任何一種都不需要包裝節點。

我在之前的項目中嘗試過包裝節點,但發現它導致更多的麻煩和一般的臭味設計。現在我使用純粹的域POJOS,只在持久層保持Neo4j代碼,這對我來說更好。你沒有提到你正在使用哪種語言 - 如果是Java,那麼我認爲Spring Data可以處理很多樣板代碼。

1

將您的搜索代碼放入它們所屬的類中。

如果你需要得到,我不知道,像Post類中的getFriends之類的東西,你將創建方法從PostPosts到Person類中,並將getFriends方法創建爲Post。

從文章中,您將從Person類調用查詢,執行查詢並返回映射到Person類的節點的Array/List。

所以你getFriends方法進入郵政類將是這樣的:

Person.fromPosts(個體經營).results.map {|節點| Person.new(node)}

這樣做很簡單,只需使用Person.new(或新的Person,取決於您使用哪種語言)執行結果映射並將節點傳遞給Person 。這意味着你必須有一個從節點填充對象的新方法。

+0

我不明白它如何解決我的設計問題...我的查詢結果仍然是Node的類型,這給我沒有額外的信息。如果我有不同類型的節點呢?我想能夠索引我的包裝類,而不是底層的節點類型。 – gipouf 2013-04-25 19:57:15

+0

你的意思是你想要做一個查詢,從不同的類返回不同的對象? – cintamani 2013-04-25 21:12:57

+0

是的。我看到Index類是通用的,主要用作索引。包裝/繼承節點類是否被認爲是很好的做法,並將其用作Index類的通用參數? – gipouf 2013-04-25 21:19:47

1

Spring Data Neo4j是您需要的最終解決方案,它將帶註釋的實體類映射到具有高級映射功能的Neo4j,並提供對不同抽象級別的節點和關係的訪問。