2015-08-17 63 views
3

有一個基於neo4j的rails應用程序並且想要實現標籤。不知道如何去做。正在考慮爲具有「標籤」標籤的節點創建新模型,但這似乎有點矯枉過正。對於基於Neo4j的應用程序,有沒有類似https://github.com/mbleigh/acts-as-taggable-on的方法?用Neo4j和Rails實現標籤的最佳做法是什麼?

回答

1

這取決於你想做任何對性能的考慮是什麼;)

創建Tag模型是不是太矯枉過正,尤其是你一定要merge你的標籤,只要你創建它們,以確保你不」 t創建重複。然後,您可以使用Neo4j的圖形遍歷功能從標籤跳轉到其他對象,反之亦然,還可以執行更復雜的查詢,例如根據對象共享/不共享的標籤數量在對象之間進行推薦。

如果你只是想有一個基本的字符串列表,Neo4j實際上支持在節點和關係上有數組屬性。您可以通過簡單地在模型中聲明屬性像這樣使用:

class ModelClass 
    include Neo4j::ActiveNode 

    property :tags 
end 

唯一的問題是,你不能基於陣列的索引(我認爲這對未來的計劃)。所以如果性能是一個大問題而不是僅僅顯示標籤列表,那麼Tag節點可能是您最好的選擇。

此外,爲了在獲得大量標籤的情況下獲得最佳性能,您需要爲標籤名稱/文本/無論您稱之爲屬性編制索引。有幾個方法可以做到這一點:

class Tag 
    include Neo4j::ActiveNode 

    property :name, index: :exact 
end 

或者你可以使用一個Neo4j的約束,以確保沒有任何兩個節點具有相同的名稱:

class Tag 
    include Neo4j::ActiveNode 

    property :name, constraint: :unique 
end 

約束覆蓋性能下自動創建索引。

最後,如果您願意的Tag模型不使用默認uuid列用於唯一標識您的標記,而使用的名稱,你可以這樣做:

class Tag 
    include Neo4j::ActiveNode 

    id_property :name 
end 

這也爲name創建一個約束屬性。

相關問題