java jcr_java – 通过JCR实现基于标签的搜索系统的最佳方式,如Modeshape
有幾種方法可以在JCR中實現(xiàn)標記.您選擇哪個選項取決于您自己的應(yīng)用程序的需求.以下是我所知道的四個選項.
選項1:使用Mixins
為每個標記定義一個mixin節(jié)點類型定義,它是一個標記mixin(它沒有屬性定義或子節(jié)點定義),使用NodeTypeManager動態(tài)注冊它們.然后,當(dāng)您想要“標記”節(jié)點時,只需向該節(jié)點添加表示標記的mixin.任何節(jié)點都可以有多個標記,您可以查詢具有特定標記的所有節(jié)點.
(在此響應(yīng)的其余部分中,“acme”用作通用名稱空間.您應(yīng)該將其替換為適合您自己的應(yīng)用程序和組織的名稱空間.)
例如,給定標記“acme:tag1”,您可以使用簡單查詢找到具有此標記的所有節(jié)點:
SELECT * FROM [acme:tag1]
這種方法的缺點是維護標簽很麻煩.創(chuàng)建新標記需要注冊新節(jié)點類型.您不能輕易地重命名標記,而是必須使用新名稱為標記創(chuàng)建mixin;找到mixin代表舊標簽的所有節(jié)點,刪除舊的mixin,然后添加新的mixin;最后刪除舊標記的節(jié)點類型定義(在任何地方不再使用之后).刪除舊標簽以類似的方式完成.另一個缺點是將附加元數(shù)據(jù)(例如,顯示名稱)與標簽相關(guān)聯(lián)并不容易,因為在節(jié)點類型定義上不允許額外的屬性.
這種方法應(yīng)該表現(xiàn)得很好.
選項2:使用分類法和強引用
在此方法中,您將在存儲庫的區(qū)域中創(chuàng)建一個簡單的節(jié)點結(jié)構(gòu),您可以在其中為每個標記創(chuàng)建節(jié)點(例如,分類).在此節(jié)點上,您可以設(shè)置描述標記的屬性(例如,顯示名稱);可以隨時更改這些屬性(例如,重命名標記).
然后,要將標記“應(yīng)用”到節(jié)點,您只需要創(chuàng)建某種與標記的關(guān)系.一種方法是定義一個mixin節(jié)點類型,其中包含REFERENCE類型的“acme:tags”多值屬性.如果要將一個或多個標記應(yīng)用于節(jié)點,只需將mixin添加到節(jié)點,并將“acme:tags”屬性設(shè)置為標記節(jié)點.
要查找特定標記的所有節(jié)點,可以在標記節(jié)點上調(diào)用“getReferences()”以查找包含對標記節(jié)點的引用的所有節(jié)點.
這種方法的好處是必須在一個或多個分類法(包括可能是用戶特定的分類法)內(nèi)控制/管理所有標簽.但是,也有一些缺點.首先,REFERENCE屬性的性能可能不是很好.一些JCR實現(xiàn)完全不鼓勵使用REFERENCES. ModeShape沒有,但是當(dāng)有許多節(jié)點包含對同一節(jié)點的引用時(例如,許多具有單個標記的節(jié)點),ModeShape可能會開始降低REFERENCE性能.
選項3:使用分類法和弱引用
此選項與上面的選項2類似,但“acme:tags”屬性為WEAKREFERENCE而不是REFERENCE.您仍然可以定義和管理一個或多個分類法.要查找具有特定標記的節(jié)點,您不能在標記節(jié)點上使用“getReferences()”方法(因為它們不適用于WEAKREFERENCE屬性),但您可以使用查詢輕松執(zhí)行此操作:
SELECT * FROM [acme:taggable] AS taggable
JOIN [acme:tag] AS tag ON taggable.[acme:tags] = tag.[jcr:uuid]
AND LOCALNAME(tag) = 'tag1'
這種方法確實強制使用一個或多個分類法,使得控制標簽更容易,因為它們必須存在于分類中才能使用.重命名和刪除也更容易.性能方面,這比REFERENCE方法更好,因為WEAKREFERENCE屬性在大量引用時表現(xiàn)更好,無論它們是指向一個節(jié)點還是多個節(jié)點.
缺點是您可以刪除標記,即使它仍在使用,但包含對該刪除標記的WEAKREFERENCE的節(jié)點將不再有效.這可以通過應(yīng)用程序中的某些約定來解決,或者通過簡單地使用分類法上的元數(shù)據(jù)來表示特定標記是“已棄用”且不應(yīng)使用. (IMO,后者實際上是這種方法的一個好處.)
此選項通常比選項2更好地執(zhí)行和擴展.
選項4:使用字符串屬性
另一種方法是簡單地使用STRING屬性來標記每個節(jié)點以及要應(yīng)用的標簽的名稱.例如,您可以定義一個mixin(例如,“acme:taggable”)來定義多值STRING屬性,當(dāng)您想要標記一個節(jié)點時,只需添加mixin(如果尚未存在)并添加名稱標記為“acme:tags”STRING屬性的值(同樣,如果它尚未作為值存在).
這種方法的主要優(yōu)點是它非常簡單:您只是在要標記的節(jié)點上使用字符串值.要查找使用特定標記標記的所有節(jié)點(例如“tag1”),只需發(fā)出查詢:
SELECT *
FROM [acme:taggable] AS taggable
WHERE taggable.[acme:tags] = 'tag1'
標簽管理很簡單:沒有管理.如果要重命名標記,則可以重命名標記值.如果要刪除標記(并從用其標記的節(jié)點中刪除),則可以通過從“acme:tags”屬性中刪除值(可能在后臺作業(yè)中)來完成.
請注意,這允許使用任何標記名稱,因此最適用于根本不控制標記名稱的情況.如果要控制用作標記值的字符串列表,只需在存儲庫中創(chuàng)建分類(如上面的選項2和3中所述),并讓應(yīng)用程序?qū)⒅迪拗茷榉诸愔械闹?您甚至可以擁有多個分類,其中一些可能是特定于用戶的.但是這種方法與選項2或3沒有完全相同的控制.
此選項將比選項3執(zhí)行得更好(因為查詢更簡單),但也會擴展.
總結(jié)
以上是生活随笔為你收集整理的java jcr_java – 通过JCR实现基于标签的搜索系统的最佳方式,如Modeshape的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 达梦数据库(DM)——表空间管理命令大全
- 下一篇: 广州土地市场有所回暖?分析广州房价,看看